{"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-cc8279470720526f", "name": "Possibly dead Python function: render_item", "shortDescription": {"text": "Possibly dead Python function: render_item"}, "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-46f4b9ec934e8d1c", "name": "Possibly dead Python function: do_run_migrations", "shortDescription": {"text": "Possibly dead Python function: do_run_migrations"}, "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-4469bc21552461ec", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "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-6693f09853d78598", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "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-ad95cb80c2af516e", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "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-9c75d58f0a3e31f9", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "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-6fb6d83da6bd00b8", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "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-6f583f180d6f82ad", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "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-57f470b5320be963", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "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-45eed892ce8ce602", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "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-51436cd16c2671b5", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "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-ce283cfb41dff5cb", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "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-a4f720ff4f915aad", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "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-c636abbe19deee06", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "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-4a671fc5fb5902d4", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "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-44ccd91bdade1035", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "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-483510c0a5c19c63", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "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-f16d49896c214094", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "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-e9c5946dbfc0dd1f", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "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-b1594db4ede8c62a", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "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-d7dc31aedabee7ce", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "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-f0cb8ceaf969d897", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "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-698f6e4fae3a86d9", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "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-cacba230fa16a963", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "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-18a8a9e0129e3115", "name": "Possibly dead Python function: hello", "shortDescription": {"text": "Possibly dead Python function: hello"}, "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-cab2a942458c69fe", "name": "Possibly dead Python function: register_api_adapter", "shortDescription": {"text": "Possibly dead Python function: register_api_adapter"}, "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-172eb912b2f4359a", "name": "Possibly dead Python function: authorize", "shortDescription": {"text": "Possibly dead Python function: authorize"}, "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-58f4131090d0dd72", "name": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 frontend/src/TopologyGraph.tsx:104", "shortDescription": {"text": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 frontend/src/TopologyGraph.tsx:104"}, "fullDescription": {"text": "React Flow edge labels render with a white rectangle behind the text by default, which scatters bright boxes across a dark canvas. Either drop the label, or override `.react-flow__edge-textbg` and `.react-flow__edge-text` in your stylesheet.\n\nWhy: P-H in CHECKLIST.md \u2014 vendor edge labels bleed white through a dark canvas.\nRule id: fq.edge-label.no-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "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-374cfdd0969c4b90", "name": "Insecure pattern 'weak_hash' in backend/src/netbuddy/db/models/credential.py:20", "shortDescription": {"text": "Insecure pattern 'weak_hash' in backend/src/netbuddy/db/models/credential.py:20"}, "fullDescription": {"text": "Found a known-risky pattern (weak_hash). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6372cebde0220094", "name": "No auth library detected", "shortDescription": {"text": "No auth library detected"}, "fullDescription": {"text": "The scanner did not find any standard auth library (JWT, OAuth, NextAuth, Auth0, etc.). The repo has auth/admin/session surface indicators, so auth may live in custom code, in a separate service, or be missing."}, "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-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-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 23 placeholder/mock markers across 8 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "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-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "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-d5de16e33be3dcd5", "name": "Legacy-named symbol `config_backup` in backend/alembic/versions/9866fd865f56_config_backup_and_audit_log.py:1", "shortDescription": {"text": "Legacy-named symbol `config_backup` in backend/alembic/versions/9866fd865f56_config_backup_and_audit_log.py:1"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-645ae629dfedcd70", "name": "Legacy-named symbol `config_backup` in backend/src/netbuddy/db/models/backup.py:13", "shortDescription": {"text": "Legacy-named symbol `config_backup` in backend/src/netbuddy/db/models/backup.py:13"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "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/src/netbuddy/adapters/api_client.py:get_json, backend/src/netbuddy/adapters/api_client.py:get_json\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-be46ea126aa5d8dc", "name": "Near-duplicate function bodies in 3 places", "shortDescription": {"text": "Near-duplicate function bodies in 3 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nbackend/src/netbuddy/adapters/cato.py:get_lldp_neighbors, backend/src/netbuddy/adapters/watchguard.py:get_lldp_neighbors, backend/src/netbuddy/adapters/paloalto.py:get_lldp_neighbors\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-02525d39071dd2c7", "name": "Near-duplicate function bodies in 5 places", "shortDescription": {"text": "Near-duplicate function bodies in 5 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nbackend/src/netbuddy/adapters/cato.py:get_vpn_tunnels, backend/src/netbuddy/adapters/meraki.py:get_vpn_tunnels, backend/src/netbuddy/adapters/watchguard.py:get_vpn_tunnels, backend/src/netbuddy/adapters/unifi.py:get_vpn_tunnels\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-f15c08fca3e16d46", "name": "FastAPI POST `setup_first_admin` without auth dependency \u2014 backend/src/netbuddy/api/routes/auth.py:52", "shortDescription": {"text": "FastAPI POST `setup_first_admin` without auth dependency \u2014 backend/src/netbuddy/api/routes/auth.py:52"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6eebae24c756ff05", "name": "FastAPI POST `create_user` without auth dependency \u2014 backend/src/netbuddy/api/routes/users.py:29", "shortDescription": {"text": "FastAPI POST `create_user` without auth dependency \u2014 backend/src/netbuddy/api/routes/users.py:29"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0c29576cea0b1bf4", "name": "FastAPI DELETE `delete_user` without auth dependency \u2014 backend/src/netbuddy/api/routes/users.py:37", "shortDescription": {"text": "FastAPI DELETE `delete_user` without auth dependency \u2014 backend/src/netbuddy/api/routes/users.py:37"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1428ef5be8a87f93", "name": "FastAPI POST `crawl_endpoint` without auth dependency \u2014 backend/src/netbuddy/api/routes/discovery.py:34", "shortDescription": {"text": "FastAPI POST `crawl_endpoint` without auth dependency \u2014 backend/src/netbuddy/api/routes/discovery.py:34"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-edbcd67c33db1c34", "name": "FastAPI POST `resolve_hosts` without auth dependency \u2014 backend/src/netbuddy/api/routes/discovery.py:72", "shortDescription": {"text": "FastAPI POST `resolve_hosts` without auth dependency \u2014 backend/src/netbuddy/api/routes/discovery.py:72"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-aad212c6469011d4", "name": "FastAPI POST `create_device` without auth dependency \u2014 backend/src/netbuddy/api/routes/devices.py:164", "shortDescription": {"text": "FastAPI POST `create_device` without auth dependency \u2014 backend/src/netbuddy/api/routes/devices.py:164"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a0f75aa25f99e628", "name": "FastAPI PATCH `update_device` without auth dependency \u2014 backend/src/netbuddy/api/routes/devices.py:183", "shortDescription": {"text": "FastAPI PATCH `update_device` without auth dependency \u2014 backend/src/netbuddy/api/routes/devices.py:183"}, "fullDescription": {"text": "`@router.patch` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8361a72af0ada22b", "name": "FastAPI DELETE `delete_device` without auth dependency \u2014 backend/src/netbuddy/api/routes/devices.py:198", "shortDescription": {"text": "FastAPI DELETE `delete_device` without auth dependency \u2014 backend/src/netbuddy/api/routes/devices.py:198"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8a6beae3c04c4a42", "name": "FastAPI POST `link_credential` without auth dependency \u2014 backend/src/netbuddy/api/routes/devices.py:211", "shortDescription": {"text": "FastAPI POST `link_credential` without auth dependency \u2014 backend/src/netbuddy/api/routes/devices.py:211"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c141f7757403b897", "name": "FastAPI DELETE `unlink_credential` without auth dependency \u2014 backend/src/netbuddy/api/routes/devices.py:239", "shortDescription": {"text": "FastAPI DELETE `unlink_credential` without auth dependency \u2014 backend/src/netbuddy/api/routes/devices.py:239"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-27021cf50fa27a0b", "name": "FastAPI POST `import_devices` without auth dependency \u2014 backend/src/netbuddy/api/routes/devices.py:261", "shortDescription": {"text": "FastAPI POST `import_devices` without auth dependency \u2014 backend/src/netbuddy/api/routes/devices.py:261"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f05834719223a603", "name": "FastAPI POST `validate_device_endpoint` without auth dependency \u2014 backend/src/netbuddy/api/routes/devices.py:313", "shortDescription": {"text": "FastAPI POST `validate_device_endpoint` without auth dependency \u2014 backend/src/netbuddy/api/routes/devices.py:313"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d3f8abaf79b663df", "name": "FastAPI POST `discover_device_endpoint` without auth dependency \u2014 backend/src/netbuddy/api/routes/devices.py:408", "shortDescription": {"text": "FastAPI POST `discover_device_endpoint` without auth dependency \u2014 backend/src/netbuddy/api/routes/devices.py:408"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bc73f6ed0ae7740d", "name": "FastAPI POST `suggest_profile_endpoint` without auth dependency \u2014 backend/src/netbuddy/api/routes/devices.py:559", "shortDescription": {"text": "FastAPI POST `suggest_profile_endpoint` without auth dependency \u2014 backend/src/netbuddy/api/routes/devices.py:559"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8e9eeb2db43a80d8", "name": "FastAPI POST `backup_device_endpoint` without auth dependency \u2014 backend/src/netbuddy/api/routes/devices.py:587", "shortDescription": {"text": "FastAPI POST `backup_device_endpoint` without auth dependency \u2014 backend/src/netbuddy/api/routes/devices.py:587"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d3f0cd4feda095eb", "name": "FastAPI POST `lldp_status_endpoint` without auth dependency \u2014 backend/src/netbuddy/api/routes/devices.py:654", "shortDescription": {"text": "FastAPI POST `lldp_status_endpoint` without auth dependency \u2014 backend/src/netbuddy/api/routes/devices.py:654"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e765c849aedc6a48", "name": "FastAPI POST `lldp_enable_endpoint` without auth dependency \u2014 backend/src/netbuddy/api/routes/devices.py:668", "shortDescription": {"text": "FastAPI POST `lldp_enable_endpoint` without auth dependency \u2014 backend/src/netbuddy/api/routes/devices.py:668"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b0434ac9a0512638", "name": "FastAPI PATCH `update_vpn_tunnel` without auth dependency \u2014 backend/src/netbuddy/api/routes/devices.py:725", "shortDescription": {"text": "FastAPI PATCH `update_vpn_tunnel` without auth dependency \u2014 backend/src/netbuddy/api/routes/devices.py:725"}, "fullDescription": {"text": "`@router.patch` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-92632b3162cefd8c", "name": "FastAPI POST `create_site` without auth dependency \u2014 backend/src/netbuddy/api/routes/sites.py:64", "shortDescription": {"text": "FastAPI POST `create_site` without auth dependency \u2014 backend/src/netbuddy/api/routes/sites.py:64"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-12b365c5e85f9464", "name": "FastAPI PATCH `update_site` without auth dependency \u2014 backend/src/netbuddy/api/routes/sites.py:79", "shortDescription": {"text": "FastAPI PATCH `update_site` without auth dependency \u2014 backend/src/netbuddy/api/routes/sites.py:79"}, "fullDescription": {"text": "`@router.patch` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-790bc16698d2d08f", "name": "FastAPI POST `add_subnet` without auth dependency \u2014 backend/src/netbuddy/api/routes/sites.py:127", "shortDescription": {"text": "FastAPI POST `add_subnet` without auth dependency \u2014 backend/src/netbuddy/api/routes/sites.py:127"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c39b4ada8157d12e", "name": "FastAPI DELETE `delete_subnet` without auth dependency \u2014 backend/src/netbuddy/api/routes/sites.py:146", "shortDescription": {"text": "FastAPI DELETE `delete_subnet` without auth dependency \u2014 backend/src/netbuddy/api/routes/sites.py:146"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7df1c3b2cd529c0b", "name": "FastAPI DELETE `delete_site` without auth dependency \u2014 backend/src/netbuddy/api/routes/sites.py:155", "shortDescription": {"text": "FastAPI DELETE `delete_site` without auth dependency \u2014 backend/src/netbuddy/api/routes/sites.py:155"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-dc3a911dc256742b", "name": "FastAPI POST `create_credential` without auth dependency \u2014 backend/src/netbuddy/api/routes/credentials.py:76", "shortDescription": {"text": "FastAPI POST `create_credential` without auth dependency \u2014 backend/src/netbuddy/api/routes/credentials.py:76"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e1aa93040b638586", "name": "FastAPI DELETE `delete_credential` without auth dependency \u2014 backend/src/netbuddy/api/routes/credentials.py:102", "shortDescription": {"text": "FastAPI DELETE `delete_credential` without auth dependency \u2014 backend/src/netbuddy/api/routes/credentials.py:102"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`backend/src/netbuddy/api/routes/adapters.py` declares `GET /` 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-7c271e6b7a214a30", "name": "Unused endpoint: GET /setup-status", "shortDescription": {"text": "Unused endpoint: GET /setup-status"}, "fullDescription": {"text": "`backend/src/netbuddy/api/routes/auth.py` declares `GET /setup-status` 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-eb757797f6bd3444", "name": "Unused endpoint: POST /setup", "shortDescription": {"text": "Unused endpoint: POST /setup"}, "fullDescription": {"text": "`backend/src/netbuddy/api/routes/auth.py` declares `POST /setup` 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-618721b912bad1c2", "name": "Unused endpoint: POST /login", "shortDescription": {"text": "Unused endpoint: POST /login"}, "fullDescription": {"text": "`backend/src/netbuddy/api/routes/auth.py` declares `POST /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-99fc36db98c134ce", "name": "Unused endpoint: POST /logout", "shortDescription": {"text": "Unused endpoint: POST /logout"}, "fullDescription": {"text": "`backend/src/netbuddy/api/routes/auth.py` declares `POST /logout` 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-fd1dc91abf32142d", "name": "Unused endpoint: GET /me", "shortDescription": {"text": "Unused endpoint: GET /me"}, "fullDescription": {"text": "`backend/src/netbuddy/api/routes/auth.py` declares `GET /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-7a009b1a56794f45", "name": "Unused endpoint: POST /", "shortDescription": {"text": "Unused endpoint: POST /"}, "fullDescription": {"text": "`backend/src/netbuddy/api/routes/users.py` declares `POST /` 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-55c93ee7e031a509", "name": "Unused endpoint: DELETE /{user_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{user_id}"}, "fullDescription": {"text": "`backend/src/netbuddy/api/routes/users.py` declares `DELETE /{user_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-5293719d857b5a90", "name": "Unused endpoint: GET /suggestions", "shortDescription": {"text": "Unused endpoint: GET /suggestions"}, "fullDescription": {"text": "`backend/src/netbuddy/api/routes/discovery.py` declares `GET /suggestions` 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-ffd1d386cc2ba872", "name": "Unused endpoint: POST /crawl", "shortDescription": {"text": "Unused endpoint: POST /crawl"}, "fullDescription": {"text": "`backend/src/netbuddy/api/routes/discovery.py` declares `POST /crawl` 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-a23a464c277edba5", "name": "Unused endpoint: POST /resolve-hosts", "shortDescription": {"text": "Unused endpoint: POST /resolve-hosts"}, "fullDescription": {"text": "`backend/src/netbuddy/api/routes/discovery.py` declares `POST /resolve-hosts` 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-e5ebc9f765f023fa", "name": "Unused endpoint: GET /{device_id}", "shortDescription": {"text": "Unused endpoint: GET /{device_id}"}, "fullDescription": {"text": "`backend/src/netbuddy/api/routes/devices.py` declares `GET /{device_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-d8fd15d8eb71daad", "name": "Unused endpoint: PATCH /{device_id}", "shortDescription": {"text": "Unused endpoint: PATCH /{device_id}"}, "fullDescription": {"text": "`backend/src/netbuddy/api/routes/devices.py` declares `PATCH /{device_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-4f270e4743a01695", "name": "Unused endpoint: DELETE /{device_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{device_id}"}, "fullDescription": {"text": "`backend/src/netbuddy/api/routes/devices.py` declares `DELETE /{device_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-c912011b407a4c89", "name": "Unused endpoint: POST /{device_id}/credentials", "shortDescription": {"text": "Unused endpoint: POST /{device_id}/credentials"}, "fullDescription": {"text": "`backend/src/netbuddy/api/routes/devices.py` declares `POST /{device_id}/credentials` 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-e61c4636b5b32727", "name": "Unused endpoint: DELETE /{device_id}/credentials/{credential_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{device_id}/credentials/{credential_id}"}, "fullDescription": {"text": "`backend/src/netbuddy/api/routes/devices.py` declares `DELETE /{device_id}/credentials/{credential_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-be4cb5e3cabcce80", "name": "Unused endpoint: POST /import", "shortDescription": {"text": "Unused endpoint: POST /import"}, "fullDescription": {"text": "`backend/src/netbuddy/api/routes/devices.py` declares `POST /import` 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-3b62344955ccf15a", "name": "Unused endpoint: POST /{device_id}/validate", "shortDescription": {"text": "Unused endpoint: POST /{device_id}/validate"}, "fullDescription": {"text": "`backend/src/netbuddy/api/routes/devices.py` declares `POST /{device_id}/validate` 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-11a9f047627d3284", "name": "Unused endpoint: GET /{device_id}/validation", "shortDescription": {"text": "Unused endpoint: GET /{device_id}/validation"}, "fullDescription": {"text": "`backend/src/netbuddy/api/routes/devices.py` declares `GET /{device_id}/validation` 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-054be6a73f4db40c", "name": "Unused endpoint: POST /{device_id}/discover", "shortDescription": {"text": "Unused endpoint: POST /{device_id}/discover"}, "fullDescription": {"text": "`backend/src/netbuddy/api/routes/devices.py` declares `POST /{device_id}/discover` 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-00369c90db6707ee", "name": "Unused endpoint: GET /{device_id}/interfaces", "shortDescription": {"text": "Unused endpoint: GET /{device_id}/interfaces"}, "fullDescription": {"text": "`backend/src/netbuddy/api/routes/devices.py` declares `GET /{device_id}/interfaces` 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-fa7055ec9d09ffc3", "name": "Unused endpoint: GET /{device_id}/lldp-neighbors", "shortDescription": {"text": "Unused endpoint: GET /{device_id}/lldp-neighbors"}, "fullDescription": {"text": "`backend/src/netbuddy/api/routes/devices.py` declares `GET /{device_id}/lldp-neighbors` 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-f68108e7b54e0d94", "name": "Unused endpoint: GET /{device_id}/mac-table", "shortDescription": {"text": "Unused endpoint: GET /{device_id}/mac-table"}, "fullDescription": {"text": "`backend/src/netbuddy/api/routes/devices.py` declares `GET /{device_id}/mac-table` 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-d9a1667abdcb9a4e", "name": "Unused endpoint: GET /{device_id}/arp", "shortDescription": {"text": "Unused endpoint: GET /{device_id}/arp"}, "fullDescription": {"text": "`backend/src/netbuddy/api/routes/devices.py` declares `GET /{device_id}/arp` 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-3890ca8a5dbcc329", "name": "Unused endpoint: POST /{device_id}/suggest-profile", "shortDescription": {"text": "Unused endpoint: POST /{device_id}/suggest-profile"}, "fullDescription": {"text": "`backend/src/netbuddy/api/routes/devices.py` declares `POST /{device_id}/suggest-profile` 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-392d75e4fa29675a", "name": "Unused endpoint: POST /{device_id}/backup", "shortDescription": {"text": "Unused endpoint: POST /{device_id}/backup"}, "fullDescription": {"text": "`backend/src/netbuddy/api/routes/devices.py` declares `POST /{device_id}/backup` 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-b07f003e56a17fe3", "name": "Unused endpoint: GET /{device_id}/backups", "shortDescription": {"text": "Unused endpoint: GET /{device_id}/backups"}, "fullDescription": {"text": "`backend/src/netbuddy/api/routes/devices.py` declares `GET /{device_id}/backups` 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-93752516a72b66a7", "name": "Unused endpoint: GET /{device_id}/backups/{backup_id}", "shortDescription": {"text": "Unused endpoint: GET /{device_id}/backups/{backup_id}"}, "fullDescription": {"text": "`backend/src/netbuddy/api/routes/devices.py` declares `GET /{device_id}/backups/{backup_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-8b3e64d3f8dd3719", "name": "Unused endpoint: GET /{device_id}/config-diff", "shortDescription": {"text": "Unused endpoint: GET /{device_id}/config-diff"}, "fullDescription": {"text": "`backend/src/netbuddy/api/routes/devices.py` declares `GET /{device_id}/config-diff` 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-802cf52c2c8eb891", "name": "Unused endpoint: POST /{device_id}/lldp/status", "shortDescription": {"text": "Unused endpoint: POST /{device_id}/lldp/status"}, "fullDescription": {"text": "`backend/src/netbuddy/api/routes/devices.py` declares `POST /{device_id}/lldp/status` 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-21a8ad9f134aed4d", "name": "Unused endpoint: POST /{device_id}/lldp/enable", "shortDescription": {"text": "Unused endpoint: POST /{device_id}/lldp/enable"}, "fullDescription": {"text": "`backend/src/netbuddy/api/routes/devices.py` declares `POST /{device_id}/lldp/enable` 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-fa5421b72b5c036a", "name": "Unused endpoint: GET /{device_id}/vpn-tunnels", "shortDescription": {"text": "Unused endpoint: GET /{device_id}/vpn-tunnels"}, "fullDescription": {"text": "`backend/src/netbuddy/api/routes/devices.py` declares `GET /{device_id}/vpn-tunnels` 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-e024f136622938cc", "name": "Unused endpoint: PATCH /{device_id}/vpn-tunnels/{tunnel_id}", "shortDescription": {"text": "Unused endpoint: PATCH /{device_id}/vpn-tunnels/{tunnel_id}"}, "fullDescription": {"text": "`backend/src/netbuddy/api/routes/devices.py` declares `PATCH /{device_id}/vpn-tunnels/{tunnel_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-b28816510eb71c4c", "name": "Unused endpoint: PATCH /{site_id}", "shortDescription": {"text": "Unused endpoint: PATCH /{site_id}"}, "fullDescription": {"text": "`backend/src/netbuddy/api/routes/sites.py` declares `PATCH /{site_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-35e1c1da381823c7", "name": "Unused endpoint: POST /{site_id}/subnets", "shortDescription": {"text": "Unused endpoint: POST /{site_id}/subnets"}, "fullDescription": {"text": "`backend/src/netbuddy/api/routes/sites.py` declares `POST /{site_id}/subnets` 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-bd81ec38e8551d23", "name": "Unused endpoint: DELETE /{site_id}/subnets/{subnet_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{site_id}/subnets/{subnet_id}"}, "fullDescription": {"text": "`backend/src/netbuddy/api/routes/sites.py` declares `DELETE /{site_id}/subnets/{subnet_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-19738345a9e99c64", "name": "Unused endpoint: DELETE /{site_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{site_id}"}, "fullDescription": {"text": "`backend/src/netbuddy/api/routes/sites.py` declares `DELETE /{site_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-be13894ac7c431e6", "name": "Unused endpoint: DELETE /{credential_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{credential_id}"}, "fullDescription": {"text": "`backend/src/netbuddy/api/routes/credentials.py` declares `DELETE /{credential_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}}]}}, "automationDetails": {"id": "repobility/20613"}, "properties": {"repository": "swissgiant/Netbuddy", "repoUrl": "https://github.com/swissgiant/Netbuddy", "branch": "main"}, "results": [{"ruleId": "scanner-cc8279470720526f", "level": "note", "message": {"text": "Possibly dead Python function: render_item"}, "properties": {"repobilityId": "db31dcfee14a359e", "scanner": "scanner-primary", "fingerprint": "cc8279470720526f", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/env.py:25"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-46f4b9ec934e8d1c", "level": "note", "message": {"text": "Possibly dead Python function: do_run_migrations"}, "properties": {"repobilityId": "087acb17722cfd2f", "scanner": "scanner-primary", "fingerprint": "46f4b9ec934e8d1c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/env.py:49"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4469bc21552461ec", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "4469bc21552461ec", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/8c7971315c66_interface_parent_name_vlan_id_.py:21"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6693f09853d78598", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "6693f09853d78598", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/8c7971315c66_interface_parent_name_vlan_id_.py:29"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ad95cb80c2af516e", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "ad95cb80c2af516e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/2523e7a92c2a_sites_device_site_id_credential_api_.py:22"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9c75d58f0a3e31f9", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "9c75d58f0a3e31f9", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/2523e7a92c2a_sites_device_site_id_credential_api_.py:54"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6fb6d83da6bd00b8", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "6fb6d83da6bd00b8", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/720e220bdf56_lldp_remote_mgmt_address.py:21"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6f583f180d6f82ad", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "6f583f180d6f82ad", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/720e220bdf56_lldp_remote_mgmt_address.py:28"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-57f470b5320be963", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "57f470b5320be963", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/16614eab791f_users_and_auth_sessions.py:21"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-45eed892ce8ce602", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "45eed892ce8ce602", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/16614eab791f_users_and_auth_sessions.py:51"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-51436cd16c2671b5", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "51436cd16c2671b5", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/d8cfa495b306_site_subnet_vpn_tunnel.py:21"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ce283cfb41dff5cb", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "ce283cfb41dff5cb", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/d8cfa495b306_site_subnet_vpn_tunnel.py:52"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a4f720ff4f915aad", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "a4f720ff4f915aad", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/3db5f7c39230_arp_entry_host_namensaufl\u00f6sung.py:21"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c636abbe19deee06", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "c636abbe19deee06", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/3db5f7c39230_arp_entry_host_namensaufl\u00f6sung.py:54"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4a671fc5fb5902d4", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "4a671fc5fb5902d4", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/878bb2414311_vpn_tunnel_relevant_flag.py:21"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-44ccd91bdade1035", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "44ccd91bdade1035", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/878bb2414311_vpn_tunnel_relevant_flag.py:28"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-483510c0a5c19c63", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "483510c0a5c19c63", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/843563cc7225_validation_check_table.py:21"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f16d49896c214094", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "f16d49896c214094", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/843563cc7225_validation_check_table.py:46"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e9c5946dbfc0dd1f", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "e9c5946dbfc0dd1f", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/c31556efa8b2_phase1_initial_schema.py:22"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b1594db4ede8c62a", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "b1594db4ede8c62a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/c31556efa8b2_phase1_initial_schema.py:153"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d7dc31aedabee7ce", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "d7dc31aedabee7ce", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/46a0188f6ddd_site_mgmt_ip_template_namens_zu_ip_regel.py:21"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f0cb8ceaf969d897", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "f0cb8ceaf969d897", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/46a0188f6ddd_site_mgmt_ip_template_namens_zu_ip_regel.py:28"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-698f6e4fae3a86d9", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "698f6e4fae3a86d9", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/9866fd865f56_config_backup_and_audit_log.py:21"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-cacba230fa16a963", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "cacba230fa16a963", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/9866fd865f56_config_backup_and_audit_log.py:49"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-18a8a9e0129e3115", "level": "note", "message": {"text": "Possibly dead Python function: hello"}, "properties": {"repobilityId": "8b01404a72d76209", "scanner": "scanner-primary", "fingerprint": "18a8a9e0129e3115", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/netbuddy/__init__.py:1"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-cab2a942458c69fe", "level": "note", "message": {"text": "Possibly dead Python function: register_api_adapter"}, "properties": {"repobilityId": "ca1fdd38ed457e74", "scanner": "scanner-primary", "fingerprint": "cab2a942458c69fe", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/netbuddy/adapters/registry.py:24"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-172eb912b2f4359a", "level": "note", "message": {"text": "Possibly dead Python function: authorize"}, "properties": {"repobilityId": "cf7b68da09c15a33", "scanner": "scanner-primary", "fingerprint": "172eb912b2f4359a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/netbuddy/api/deps.py:44"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-58f4131090d0dd72", "level": "note", "message": {"text": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 frontend/src/TopologyGraph.tsx:104"}, "properties": {"repobilityId": "570b3aa570b5c4c9", "scanner": "scanner-primary", "fingerprint": "58f4131090d0dd72", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.edge-label.no-bg"]}}, {"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-374cfdd0969c4b90", "level": "warning", "message": {"text": "Insecure pattern 'weak_hash' in backend/src/netbuddy/db/models/credential.py:20"}, "properties": {"repobilityId": "87dfe662f702c9fa", "scanner": "scanner-primary", "fingerprint": "374cfdd0969c4b90", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "weak_hash"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/netbuddy/db/models/credential.py"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-6372cebde0220094", "level": "warning", "message": {"text": "No auth library detected"}, "properties": {"repobilityId": "a5b6035a5bbf8054", "scanner": "scanner-primary", "fingerprint": "6372cebde0220094", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["coverage", "auth"]}}, {"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-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "106cfd760707275a", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "b3fafe889fcfb78f", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "d32f901f7c979050", "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": "cc288c964e2e8ad6", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "89f56e81df9ca1a9", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "8d01be8c3486d579", "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": "61c08ec878012860", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-d5de16e33be3dcd5", "level": "note", "message": {"text": "Legacy-named symbol `config_backup` in backend/alembic/versions/9866fd865f56_config_backup_and_audit_log.py:1"}, "properties": {"repobilityId": "c7e17c2a111a38f3", "scanner": "scanner-primary", "fingerprint": "d5de16e33be3dcd5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-645ae629dfedcd70", "level": "note", "message": {"text": "Legacy-named symbol `config_backup` in backend/src/netbuddy/db/models/backup.py:13"}, "properties": {"repobilityId": "c033746f62926657", "scanner": "scanner-primary", "fingerprint": "645ae629dfedcd70", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "7c8619318f58fe75", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "e8060cf188c86da0", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "4530bef269122b60", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "1d1cf249d5c95a08", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "7755ba7eec6243be", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "5c2d613eb453feb5", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "5f30318555b0ff8a", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "cc086d96c47a334f", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-02525d39071dd2c7", "level": "note", "message": {"text": "Near-duplicate function bodies in 5 places"}, "properties": {"repobilityId": "b16230e404d73d0a", "scanner": "scanner-primary", "fingerprint": "02525d39071dd2c7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "894d3f83c17338eb", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "568c7d4f1222ea98", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "43d5c93ffaa54a85", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "85b93e9b3670b6e8", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "b3effe73574ea8bc", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "0843de19f8708faa", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "abed257faacba5d7", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "494e399235b5b423", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "c5cf7b6b02734275", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-f15c08fca3e16d46", "level": "error", "message": {"text": "FastAPI POST `setup_first_admin` without auth dependency \u2014 backend/src/netbuddy/api/routes/auth.py:52"}, "properties": {"repobilityId": "5d05204e45a6e710", "scanner": "scanner-primary", "fingerprint": "f15c08fca3e16d46", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/netbuddy/api/routes/auth.py"}, "region": {"startLine": 52}}}]}, {"ruleId": "scanner-6eebae24c756ff05", "level": "error", "message": {"text": "FastAPI POST `create_user` without auth dependency \u2014 backend/src/netbuddy/api/routes/users.py:29"}, "properties": {"repobilityId": "3f440815968126d0", "scanner": "scanner-primary", "fingerprint": "6eebae24c756ff05", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/netbuddy/api/routes/users.py"}, "region": {"startLine": 29}}}]}, {"ruleId": "scanner-0c29576cea0b1bf4", "level": "error", "message": {"text": "FastAPI DELETE `delete_user` without auth dependency \u2014 backend/src/netbuddy/api/routes/users.py:37"}, "properties": {"repobilityId": "77259706733f8e2c", "scanner": "scanner-primary", "fingerprint": "0c29576cea0b1bf4", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/netbuddy/api/routes/users.py"}, "region": {"startLine": 37}}}]}, {"ruleId": "scanner-1428ef5be8a87f93", "level": "error", "message": {"text": "FastAPI POST `crawl_endpoint` without auth dependency \u2014 backend/src/netbuddy/api/routes/discovery.py:34"}, "properties": {"repobilityId": "782d4d7314aacd63", "scanner": "scanner-primary", "fingerprint": "1428ef5be8a87f93", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/netbuddy/api/routes/discovery.py"}, "region": {"startLine": 34}}}]}, {"ruleId": "scanner-edbcd67c33db1c34", "level": "error", "message": {"text": "FastAPI POST `resolve_hosts` without auth dependency \u2014 backend/src/netbuddy/api/routes/discovery.py:72"}, "properties": {"repobilityId": "14918116806997bd", "scanner": "scanner-primary", "fingerprint": "edbcd67c33db1c34", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/netbuddy/api/routes/discovery.py"}, "region": {"startLine": 72}}}]}, {"ruleId": "scanner-aad212c6469011d4", "level": "error", "message": {"text": "FastAPI POST `create_device` without auth dependency \u2014 backend/src/netbuddy/api/routes/devices.py:164"}, "properties": {"repobilityId": "2781df7d2e58bf2e", "scanner": "scanner-primary", "fingerprint": "aad212c6469011d4", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/netbuddy/api/routes/devices.py"}, "region": {"startLine": 164}}}]}, {"ruleId": "scanner-a0f75aa25f99e628", "level": "error", "message": {"text": "FastAPI PATCH `update_device` without auth dependency \u2014 backend/src/netbuddy/api/routes/devices.py:183"}, "properties": {"repobilityId": "16a094cf0e95a6b5", "scanner": "scanner-primary", "fingerprint": "a0f75aa25f99e628", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/netbuddy/api/routes/devices.py"}, "region": {"startLine": 183}}}]}, {"ruleId": "scanner-8361a72af0ada22b", "level": "error", "message": {"text": "FastAPI DELETE `delete_device` without auth dependency \u2014 backend/src/netbuddy/api/routes/devices.py:198"}, "properties": {"repobilityId": "eaa27743605679ac", "scanner": "scanner-primary", "fingerprint": "8361a72af0ada22b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/netbuddy/api/routes/devices.py"}, "region": {"startLine": 198}}}]}, {"ruleId": "scanner-8a6beae3c04c4a42", "level": "error", "message": {"text": "FastAPI POST `link_credential` without auth dependency \u2014 backend/src/netbuddy/api/routes/devices.py:211"}, "properties": {"repobilityId": "b2332de8797ede39", "scanner": "scanner-primary", "fingerprint": "8a6beae3c04c4a42", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/netbuddy/api/routes/devices.py"}, "region": {"startLine": 211}}}]}, {"ruleId": "scanner-c141f7757403b897", "level": "error", "message": {"text": "FastAPI DELETE `unlink_credential` without auth dependency \u2014 backend/src/netbuddy/api/routes/devices.py:239"}, "properties": {"repobilityId": "cdf36400d1750e58", "scanner": "scanner-primary", "fingerprint": "c141f7757403b897", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/netbuddy/api/routes/devices.py"}, "region": {"startLine": 239}}}]}, {"ruleId": "scanner-27021cf50fa27a0b", "level": "error", "message": {"text": "FastAPI POST `import_devices` without auth dependency \u2014 backend/src/netbuddy/api/routes/devices.py:261"}, "properties": {"repobilityId": "971f069b3c5fcbcc", "scanner": "scanner-primary", "fingerprint": "27021cf50fa27a0b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/netbuddy/api/routes/devices.py"}, "region": {"startLine": 261}}}]}, {"ruleId": "scanner-f05834719223a603", "level": "error", "message": {"text": "FastAPI POST `validate_device_endpoint` without auth dependency \u2014 backend/src/netbuddy/api/routes/devices.py:313"}, "properties": {"repobilityId": "47b028c8ee267d59", "scanner": "scanner-primary", "fingerprint": "f05834719223a603", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/netbuddy/api/routes/devices.py"}, "region": {"startLine": 313}}}]}, {"ruleId": "scanner-d3f8abaf79b663df", "level": "error", "message": {"text": "FastAPI POST `discover_device_endpoint` without auth dependency \u2014 backend/src/netbuddy/api/routes/devices.py:408"}, "properties": {"repobilityId": "395ed4201df15d3e", "scanner": "scanner-primary", "fingerprint": "d3f8abaf79b663df", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/netbuddy/api/routes/devices.py"}, "region": {"startLine": 408}}}]}, {"ruleId": "scanner-bc73f6ed0ae7740d", "level": "error", "message": {"text": "FastAPI POST `suggest_profile_endpoint` without auth dependency \u2014 backend/src/netbuddy/api/routes/devices.py:559"}, "properties": {"repobilityId": "e971cb11f3df9a09", "scanner": "scanner-primary", "fingerprint": "bc73f6ed0ae7740d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/netbuddy/api/routes/devices.py"}, "region": {"startLine": 559}}}]}, {"ruleId": "scanner-8e9eeb2db43a80d8", "level": "error", "message": {"text": "FastAPI POST `backup_device_endpoint` without auth dependency \u2014 backend/src/netbuddy/api/routes/devices.py:587"}, "properties": {"repobilityId": "e01fb7f7e61de204", "scanner": "scanner-primary", "fingerprint": "8e9eeb2db43a80d8", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/netbuddy/api/routes/devices.py"}, "region": {"startLine": 587}}}]}, {"ruleId": "scanner-d3f0cd4feda095eb", "level": "error", "message": {"text": "FastAPI POST `lldp_status_endpoint` without auth dependency \u2014 backend/src/netbuddy/api/routes/devices.py:654"}, "properties": {"repobilityId": "e756ca69a62f95ca", "scanner": "scanner-primary", "fingerprint": "d3f0cd4feda095eb", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/netbuddy/api/routes/devices.py"}, "region": {"startLine": 654}}}]}, {"ruleId": "scanner-e765c849aedc6a48", "level": "error", "message": {"text": "FastAPI POST `lldp_enable_endpoint` without auth dependency \u2014 backend/src/netbuddy/api/routes/devices.py:668"}, "properties": {"repobilityId": "9ef7448950e145fb", "scanner": "scanner-primary", "fingerprint": "e765c849aedc6a48", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/netbuddy/api/routes/devices.py"}, "region": {"startLine": 668}}}]}, {"ruleId": "scanner-b0434ac9a0512638", "level": "error", "message": {"text": "FastAPI PATCH `update_vpn_tunnel` without auth dependency \u2014 backend/src/netbuddy/api/routes/devices.py:725"}, "properties": {"repobilityId": "9fae0ce22386f272", "scanner": "scanner-primary", "fingerprint": "b0434ac9a0512638", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/netbuddy/api/routes/devices.py"}, "region": {"startLine": 725}}}]}, {"ruleId": "scanner-92632b3162cefd8c", "level": "error", "message": {"text": "FastAPI POST `create_site` without auth dependency \u2014 backend/src/netbuddy/api/routes/sites.py:64"}, "properties": {"repobilityId": "d06c45ebd1b92a01", "scanner": "scanner-primary", "fingerprint": "92632b3162cefd8c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/netbuddy/api/routes/sites.py"}, "region": {"startLine": 64}}}]}, {"ruleId": "scanner-12b365c5e85f9464", "level": "error", "message": {"text": "FastAPI PATCH `update_site` without auth dependency \u2014 backend/src/netbuddy/api/routes/sites.py:79"}, "properties": {"repobilityId": "097fbebb12d67213", "scanner": "scanner-primary", "fingerprint": "12b365c5e85f9464", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/netbuddy/api/routes/sites.py"}, "region": {"startLine": 79}}}]}, {"ruleId": "scanner-790bc16698d2d08f", "level": "error", "message": {"text": "FastAPI POST `add_subnet` without auth dependency \u2014 backend/src/netbuddy/api/routes/sites.py:127"}, "properties": {"repobilityId": "0b9ad51677e58bdb", "scanner": "scanner-primary", "fingerprint": "790bc16698d2d08f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/netbuddy/api/routes/sites.py"}, "region": {"startLine": 127}}}]}, {"ruleId": "scanner-c39b4ada8157d12e", "level": "error", "message": {"text": "FastAPI DELETE `delete_subnet` without auth dependency \u2014 backend/src/netbuddy/api/routes/sites.py:146"}, "properties": {"repobilityId": "5211539fb6b7f288", "scanner": "scanner-primary", "fingerprint": "c39b4ada8157d12e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/netbuddy/api/routes/sites.py"}, "region": {"startLine": 146}}}]}, {"ruleId": "scanner-7df1c3b2cd529c0b", "level": "error", "message": {"text": "FastAPI DELETE `delete_site` without auth dependency \u2014 backend/src/netbuddy/api/routes/sites.py:155"}, "properties": {"repobilityId": "6ffc7292a37e7e2c", "scanner": "scanner-primary", "fingerprint": "7df1c3b2cd529c0b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/netbuddy/api/routes/sites.py"}, "region": {"startLine": 155}}}]}, {"ruleId": "scanner-dc3a911dc256742b", "level": "error", "message": {"text": "FastAPI POST `create_credential` without auth dependency \u2014 backend/src/netbuddy/api/routes/credentials.py:76"}, "properties": {"repobilityId": "a2728364237e5295", "scanner": "scanner-primary", "fingerprint": "dc3a911dc256742b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/netbuddy/api/routes/credentials.py"}, "region": {"startLine": 76}}}]}, {"ruleId": "scanner-e1aa93040b638586", "level": "error", "message": {"text": "FastAPI DELETE `delete_credential` without auth dependency \u2014 backend/src/netbuddy/api/routes/credentials.py:102"}, "properties": {"repobilityId": "dd9cd5680fe27e97", "scanner": "scanner-primary", "fingerprint": "e1aa93040b638586", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/netbuddy/api/routes/credentials.py"}, "region": {"startLine": 102}}}]}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "736fde181f697009", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7c271e6b7a214a30", "level": "note", "message": {"text": "Unused endpoint: GET /setup-status"}, "properties": {"repobilityId": "2fe92d502560a16e", "scanner": "scanner-primary", "fingerprint": "7c271e6b7a214a30", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-eb757797f6bd3444", "level": "note", "message": {"text": "Unused endpoint: POST /setup"}, "properties": {"repobilityId": "c73ba1e8a955fb70", "scanner": "scanner-primary", "fingerprint": "eb757797f6bd3444", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-618721b912bad1c2", "level": "note", "message": {"text": "Unused endpoint: POST /login"}, "properties": {"repobilityId": "84ba617af12fd0be", "scanner": "scanner-primary", "fingerprint": "618721b912bad1c2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-99fc36db98c134ce", "level": "note", "message": {"text": "Unused endpoint: POST /logout"}, "properties": {"repobilityId": "91f67585b2b595f8", "scanner": "scanner-primary", "fingerprint": "99fc36db98c134ce", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fd1dc91abf32142d", "level": "note", "message": {"text": "Unused endpoint: GET /me"}, "properties": {"repobilityId": "360242eae20e13b3", "scanner": "scanner-primary", "fingerprint": "fd1dc91abf32142d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a009b1a56794f45", "level": "note", "message": {"text": "Unused endpoint: POST /"}, "properties": {"repobilityId": "2c9fb7729aa244d0", "scanner": "scanner-primary", "fingerprint": "7a009b1a56794f45", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-55c93ee7e031a509", "level": "note", "message": {"text": "Unused endpoint: DELETE /{user_id}"}, "properties": {"repobilityId": "f0c5d55998c3f13b", "scanner": "scanner-primary", "fingerprint": "55c93ee7e031a509", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5293719d857b5a90", "level": "note", "message": {"text": "Unused endpoint: GET /suggestions"}, "properties": {"repobilityId": "46ada130ccab232d", "scanner": "scanner-primary", "fingerprint": "5293719d857b5a90", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ffd1d386cc2ba872", "level": "note", "message": {"text": "Unused endpoint: POST /crawl"}, "properties": {"repobilityId": "47ac5fdeb16fb29e", "scanner": "scanner-primary", "fingerprint": "ffd1d386cc2ba872", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a23a464c277edba5", "level": "note", "message": {"text": "Unused endpoint: POST /resolve-hosts"}, "properties": {"repobilityId": "91b62e080a25241f", "scanner": "scanner-primary", "fingerprint": "a23a464c277edba5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e5ebc9f765f023fa", "level": "note", "message": {"text": "Unused endpoint: GET /{device_id}"}, "properties": {"repobilityId": "7af4a6c6fd9ea79b", "scanner": "scanner-primary", "fingerprint": "e5ebc9f765f023fa", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d8fd15d8eb71daad", "level": "note", "message": {"text": "Unused endpoint: PATCH /{device_id}"}, "properties": {"repobilityId": "5b47f8edaf9c8087", "scanner": "scanner-primary", "fingerprint": "d8fd15d8eb71daad", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4f270e4743a01695", "level": "note", "message": {"text": "Unused endpoint: DELETE /{device_id}"}, "properties": {"repobilityId": "1a0a6d7cb155db77", "scanner": "scanner-primary", "fingerprint": "4f270e4743a01695", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c912011b407a4c89", "level": "note", "message": {"text": "Unused endpoint: POST /{device_id}/credentials"}, "properties": {"repobilityId": "d04302ec21945fc7", "scanner": "scanner-primary", "fingerprint": "c912011b407a4c89", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e61c4636b5b32727", "level": "note", "message": {"text": "Unused endpoint: DELETE /{device_id}/credentials/{credential_id}"}, "properties": {"repobilityId": "4755e11d7648ba7f", "scanner": "scanner-primary", "fingerprint": "e61c4636b5b32727", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-be4cb5e3cabcce80", "level": "note", "message": {"text": "Unused endpoint: POST /import"}, "properties": {"repobilityId": "57475c23e1a493f3", "scanner": "scanner-primary", "fingerprint": "be4cb5e3cabcce80", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3b62344955ccf15a", "level": "note", "message": {"text": "Unused endpoint: POST /{device_id}/validate"}, "properties": {"repobilityId": "8faaaad8eb137541", "scanner": "scanner-primary", "fingerprint": "3b62344955ccf15a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-11a9f047627d3284", "level": "note", "message": {"text": "Unused endpoint: GET /{device_id}/validation"}, "properties": {"repobilityId": "e8e1b0e94e3f26c8", "scanner": "scanner-primary", "fingerprint": "11a9f047627d3284", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-054be6a73f4db40c", "level": "note", "message": {"text": "Unused endpoint: POST /{device_id}/discover"}, "properties": {"repobilityId": "9dd7e6f109430b64", "scanner": "scanner-primary", "fingerprint": "054be6a73f4db40c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-00369c90db6707ee", "level": "note", "message": {"text": "Unused endpoint: GET /{device_id}/interfaces"}, "properties": {"repobilityId": "e96e772191752c6b", "scanner": "scanner-primary", "fingerprint": "00369c90db6707ee", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fa7055ec9d09ffc3", "level": "note", "message": {"text": "Unused endpoint: GET /{device_id}/lldp-neighbors"}, "properties": {"repobilityId": "043dcda4ef1f84f3", "scanner": "scanner-primary", "fingerprint": "fa7055ec9d09ffc3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f68108e7b54e0d94", "level": "note", "message": {"text": "Unused endpoint: GET /{device_id}/mac-table"}, "properties": {"repobilityId": "ffed4e29b6c65292", "scanner": "scanner-primary", "fingerprint": "f68108e7b54e0d94", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d9a1667abdcb9a4e", "level": "note", "message": {"text": "Unused endpoint: GET /{device_id}/arp"}, "properties": {"repobilityId": "90df481fc0594e6b", "scanner": "scanner-primary", "fingerprint": "d9a1667abdcb9a4e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3890ca8a5dbcc329", "level": "note", "message": {"text": "Unused endpoint: POST /{device_id}/suggest-profile"}, "properties": {"repobilityId": "249f27bf1c59a0ff", "scanner": "scanner-primary", "fingerprint": "3890ca8a5dbcc329", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-392d75e4fa29675a", "level": "note", "message": {"text": "Unused endpoint: POST /{device_id}/backup"}, "properties": {"repobilityId": "eac3f5a3902cbbb2", "scanner": "scanner-primary", "fingerprint": "392d75e4fa29675a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b07f003e56a17fe3", "level": "note", "message": {"text": "Unused endpoint: GET /{device_id}/backups"}, "properties": {"repobilityId": "b810de26caa89de2", "scanner": "scanner-primary", "fingerprint": "b07f003e56a17fe3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-93752516a72b66a7", "level": "note", "message": {"text": "Unused endpoint: GET /{device_id}/backups/{backup_id}"}, "properties": {"repobilityId": "70bb5d6d118bc05f", "scanner": "scanner-primary", "fingerprint": "93752516a72b66a7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8b3e64d3f8dd3719", "level": "note", "message": {"text": "Unused endpoint: GET /{device_id}/config-diff"}, "properties": {"repobilityId": "c8d4cf8cd02a8fdc", "scanner": "scanner-primary", "fingerprint": "8b3e64d3f8dd3719", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-802cf52c2c8eb891", "level": "note", "message": {"text": "Unused endpoint: POST /{device_id}/lldp/status"}, "properties": {"repobilityId": "b70e2f3a1e821482", "scanner": "scanner-primary", "fingerprint": "802cf52c2c8eb891", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-21a8ad9f134aed4d", "level": "note", "message": {"text": "Unused endpoint: POST /{device_id}/lldp/enable"}, "properties": {"repobilityId": "8eca823295fce786", "scanner": "scanner-primary", "fingerprint": "21a8ad9f134aed4d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fa5421b72b5c036a", "level": "note", "message": {"text": "Unused endpoint: GET /{device_id}/vpn-tunnels"}, "properties": {"repobilityId": "7ef229ca017cf2dd", "scanner": "scanner-primary", "fingerprint": "fa5421b72b5c036a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e024f136622938cc", "level": "note", "message": {"text": "Unused endpoint: PATCH /{device_id}/vpn-tunnels/{tunnel_id}"}, "properties": {"repobilityId": "c5c4eb76d501559c", "scanner": "scanner-primary", "fingerprint": "e024f136622938cc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b28816510eb71c4c", "level": "note", "message": {"text": "Unused endpoint: PATCH /{site_id}"}, "properties": {"repobilityId": "6a7842aedf907b42", "scanner": "scanner-primary", "fingerprint": "b28816510eb71c4c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-35e1c1da381823c7", "level": "note", "message": {"text": "Unused endpoint: POST /{site_id}/subnets"}, "properties": {"repobilityId": "99fcae043ac65978", "scanner": "scanner-primary", "fingerprint": "35e1c1da381823c7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bd81ec38e8551d23", "level": "note", "message": {"text": "Unused endpoint: DELETE /{site_id}/subnets/{subnet_id}"}, "properties": {"repobilityId": "dcae6c07320ff15b", "scanner": "scanner-primary", "fingerprint": "bd81ec38e8551d23", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-19738345a9e99c64", "level": "note", "message": {"text": "Unused endpoint: DELETE /{site_id}"}, "properties": {"repobilityId": "3fd35b42e4ad375b", "scanner": "scanner-primary", "fingerprint": "19738345a9e99c64", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-be13894ac7c431e6", "level": "note", "message": {"text": "Unused endpoint: DELETE /{credential_id}"}, "properties": {"repobilityId": "2c0b440b3de0cee0", "scanner": "scanner-primary", "fingerprint": "be13894ac7c431e6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}