{"version": "2.1.0", "$schema": "https://json.schemastore.org/sarif-2.1.0.json", "runs": [{"tool": {"driver": {"name": "Repobility", "informationUri": "https://repobility.com", "rules": [{"id": "scanner-fcda2b9b08f514dd", "name": "Possibly dead Python function: current_user", "shortDescription": {"text": "Possibly dead Python function: current_user"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-10a2277383c57cb2", "name": "Possibly dead Python function: dep", "shortDescription": {"text": "Possibly dead Python function: dep"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1f66ad88286ca30a", "name": "Dockerfile runs as root: backend/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: backend/Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8cd20d539467d2c5", "name": "Docker base image is tag-pinned but not digest-pinned: python:3.11-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.11-slim"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7eec9342fe9c480c", "name": "Insecure pattern 'local_storage_auth_token' in frontend/src/api.ts:33", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/src/api.ts:33"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "1 test file(s) for 33 source file(s) (ratio 0.03). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 8 console/debugger/print-style debug statements in non-test source. This is a common fast-generation residue before production cleanup."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-319e66a630e14977", "name": "2 env vars used in code but missing from .env.example", "shortDescription": {"text": "2 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `CLOUDINARY_URL`, `VITE_API_URL`. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nbackend/server.py:list_captures, backend/server.py:production\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bb5567d7790a4e0d", "name": "Frontend route `/node/:nodeId/*` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/node/:nodeId/*` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4f4d6bb3d6f77989", "name": "Frontend route `/recon` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/recon` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7cac8a06a730a35b", "name": "Frontend route `/admin` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/admin` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4756b4c4da7d2088", "name": "Unused endpoint: GET /api/health", "shortDescription": {"text": "Unused endpoint: GET /api/health"}, "fullDescription": {"text": "`backend/server.py` declares `GET /api/health` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fd55aa0818a7c897", "name": "Unused endpoint: POST /api/auth/login", "shortDescription": {"text": "Unused endpoint: POST /api/auth/login"}, "fullDescription": {"text": "`backend/server.py` declares `POST /api/auth/login` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ee4aa5ddab88c9dc", "name": "Unused endpoint: GET /api/auth/me", "shortDescription": {"text": "Unused endpoint: GET /api/auth/me"}, "fullDescription": {"text": "`backend/server.py` declares `GET /api/auth/me` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b69c7669ca001bc0", "name": "Unused endpoint: GET /api/nodes", "shortDescription": {"text": "Unused endpoint: GET /api/nodes"}, "fullDescription": {"text": "`backend/server.py` declares `GET /api/nodes` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0a5cffb3d08fc11e", "name": "Unused endpoint: POST /api/nodes", "shortDescription": {"text": "Unused endpoint: POST /api/nodes"}, "fullDescription": {"text": "`backend/server.py` declares `POST /api/nodes` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1d896ebdbdb83aa6", "name": "Unused endpoint: PUT /api/nodes/{node_id}", "shortDescription": {"text": "Unused endpoint: PUT /api/nodes/{node_id}"}, "fullDescription": {"text": "`backend/server.py` declares `PUT /api/nodes/{node_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3b54d931c6df1bb9", "name": "Unused endpoint: GET /api/nodes/{node_id}/config", "shortDescription": {"text": "Unused endpoint: GET /api/nodes/{node_id}/config"}, "fullDescription": {"text": "`backend/server.py` declares `GET /api/nodes/{node_id}/config` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f21988313f9eb6d2", "name": "Unused endpoint: PUT /api/nodes/{node_id}/config", "shortDescription": {"text": "Unused endpoint: PUT /api/nodes/{node_id}/config"}, "fullDescription": {"text": "`backend/server.py` declares `PUT /api/nodes/{node_id}/config` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3a3c45156489b020", "name": "Unused endpoint: GET /api/users", "shortDescription": {"text": "Unused endpoint: GET /api/users"}, "fullDescription": {"text": "`backend/server.py` declares `GET /api/users` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-49546f6900fb04c5", "name": "Unused endpoint: POST /api/users", "shortDescription": {"text": "Unused endpoint: POST /api/users"}, "fullDescription": {"text": "`backend/server.py` declares `POST /api/users` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-eca1f083377522d6", "name": "Unused endpoint: PUT /api/users/{email}", "shortDescription": {"text": "Unused endpoint: PUT /api/users/{email}"}, "fullDescription": {"text": "`backend/server.py` declares `PUT /api/users/{email}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-550617a6320721bf", "name": "Unused endpoint: DELETE /api/users/{email}", "shortDescription": {"text": "Unused endpoint: DELETE /api/users/{email}"}, "fullDescription": {"text": "`backend/server.py` declares `DELETE /api/users/{email}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-23ed37ca3cef9ed6", "name": "Unused endpoint: GET /api/nodes/{node_id}/capture-sheet.pdf", "shortDescription": {"text": "Unused endpoint: GET /api/nodes/{node_id}/capture-sheet.pdf"}, "fullDescription": {"text": "`backend/server.py` declares `GET /api/nodes/{node_id}/capture-sheet.pdf` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f33dcc0b0723a623", "name": "Unused endpoint: POST /api/nodes/{node_id}/captures", "shortDescription": {"text": "Unused endpoint: POST /api/nodes/{node_id}/captures"}, "fullDescription": {"text": "`backend/server.py` declares `POST /api/nodes/{node_id}/captures` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-36fb248f6fab9d07", "name": "Unused endpoint: POST /api/captures/{capture_id}/photo", "shortDescription": {"text": "Unused endpoint: POST /api/captures/{capture_id}/photo"}, "fullDescription": {"text": "`backend/server.py` declares `POST /api/captures/{capture_id}/photo` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-84bf0f96064d9a35", "name": "Unused endpoint: GET /api/captures/{capture_id}/photo", "shortDescription": {"text": "Unused endpoint: GET /api/captures/{capture_id}/photo"}, "fullDescription": {"text": "`backend/server.py` declares `GET /api/captures/{capture_id}/photo` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-dc3e27c3cc1707c7", "name": "Unused endpoint: POST /api/captures/{capture_id}/entries", "shortDescription": {"text": "Unused endpoint: POST /api/captures/{capture_id}/entries"}, "fullDescription": {"text": "`backend/server.py` declares `POST /api/captures/{capture_id}/entries` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1fecfe63e03cb59b", "name": "Unused endpoint: GET /api/nodes/{node_id}/captures", "shortDescription": {"text": "Unused endpoint: GET /api/nodes/{node_id}/captures"}, "fullDescription": {"text": "`backend/server.py` declares `GET /api/nodes/{node_id}/captures` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9f9a9cef0b16a046", "name": "Unused endpoint: GET /api/nodes/{node_id}/powder", "shortDescription": {"text": "Unused endpoint: GET /api/nodes/{node_id}/powder"}, "fullDescription": {"text": "`backend/server.py` declares `GET /api/nodes/{node_id}/powder` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7e5809f25d5d4363", "name": "Unused endpoint: POST /api/nodes/{node_id}/powder/adjustment", "shortDescription": {"text": "Unused endpoint: POST /api/nodes/{node_id}/powder/adjustment"}, "fullDescription": {"text": "`backend/server.py` declares `POST /api/nodes/{node_id}/powder/adjustment` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ae3d199a0d722c68", "name": "Unused endpoint: GET /api/nodes/{node_id}/fittings", "shortDescription": {"text": "Unused endpoint: GET /api/nodes/{node_id}/fittings"}, "fullDescription": {"text": "`backend/server.py` declares `GET /api/nodes/{node_id}/fittings` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b655c6285f764e61", "name": "Unused endpoint: POST /api/nodes/{node_id}/fittings/adjustment", "shortDescription": {"text": "Unused endpoint: POST /api/nodes/{node_id}/fittings/adjustment"}, "fullDescription": {"text": "`backend/server.py` declares `POST /api/nodes/{node_id}/fittings/adjustment` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b836307fa324d735", "name": "Unused endpoint: GET /api/nodes/{node_id}/production", "shortDescription": {"text": "Unused endpoint: GET /api/nodes/{node_id}/production"}, "fullDescription": {"text": "`backend/server.py` declares `GET /api/nodes/{node_id}/production` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e759ef89ac7928b2", "name": "Unused endpoint: GET /api/nodes/{node_id}/finished-goods", "shortDescription": {"text": "Unused endpoint: GET /api/nodes/{node_id}/finished-goods"}, "fullDescription": {"text": "`backend/server.py` declares `GET /api/nodes/{node_id}/finished-goods` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-42b20a978896afdd", "name": "Unused endpoint: POST /api/nodes/{node_id}/finished-goods/adjustment", "shortDescription": {"text": "Unused endpoint: POST /api/nodes/{node_id}/finished-goods/adjustment"}, "fullDescription": {"text": "`backend/server.py` declares `POST /api/nodes/{node_id}/finished-goods/adjustment` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d1a8f8243581a51c", "name": "Unused endpoint: GET /api/nodes/{node_id}/scrap", "shortDescription": {"text": "Unused endpoint: GET /api/nodes/{node_id}/scrap"}, "fullDescription": {"text": "`backend/server.py` declares `GET /api/nodes/{node_id}/scrap` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-29e72b6bbbcbebd4", "name": "Unused endpoint: POST /api/nodes/{node_id}/delivery-notes", "shortDescription": {"text": "Unused endpoint: POST /api/nodes/{node_id}/delivery-notes"}, "fullDescription": {"text": "`backend/server.py` declares `POST /api/nodes/{node_id}/delivery-notes` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e328aaaf19795708", "name": "Unused endpoint: GET /api/nodes/{node_id}/delivery-notes", "shortDescription": {"text": "Unused endpoint: GET /api/nodes/{node_id}/delivery-notes"}, "fullDescription": {"text": "`backend/server.py` declares `GET /api/nodes/{node_id}/delivery-notes` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e24c76d18dd75643", "name": "Unused endpoint: GET /api/delivery-notes/{dn_id}/pdf", "shortDescription": {"text": "Unused endpoint: GET /api/delivery-notes/{dn_id}/pdf"}, "fullDescription": {"text": "`backend/server.py` declares `GET /api/delivery-notes/{dn_id}/pdf` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-834043938dd7f269", "name": "Unused endpoint: POST /api/nodes/{node_id}/invoices", "shortDescription": {"text": "Unused endpoint: POST /api/nodes/{node_id}/invoices"}, "fullDescription": {"text": "`backend/server.py` declares `POST /api/nodes/{node_id}/invoices` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5b300658993bf949", "name": "Unused endpoint: GET /api/nodes/{node_id}/invoices", "shortDescription": {"text": "Unused endpoint: GET /api/nodes/{node_id}/invoices"}, "fullDescription": {"text": "`backend/server.py` declares `GET /api/nodes/{node_id}/invoices` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6a99b900cf0fc6db", "name": "Unused endpoint: GET /api/invoices/{inv_id}/pdf", "shortDescription": {"text": "Unused endpoint: GET /api/invoices/{inv_id}/pdf"}, "fullDescription": {"text": "`backend/server.py` declares `GET /api/invoices/{inv_id}/pdf` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-93e35b1c35690c23", "name": "Unused endpoint: POST /api/nodes/{node_id}/payments", "shortDescription": {"text": "Unused endpoint: POST /api/nodes/{node_id}/payments"}, "fullDescription": {"text": "`backend/server.py` declares `POST /api/nodes/{node_id}/payments` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7b0738ff1d0910a7", "name": "Unused endpoint: POST /api/payments/{payment_id}/match", "shortDescription": {"text": "Unused endpoint: POST /api/payments/{payment_id}/match"}, "fullDescription": {"text": "`backend/server.py` declares `POST /api/payments/{payment_id}/match` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ffed7ee88a7722f9", "name": "Unused endpoint: GET /api/nodes/{node_id}/payments", "shortDescription": {"text": "Unused endpoint: GET /api/nodes/{node_id}/payments"}, "fullDescription": {"text": "`backend/server.py` declares `GET /api/nodes/{node_id}/payments` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1a6980b61bac02a6", "name": "Unused endpoint: GET /api/nodes/{node_id}/flags", "shortDescription": {"text": "Unused endpoint: GET /api/nodes/{node_id}/flags"}, "fullDescription": {"text": "`backend/server.py` declares `GET /api/nodes/{node_id}/flags` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bb51ce0d844ca66d", "name": "Unused endpoint: POST /api/flags/{flag_id}/resolve", "shortDescription": {"text": "Unused endpoint: POST /api/flags/{flag_id}/resolve"}, "fullDescription": {"text": "`backend/server.py` declares `POST /api/flags/{flag_id}/resolve` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6bed5767a7ae2062", "name": "Unused endpoint: POST /api/nodes/{node_id}/counts", "shortDescription": {"text": "Unused endpoint: POST /api/nodes/{node_id}/counts"}, "fullDescription": {"text": "`backend/server.py` declares `POST /api/nodes/{node_id}/counts` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e3a56ae7b250c6e1", "name": "Unused endpoint: GET /api/nodes/{node_id}/counts", "shortDescription": {"text": "Unused endpoint: GET /api/nodes/{node_id}/counts"}, "fullDescription": {"text": "`backend/server.py` declares `GET /api/nodes/{node_id}/counts` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1b92790cafb96c7e", "name": "Unused endpoint: POST /api/nodes/{node_id}/recon/sweep", "shortDescription": {"text": "Unused endpoint: POST /api/nodes/{node_id}/recon/sweep"}, "fullDescription": {"text": "`backend/server.py` declares `POST /api/nodes/{node_id}/recon/sweep` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c12b309a0339ea0", "name": "Unused endpoint: GET /api/nodes/{node_id}/recon", "shortDescription": {"text": "Unused endpoint: GET /api/nodes/{node_id}/recon"}, "fullDescription": {"text": "`backend/server.py` declares `GET /api/nodes/{node_id}/recon` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0aa88ee52cd05a5c", "name": "Unused endpoint: GET /api/nodes/{node_id}/reports/daily", "shortDescription": {"text": "Unused endpoint: GET /api/nodes/{node_id}/reports/daily"}, "fullDescription": {"text": "`backend/server.py` declares `GET /api/nodes/{node_id}/reports/daily` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cae904467b1827dc", "name": "Unused endpoint: GET /api/nodes/{node_id}/reports/monthly", "shortDescription": {"text": "Unused endpoint: GET /api/nodes/{node_id}/reports/monthly"}, "fullDescription": {"text": "`backend/server.py` declares `GET /api/nodes/{node_id}/reports/monthly` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a55996996074d9c0", "name": "Unused endpoint: GET /api/network/kg", "shortDescription": {"text": "Unused endpoint: GET /api/network/kg"}, "fullDescription": {"text": "`backend/server.py` declares `GET /api/network/kg` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-47ccee89ee9e3ee4", "name": "Unused endpoint: GET /api/audit", "shortDescription": {"text": "Unused endpoint: GET /api/audit"}, "fullDescription": {"text": "`backend/server.py` declares `GET /api/audit` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4cbbbed74ba7d080", "name": "Unused endpoint: GET /api/nodes/gogreen/config", "shortDescription": {"text": "Unused endpoint: GET /api/nodes/gogreen/config"}, "fullDescription": {"text": "`frontend/src/pages/Admin.tsx` declares `GET /api/nodes/gogreen/config` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-98dfb043b6ff0f61", "name": "Unused endpoint: PUT /api/nodes/gogreen/config", "shortDescription": {"text": "Unused endpoint: PUT /api/nodes/gogreen/config"}, "fullDescription": {"text": "`frontend/src/pages/Admin.tsx` declares `PUT /api/nodes/gogreen/config` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/22651"}, "properties": {"repository": "wernerdut/vezubunye", "repoUrl": "https://github.com/wernerdut/vezubunye", "branch": "main"}, "results": [{"ruleId": "scanner-fcda2b9b08f514dd", "level": "note", "message": {"text": "Possibly dead Python function: current_user"}, "properties": {"repobilityId": "271089411e6e6afb", "scanner": "scanner-primary", "fingerprint": "fcda2b9b08f514dd", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/auth.py:56"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-10a2277383c57cb2", "level": "note", "message": {"text": "Possibly dead Python function: dep"}, "properties": {"repobilityId": "97535eb9200fecfe", "scanner": "scanner-primary", "fingerprint": "10a2277383c57cb2", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/auth.py:77"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1f66ad88286ca30a", "level": "warning", "message": {"text": "Dockerfile runs as root: backend/Dockerfile"}, "properties": {"repobilityId": "7afd2b0e8a8c9eeb", "scanner": "scanner-primary", "fingerprint": "1f66ad88286ca30a", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-8cd20d539467d2c5", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.11-slim"}, "properties": {"repobilityId": "06b87ac9439092d6", "scanner": "scanner-primary", "fingerprint": "8cd20d539467d2c5", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"ruleId": "scanner-7eec9342fe9c480c", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/src/api.ts:33"}, "properties": {"repobilityId": "6e88159a0f57b9c8", "scanner": "scanner-primary", "fingerprint": "7eec9342fe9c480c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/api.ts"}, "region": {"startLine": 33}}}]}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "0637cbda74787d46", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "c4bcb0dbcb664079", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "aab72a3b589df3d8", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "1402e495bca465c3", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "5acbde5e19a4bb72", "scanner": "scanner-primary", "fingerprint": "ea8f3013f588db25", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-8424db9c75e04ba4", "level": "none", "message": {"text": "Very short observed git history"}, "properties": {"repobilityId": "bd1b178d9d286496", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-319e66a630e14977", "level": "none", "message": {"text": "2 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "d838d1fc5d8231c9", "scanner": "scanner-primary", "fingerprint": "319e66a630e14977", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "8a70ff2150f8dc8b", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-bb5567d7790a4e0d", "level": "warning", "message": {"text": "Frontend route `/node/:nodeId/*` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "35584565f540d828", "scanner": "scanner-primary", "fingerprint": "bb5567d7790a4e0d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-4f4d6bb3d6f77989", "level": "warning", "message": {"text": "Frontend route `/recon` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "def89e0a52b00afa", "scanner": "scanner-primary", "fingerprint": "4f4d6bb3d6f77989", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-7cac8a06a730a35b", "level": "warning", "message": {"text": "Frontend route `/admin` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "518bbd33606ca41a", "scanner": "scanner-primary", "fingerprint": "7cac8a06a730a35b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-4756b4c4da7d2088", "level": "note", "message": {"text": "Unused endpoint: GET /api/health"}, "properties": {"repobilityId": "5a66da359de337dc", "scanner": "scanner-primary", "fingerprint": "4756b4c4da7d2088", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fd55aa0818a7c897", "level": "note", "message": {"text": "Unused endpoint: POST /api/auth/login"}, "properties": {"repobilityId": "69e2a97a9e05e44f", "scanner": "scanner-primary", "fingerprint": "fd55aa0818a7c897", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ee4aa5ddab88c9dc", "level": "note", "message": {"text": "Unused endpoint: GET /api/auth/me"}, "properties": {"repobilityId": "ced03cb5942ff3f4", "scanner": "scanner-primary", "fingerprint": "ee4aa5ddab88c9dc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b69c7669ca001bc0", "level": "note", "message": {"text": "Unused endpoint: GET /api/nodes"}, "properties": {"repobilityId": "70a387dc98a64ffb", "scanner": "scanner-primary", "fingerprint": "b69c7669ca001bc0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0a5cffb3d08fc11e", "level": "note", "message": {"text": "Unused endpoint: POST /api/nodes"}, "properties": {"repobilityId": "92597acfa680faea", "scanner": "scanner-primary", "fingerprint": "0a5cffb3d08fc11e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1d896ebdbdb83aa6", "level": "note", "message": {"text": "Unused endpoint: PUT /api/nodes/{node_id}"}, "properties": {"repobilityId": "2d6a173ef7b53cd2", "scanner": "scanner-primary", "fingerprint": "1d896ebdbdb83aa6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3b54d931c6df1bb9", "level": "note", "message": {"text": "Unused endpoint: GET /api/nodes/{node_id}/config"}, "properties": {"repobilityId": "6326a5619d88a9b5", "scanner": "scanner-primary", "fingerprint": "3b54d931c6df1bb9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f21988313f9eb6d2", "level": "note", "message": {"text": "Unused endpoint: PUT /api/nodes/{node_id}/config"}, "properties": {"repobilityId": "0c5bcf6be034207c", "scanner": "scanner-primary", "fingerprint": "f21988313f9eb6d2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3a3c45156489b020", "level": "note", "message": {"text": "Unused endpoint: GET /api/users"}, "properties": {"repobilityId": "dc9da57034e0fed7", "scanner": "scanner-primary", "fingerprint": "3a3c45156489b020", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-49546f6900fb04c5", "level": "note", "message": {"text": "Unused endpoint: POST /api/users"}, "properties": {"repobilityId": "7bdcce61ef6f1ea1", "scanner": "scanner-primary", "fingerprint": "49546f6900fb04c5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-eca1f083377522d6", "level": "note", "message": {"text": "Unused endpoint: PUT /api/users/{email}"}, "properties": {"repobilityId": "b7fad6889519babf", "scanner": "scanner-primary", "fingerprint": "eca1f083377522d6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-550617a6320721bf", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/users/{email}"}, "properties": {"repobilityId": "5f5447cd15051a6e", "scanner": "scanner-primary", "fingerprint": "550617a6320721bf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-23ed37ca3cef9ed6", "level": "note", "message": {"text": "Unused endpoint: GET /api/nodes/{node_id}/capture-sheet.pdf"}, "properties": {"repobilityId": "b84361782bca4085", "scanner": "scanner-primary", "fingerprint": "23ed37ca3cef9ed6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f33dcc0b0723a623", "level": "note", "message": {"text": "Unused endpoint: POST /api/nodes/{node_id}/captures"}, "properties": {"repobilityId": "cc5971fdc0e3bff4", "scanner": "scanner-primary", "fingerprint": "f33dcc0b0723a623", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-36fb248f6fab9d07", "level": "note", "message": {"text": "Unused endpoint: POST /api/captures/{capture_id}/photo"}, "properties": {"repobilityId": "3784af7c580891f0", "scanner": "scanner-primary", "fingerprint": "36fb248f6fab9d07", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-84bf0f96064d9a35", "level": "note", "message": {"text": "Unused endpoint: GET /api/captures/{capture_id}/photo"}, "properties": {"repobilityId": "0794a2e9908860b3", "scanner": "scanner-primary", "fingerprint": "84bf0f96064d9a35", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dc3e27c3cc1707c7", "level": "note", "message": {"text": "Unused endpoint: POST /api/captures/{capture_id}/entries"}, "properties": {"repobilityId": "28dcff163c864830", "scanner": "scanner-primary", "fingerprint": "dc3e27c3cc1707c7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1fecfe63e03cb59b", "level": "note", "message": {"text": "Unused endpoint: GET /api/nodes/{node_id}/captures"}, "properties": {"repobilityId": "f2069a30e6b60b68", "scanner": "scanner-primary", "fingerprint": "1fecfe63e03cb59b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9f9a9cef0b16a046", "level": "note", "message": {"text": "Unused endpoint: GET /api/nodes/{node_id}/powder"}, "properties": {"repobilityId": "497b8065580cf92c", "scanner": "scanner-primary", "fingerprint": "9f9a9cef0b16a046", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7e5809f25d5d4363", "level": "note", "message": {"text": "Unused endpoint: POST /api/nodes/{node_id}/powder/adjustment"}, "properties": {"repobilityId": "0a87d8dcb4bc0bab", "scanner": "scanner-primary", "fingerprint": "7e5809f25d5d4363", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ae3d199a0d722c68", "level": "note", "message": {"text": "Unused endpoint: GET /api/nodes/{node_id}/fittings"}, "properties": {"repobilityId": "72dcb69e9e231f7e", "scanner": "scanner-primary", "fingerprint": "ae3d199a0d722c68", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b655c6285f764e61", "level": "note", "message": {"text": "Unused endpoint: POST /api/nodes/{node_id}/fittings/adjustment"}, "properties": {"repobilityId": "1f03ab94fe6017be", "scanner": "scanner-primary", "fingerprint": "b655c6285f764e61", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b836307fa324d735", "level": "note", "message": {"text": "Unused endpoint: GET /api/nodes/{node_id}/production"}, "properties": {"repobilityId": "ab05410637a56e2a", "scanner": "scanner-primary", "fingerprint": "b836307fa324d735", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e759ef89ac7928b2", "level": "note", "message": {"text": "Unused endpoint: GET /api/nodes/{node_id}/finished-goods"}, "properties": {"repobilityId": "5d8a0ea15248fdb4", "scanner": "scanner-primary", "fingerprint": "e759ef89ac7928b2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-42b20a978896afdd", "level": "note", "message": {"text": "Unused endpoint: POST /api/nodes/{node_id}/finished-goods/adjustment"}, "properties": {"repobilityId": "53674515c75b8b8b", "scanner": "scanner-primary", "fingerprint": "42b20a978896afdd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d1a8f8243581a51c", "level": "note", "message": {"text": "Unused endpoint: GET /api/nodes/{node_id}/scrap"}, "properties": {"repobilityId": "c8952a4f0066f9b5", "scanner": "scanner-primary", "fingerprint": "d1a8f8243581a51c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-29e72b6bbbcbebd4", "level": "note", "message": {"text": "Unused endpoint: POST /api/nodes/{node_id}/delivery-notes"}, "properties": {"repobilityId": "6cb4cb5e2de3fda9", "scanner": "scanner-primary", "fingerprint": "29e72b6bbbcbebd4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e328aaaf19795708", "level": "note", "message": {"text": "Unused endpoint: GET /api/nodes/{node_id}/delivery-notes"}, "properties": {"repobilityId": "a41f83858a59787f", "scanner": "scanner-primary", "fingerprint": "e328aaaf19795708", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e24c76d18dd75643", "level": "note", "message": {"text": "Unused endpoint: GET /api/delivery-notes/{dn_id}/pdf"}, "properties": {"repobilityId": "8529cdf4b49da781", "scanner": "scanner-primary", "fingerprint": "e24c76d18dd75643", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-834043938dd7f269", "level": "note", "message": {"text": "Unused endpoint: POST /api/nodes/{node_id}/invoices"}, "properties": {"repobilityId": "23b5dcf48f5e0dfb", "scanner": "scanner-primary", "fingerprint": "834043938dd7f269", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5b300658993bf949", "level": "note", "message": {"text": "Unused endpoint: GET /api/nodes/{node_id}/invoices"}, "properties": {"repobilityId": "d653ff8cc6c3d189", "scanner": "scanner-primary", "fingerprint": "5b300658993bf949", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6a99b900cf0fc6db", "level": "note", "message": {"text": "Unused endpoint: GET /api/invoices/{inv_id}/pdf"}, "properties": {"repobilityId": "3d210cb0ebcbee1d", "scanner": "scanner-primary", "fingerprint": "6a99b900cf0fc6db", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-93e35b1c35690c23", "level": "note", "message": {"text": "Unused endpoint: POST /api/nodes/{node_id}/payments"}, "properties": {"repobilityId": "f9fa3bf8d4c3f704", "scanner": "scanner-primary", "fingerprint": "93e35b1c35690c23", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7b0738ff1d0910a7", "level": "note", "message": {"text": "Unused endpoint: POST /api/payments/{payment_id}/match"}, "properties": {"repobilityId": "6a5e511277e026a6", "scanner": "scanner-primary", "fingerprint": "7b0738ff1d0910a7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ffed7ee88a7722f9", "level": "note", "message": {"text": "Unused endpoint: GET /api/nodes/{node_id}/payments"}, "properties": {"repobilityId": "a3d7102ac80ec9d3", "scanner": "scanner-primary", "fingerprint": "ffed7ee88a7722f9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1a6980b61bac02a6", "level": "note", "message": {"text": "Unused endpoint: GET /api/nodes/{node_id}/flags"}, "properties": {"repobilityId": "1054f5a4744fe539", "scanner": "scanner-primary", "fingerprint": "1a6980b61bac02a6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bb51ce0d844ca66d", "level": "note", "message": {"text": "Unused endpoint: POST /api/flags/{flag_id}/resolve"}, "properties": {"repobilityId": "082e25d48c181693", "scanner": "scanner-primary", "fingerprint": "bb51ce0d844ca66d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6bed5767a7ae2062", "level": "note", "message": {"text": "Unused endpoint: POST /api/nodes/{node_id}/counts"}, "properties": {"repobilityId": "0d6bbae27efe1b07", "scanner": "scanner-primary", "fingerprint": "6bed5767a7ae2062", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e3a56ae7b250c6e1", "level": "note", "message": {"text": "Unused endpoint: GET /api/nodes/{node_id}/counts"}, "properties": {"repobilityId": "069b2a20f0330fc6", "scanner": "scanner-primary", "fingerprint": "e3a56ae7b250c6e1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1b92790cafb96c7e", "level": "note", "message": {"text": "Unused endpoint: POST /api/nodes/{node_id}/recon/sweep"}, "properties": {"repobilityId": "f62e18cbb5a818fb", "scanner": "scanner-primary", "fingerprint": "1b92790cafb96c7e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2c12b309a0339ea0", "level": "note", "message": {"text": "Unused endpoint: GET /api/nodes/{node_id}/recon"}, "properties": {"repobilityId": "a8a4d6e5138d073b", "scanner": "scanner-primary", "fingerprint": "2c12b309a0339ea0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0aa88ee52cd05a5c", "level": "note", "message": {"text": "Unused endpoint: GET /api/nodes/{node_id}/reports/daily"}, "properties": {"repobilityId": "bdac72a7b1858b14", "scanner": "scanner-primary", "fingerprint": "0aa88ee52cd05a5c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cae904467b1827dc", "level": "note", "message": {"text": "Unused endpoint: GET /api/nodes/{node_id}/reports/monthly"}, "properties": {"repobilityId": "539728b4d7480d9a", "scanner": "scanner-primary", "fingerprint": "cae904467b1827dc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a55996996074d9c0", "level": "note", "message": {"text": "Unused endpoint: GET /api/network/kg"}, "properties": {"repobilityId": "71df449285db610e", "scanner": "scanner-primary", "fingerprint": "a55996996074d9c0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-47ccee89ee9e3ee4", "level": "note", "message": {"text": "Unused endpoint: GET /api/audit"}, "properties": {"repobilityId": "84c37507a3a0c0cb", "scanner": "scanner-primary", "fingerprint": "47ccee89ee9e3ee4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4cbbbed74ba7d080", "level": "note", "message": {"text": "Unused endpoint: GET /api/nodes/gogreen/config"}, "properties": {"repobilityId": "8ee73c567b38ae39", "scanner": "scanner-primary", "fingerprint": "4cbbbed74ba7d080", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-98dfb043b6ff0f61", "level": "note", "message": {"text": "Unused endpoint: PUT /api/nodes/gogreen/config"}, "properties": {"repobilityId": "26ca94109d1e472e", "scanner": "scanner-primary", "fingerprint": "98dfb043b6ff0f61", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}