{"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-8197528bd2679cef", "name": "Possibly dead Python function: connection_made", "shortDescription": {"text": "Possibly dead Python function: connection_made"}, "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-b5a44ff4bb81ad9b", "name": "Possibly dead Python function: datagram_received", "shortDescription": {"text": "Possibly dead Python function: datagram_received"}, "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-6177861b1b29c95a", "name": "Possibly dead Python function: error_received", "shortDescription": {"text": "Possibly dead Python function: error_received"}, "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-a7db746c047670c6", "name": "Possibly dead Python function: telegram_received_cb", "shortDescription": {"text": "Possibly dead Python function: telegram_received_cb"}, "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-b19c5d97dfdacdc0", "name": "Possibly dead Python function: telegram_received_cb", "shortDescription": {"text": "Possibly dead Python function: telegram_received_cb"}, "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-be99fb2874875258", "name": "Possibly dead Python function: datagram_received", "shortDescription": {"text": "Possibly dead Python function: datagram_received"}, "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-c6ca02749cde14f9", "name": "Possibly dead Python function: error_received", "shortDescription": {"text": "Possibly dead Python function: error_received"}, "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-001abd33707a6c2c", "name": "Possibly dead Python function: connection_lost", "shortDescription": {"text": "Possibly dead Python function: connection_lost"}, "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-47f7431d26fa7e84", "name": "Possibly dead Python function: extract_security_data", "shortDescription": {"text": "Possibly dead Python function: extract_security_data"}, "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-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-9710c8d059e53154", "name": "No frontend routes/components detected", "shortDescription": {"text": "No frontend routes/components detected"}, "fullDescription": {"text": "No React/Vue/Next routes were found. This is fine for backend-only repos."}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2be813124d96ae63", "name": "Insecure pattern 'document_write' in static/app.js:1537", "shortDescription": {"text": "Insecure pattern 'document_write' in static/app.js:1537"}, "fullDescription": {"text": "Found a known-risky pattern (document_write). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "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-524912d74d5881ec", "name": "Very large file: static/app.js (2385 lines)", "shortDescription": {"text": "Very large file: static/app.js (2385 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3ed644845837bc1c", "name": "Network/subprocess call without timeout or try/except \u2014 knx_tunnel_agent.py:57", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 knx_tunnel_agent.py:57"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1018445c17c376e4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 static/app.js:269", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 static/app.js:269"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7a9f3362ea709780", "name": "Blocking `httpx.get(...)` inside `async def lmstudio_models` \u2014 routers/llm.py:122", "shortDescription": {"text": "Blocking `httpx.get(...)` inside `async def lmstudio_models` \u2014 routers/llm.py:122"}, "fullDescription": {"text": "Sync I/O inside an async function blocks the event loop. While `httpx.get(...)` is running, *all* other coroutines on this loop are paused \u2014 silent throughput collapse under concurrency. Use the async equivalent (`httpx.AsyncClient`, `asyncio.sleep`, `aiofiles`) or wrap with `await asyncio.to_thread(...)`."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "high", "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:\nserver_public.py:dispatch, server_public.py:dispatch\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-86b4344d21ad2eb1", "name": "FastAPI POST `export_xlsx_public` without auth dependency \u2014 server_public.py:143", "shortDescription": {"text": "FastAPI POST `export_xlsx_public` without auth dependency \u2014 server_public.py:143"}, "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-34e4a31ee50efed6", "name": "FastAPI POST `parse_project` without auth dependency \u2014 server_public.py:156", "shortDescription": {"text": "FastAPI POST `parse_project` without auth dependency \u2014 server_public.py:156"}, "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-beaf07974adc3042", "name": "FastAPI POST `set_gateway` without auth dependency \u2014 server.py:502", "shortDescription": {"text": "FastAPI POST `set_gateway` without auth dependency \u2014 server.py:502"}, "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-56846ffeab0bb73f", "name": "FastAPI POST `save_annotations` without auth dependency \u2014 server.py:554", "shortDescription": {"text": "FastAPI POST `save_annotations` without auth dependency \u2014 server.py:554"}, "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-c9cdd1fe689282d3", "name": "FastAPI POST `parse_project` without auth dependency \u2014 server.py:736", "shortDescription": {"text": "FastAPI POST `parse_project` without auth dependency \u2014 server.py:736"}, "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-84fed42832711394", "name": "FastAPI POST `wg_setup_endpoint` without auth dependency \u2014 routers/wireguard.py:203", "shortDescription": {"text": "FastAPI POST `wg_setup_endpoint` without auth dependency \u2014 routers/wireguard.py:203"}, "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-98ba2552f72a804c", "name": "FastAPI POST `wg_peer_endpoint` without auth dependency \u2014 routers/wireguard.py:234", "shortDescription": {"text": "FastAPI POST `wg_peer_endpoint` without auth dependency \u2014 routers/wireguard.py:234"}, "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-758fcbf2501be089", "name": "FastAPI POST `wg_ets_access` without auth dependency \u2014 routers/wireguard.py:277", "shortDescription": {"text": "FastAPI POST `wg_ets_access` without auth dependency \u2014 routers/wireguard.py:277"}, "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-48152d6c10aac7af", "name": "FastAPI POST `wg_latency_test` without auth dependency \u2014 routers/wireguard.py:292", "shortDescription": {"text": "FastAPI POST `wg_latency_test` without auth dependency \u2014 routers/wireguard.py:292"}, "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-44e03e9598b2065a", "name": "FastAPI DELETE `wg_teardown` without auth dependency \u2014 routers/wireguard.py:315", "shortDescription": {"text": "FastAPI DELETE `wg_teardown` without auth dependency \u2014 routers/wireguard.py:315"}, "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-46ba770d59366c8a", "name": "FastAPI POST `ga_scan` without auth dependency \u2014 routers/scan.py:25", "shortDescription": {"text": "FastAPI POST `ga_scan` without auth dependency \u2014 routers/scan.py:25"}, "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-c90c77d21ba916e5", "name": "FastAPI POST `ga_scan_cancel` without auth dependency \u2014 routers/scan.py:100", "shortDescription": {"text": "FastAPI POST `ga_scan_cancel` without auth dependency \u2014 routers/scan.py:100"}, "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-6316b1a3470d8c80", "name": "FastAPI POST `bus_scan` without auth dependency \u2014 routers/scan.py:106", "shortDescription": {"text": "FastAPI POST `bus_scan` without auth dependency \u2014 routers/scan.py:106"}, "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-876f7c2165779b0b", "name": "FastAPI POST `bus_scan_cancel` without auth dependency \u2014 routers/scan.py:168", "shortDescription": {"text": "FastAPI POST `bus_scan_cancel` without auth dependency \u2014 routers/scan.py:168"}, "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-3e5bd39efff236c9", "name": "FastAPI POST `set_llm_config` without auth dependency \u2014 routers/llm.py:142", "shortDescription": {"text": "FastAPI POST `set_llm_config` without auth dependency \u2014 routers/llm.py:142"}, "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-5983df32710b57a0", "name": "FastAPI POST `llm_analyze` without auth dependency \u2014 routers/llm.py:164", "shortDescription": {"text": "FastAPI POST `llm_analyze` without auth dependency \u2014 routers/llm.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-7ea1b22e14a2425b", "name": "FastAPI POST `llm_compare` without auth dependency \u2014 routers/llm.py:213", "shortDescription": {"text": "FastAPI POST `llm_compare` without auth dependency \u2014 routers/llm.py:213"}, "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-f9b1497d61400189", "name": "FastAPI POST `ga_write` without auth dependency \u2014 routers/ga_ops.py:26", "shortDescription": {"text": "FastAPI POST `ga_write` without auth dependency \u2014 routers/ga_ops.py:26"}, "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-189cabbbe1378374", "name": "FastAPI POST `ga_read` without auth dependency \u2014 routers/ga_ops.py:109", "shortDescription": {"text": "FastAPI POST `ga_read` without auth dependency \u2014 routers/ga_ops.py:109"}, "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-b9ce07f668e8376e", "name": "FastAPI POST `ga_read_all` without auth dependency \u2014 routers/ga_ops.py:128", "shortDescription": {"text": "FastAPI POST `ga_read_all` without auth dependency \u2014 routers/ga_ops.py:128"}, "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-3c07ba972375b2c0", "name": "FastAPI POST `create_snapshot` without auth dependency \u2014 routers/snapshots.py:50", "shortDescription": {"text": "FastAPI POST `create_snapshot` without auth dependency \u2014 routers/snapshots.py:50"}, "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-4e7f52c4d975ffd8", "name": "FastAPI DELETE `delete_snapshot` without auth dependency \u2014 routers/snapshots.py:131", "shortDescription": {"text": "FastAPI DELETE `delete_snapshot` without auth dependency \u2014 routers/snapshots.py:131"}, "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-f2ae91828635eb09", "name": "FastAPI POST `save_notes` without auth dependency \u2014 routers/recent_projects.py:38", "shortDescription": {"text": "FastAPI POST `save_notes` without auth dependency \u2014 routers/recent_projects.py:38"}, "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-4ec23eab694b6513", "name": "FastAPI DELETE `delete_recent_project` without auth dependency \u2014 routers/recent_projects.py:109", "shortDescription": {"text": "FastAPI DELETE `delete_recent_project` without auth dependency \u2014 routers/recent_projects.py:109"}, "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-139cda4b1f85106d", "name": "Dangling fetch: GET /api/wireguard/status (static/app.js:260)", "shortDescription": {"text": "Dangling fetch: GET /api/wireguard/status (static/app.js:260)"}, "fullDescription": {"text": "`static/app.js:260` calls `GET /api/wireguard/status` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/wireguard/status`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8289594ea6e23a69", "name": "Dangling fetch: GET /api/wireguard/config (static/app.js:269)", "shortDescription": {"text": "Dangling fetch: GET /api/wireguard/config (static/app.js:269)"}, "fullDescription": {"text": "`static/app.js:269` calls `GET /api/wireguard/config` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/wireguard/config`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b88b75e17d2f117c", "name": "Dangling fetch: POST /api/wireguard/setup (static/app.js:306)", "shortDescription": {"text": "Dangling fetch: POST /api/wireguard/setup (static/app.js:306)"}, "fullDescription": {"text": "`static/app.js:306` calls `POST /api/wireguard/setup` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/wireguard/setup`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4ef7918ada7df1c6", "name": "Dangling fetch: DELETE /api/wireguard/setup (static/app.js:326)", "shortDescription": {"text": "Dangling fetch: DELETE /api/wireguard/setup (static/app.js:326)"}, "fullDescription": {"text": "`static/app.js:326` calls `DELETE /api/wireguard/setup` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/wireguard/setup`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-17c2e1968b4573a3", "name": "Dangling fetch: POST /api/wireguard/ets-access (static/app.js:338)", "shortDescription": {"text": "Dangling fetch: POST /api/wireguard/ets-access (static/app.js:338)"}, "fullDescription": {"text": "`static/app.js:338` calls `POST /api/wireguard/ets-access` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/wireguard/ets-access`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7548542df250eef1", "name": "Dangling fetch: POST /api/wireguard/latency-test (static/app.js:352)", "shortDescription": {"text": "Dangling fetch: POST /api/wireguard/latency-test (static/app.js:352)"}, "fullDescription": {"text": "`static/app.js:352` calls `POST /api/wireguard/latency-test` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/wireguard/latency-test`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6420c502f9e619d1", "name": "Dangling fetch: GET /api/recent-projects (static/app.js:507)", "shortDescription": {"text": "Dangling fetch: GET /api/recent-projects (static/app.js:507)"}, "fullDescription": {"text": "`static/app.js:507` calls `GET /api/recent-projects` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/recent-projects`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ad0dedb42ce5b25d", "name": "Dangling fetch: GET /api/recent-projects/notes (static/app.js:514)", "shortDescription": {"text": "Dangling fetch: GET /api/recent-projects/notes (static/app.js:514)"}, "fullDescription": {"text": "`static/app.js:514` calls `GET /api/recent-projects/notes` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/recent-projects/notes`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d42e00ce435a6b54", "name": "Dangling fetch: GET /api/recent-projects/${this.selectedRecentSlug}/data (static/app.js:524)", "shortDescription": {"text": "Dangling fetch: GET /api/recent-projects/${this.selectedRecentSlug}/data (static/app.js:524)"}, "fullDescription": {"text": "`static/app.js:524` calls `GET /api/recent-projects/${this.selectedRecentSlug}/data` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/recent-projects/<p>/data`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e60c2730355ef3f4", "name": "Dangling fetch: DELETE /api/recent-projects/${slug} (static/app.js:542)", "shortDescription": {"text": "Dangling fetch: DELETE /api/recent-projects/${slug} (static/app.js:542)"}, "fullDescription": {"text": "`static/app.js:542` calls `DELETE /api/recent-projects/${slug}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/recent-projects/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-31bde2c187c18ee5", "name": "Dangling fetch: GET /api/recent-projects/${proj.slug}/data (static/app.js:550)", "shortDescription": {"text": "Dangling fetch: GET /api/recent-projects/${proj.slug}/data (static/app.js:550)"}, "fullDescription": {"text": "`static/app.js:550` calls `GET /api/recent-projects/${proj.slug}/data` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/recent-projects/<p>/data`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-936a5fedf4317b7f", "name": "Dangling fetch: GET /api/recent-projects/${proj.slug}/xml (static/app.js:575)", "shortDescription": {"text": "Dangling fetch: GET /api/recent-projects/${proj.slug}/xml (static/app.js:575)"}, "fullDescription": {"text": "`static/app.js:575` calls `GET /api/recent-projects/${proj.slug}/xml` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/recent-projects/<p>/xml`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ef4db4da1a1c7ce7", "name": "Dangling fetch: POST /api/recent-projects/${this.notesModalSlug}/notes (static/app.js:592)", "shortDescription": {"text": "Dangling fetch: POST /api/recent-projects/${this.notesModalSlug}/notes (static/app.js:592)"}, "fullDescription": {"text": "`static/app.js:592` calls `POST /api/recent-projects/${this.notesModalSlug}/notes` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/recent-projects/<p>/notes`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-cab22b767b8b75cf", "name": "Dangling fetch: POST /api/ga/write (static/app.js:688)", "shortDescription": {"text": "Dangling fetch: POST /api/ga/write (static/app.js:688)"}, "fullDescription": {"text": "`static/app.js:688` calls `POST /api/ga/write` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ga/write`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-365cccdf9285dfc9", "name": "Dangling fetch: POST /api/ga/read (static/app.js:704)", "shortDescription": {"text": "Dangling fetch: POST /api/ga/read (static/app.js:704)"}, "fullDescription": {"text": "`static/app.js:704` calls `POST /api/ga/read` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ga/read`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-87e28c43549c2595", "name": "Dangling fetch: POST /api/ga/read-all (static/app.js:717)", "shortDescription": {"text": "Dangling fetch: POST /api/ga/read-all (static/app.js:717)"}, "fullDescription": {"text": "`static/app.js:717` calls `POST /api/ga/read-all` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ga/read-all`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a87b2c1af41837b9", "name": "Dangling fetch: GET /api/llm/config (static/app.js:732)", "shortDescription": {"text": "Dangling fetch: GET /api/llm/config (static/app.js:732)"}, "fullDescription": {"text": "`static/app.js:732` calls `GET /api/llm/config` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/llm/config`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b8207c90a2628375", "name": "Dangling fetch: GET /api/llm/lmstudio/models (static/app.js:746)", "shortDescription": {"text": "Dangling fetch: GET /api/llm/lmstudio/models (static/app.js:746)"}, "fullDescription": {"text": "`static/app.js:746` calls `GET /api/llm/lmstudio/models` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/llm/lmstudio/models`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6415bf38cc45134a", "name": "Dangling fetch: POST /api/llm/config (static/app.js:773)", "shortDescription": {"text": "Dangling fetch: POST /api/llm/config (static/app.js:773)"}, "fullDescription": {"text": "`static/app.js:773` calls `POST /api/llm/config` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/llm/config`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6ac852540536e5d1", "name": "Dangling fetch: POST /api/llm/analyze (static/app.js:806)", "shortDescription": {"text": "Dangling fetch: POST /api/llm/analyze (static/app.js:806)"}, "fullDescription": {"text": "`static/app.js:806` calls `POST /api/llm/analyze` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/llm/analyze`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-71a0aa60beb34eac", "name": "Dangling fetch: GET /api/recent-projects/${encodeURIComponent(this.compareSlug)}/raw (static/app.js:937)", "shortDescription": {"text": "Dangling fetch: GET /api/recent-projects/${encodeURIComponent(this.compareSlug)}/raw (static/app.js:937)"}, "fullDescription": {"text": "`static/app.js:937` calls `GET /api/recent-projects/${encodeURIComponent(this.compareSlug)}/raw` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/recent-projects/<p>/raw`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-33397bf1c6f5bbf1", "name": "Dangling fetch: POST /api/llm/compare (static/app.js:952)", "shortDescription": {"text": "Dangling fetch: POST /api/llm/compare (static/app.js:952)"}, "fullDescription": {"text": "`static/app.js:952` calls `POST /api/llm/compare` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/llm/compare`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-29d02c422db1ad97", "name": "Dangling fetch: GET /api/snapshots (static/app.js:2058)", "shortDescription": {"text": "Dangling fetch: GET /api/snapshots (static/app.js:2058)"}, "fullDescription": {"text": "`static/app.js:2058` calls `GET /api/snapshots` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/snapshots`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6c359013c22aeb53", "name": "Dangling fetch: POST /api/snapshots (static/app.js:2069)", "shortDescription": {"text": "Dangling fetch: POST /api/snapshots (static/app.js:2069)"}, "fullDescription": {"text": "`static/app.js:2069` calls `POST /api/snapshots` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/snapshots`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f85fbffe1ce142c7", "name": "Dangling fetch: DELETE /api/snapshots/${encodeURIComponent(id)} (static/app.js:2091)", "shortDescription": {"text": "Dangling fetch: DELETE /api/snapshots/${encodeURIComponent(id)} (static/app.js:2091)"}, "fullDescription": {"text": "`static/app.js:2091` calls `DELETE /api/snapshots/${encodeURIComponent(id)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/snapshots/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`server_public.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-292707b23cf3cc89", "name": "Unused endpoint: GET /api/current-values", "shortDescription": {"text": "Unused endpoint: GET /api/current-values"}, "fullDescription": {"text": "`server.py` declares `GET /api/current-values` 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-06b603fde47f0b49", "name": "Unused endpoint: GET /api/last-project/info", "shortDescription": {"text": "Unused endpoint: GET /api/last-project/info"}, "fullDescription": {"text": "`server.py` declares `GET /api/last-project/info` 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-1ee169aa5640a319", "name": "Unused endpoint: GET /api/log", "shortDescription": {"text": "Unused endpoint: GET /api/log"}, "fullDescription": {"text": "`server.py` declares `GET /api/log` 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-3a9a776cfeb5887b", "name": "Unused endpoint: GET /api/log/export.csv", "shortDescription": {"text": "Unused endpoint: GET /api/log/export.csv"}, "fullDescription": {"text": "`server.py` declares `GET /api/log/export.csv` 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-a6f48e60c30777ab", "name": "Unused endpoint: GET /config", "shortDescription": {"text": "Unused endpoint: GET /config"}, "fullDescription": {"text": "`routers/wireguard.py` declares `GET /config` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-eb757797f6bd3444", "name": "Unused endpoint: POST /setup", "shortDescription": {"text": "Unused endpoint: POST /setup"}, "fullDescription": {"text": "`routers/wireguard.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-27498e0ddc597267", "name": "Unused endpoint: POST /peer", "shortDescription": {"text": "Unused endpoint: POST /peer"}, "fullDescription": {"text": "`routers/wireguard.py` declares `POST /peer` 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-6f77e5d5bd632d72", "name": "Unused endpoint: GET /peer-config", "shortDescription": {"text": "Unused endpoint: GET /peer-config"}, "fullDescription": {"text": "`routers/wireguard.py` declares `GET /peer-config` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-dde75da268c2def4", "name": "Unused endpoint: POST /ets-access", "shortDescription": {"text": "Unused endpoint: POST /ets-access"}, "fullDescription": {"text": "`routers/wireguard.py` declares `POST /ets-access` 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-28aac16ea168bb0e", "name": "Unused endpoint: POST /latency-test", "shortDescription": {"text": "Unused endpoint: POST /latency-test"}, "fullDescription": {"text": "`routers/wireguard.py` declares `POST /latency-test` 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-c89f443df81224bb", "name": "Unused endpoint: DELETE /setup", "shortDescription": {"text": "Unused endpoint: DELETE /setup"}, "fullDescription": {"text": "`routers/wireguard.py` declares `DELETE /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-75e54e9765e5a8c3", "name": "Unused endpoint: GET /api/bus/programming-mode", "shortDescription": {"text": "Unused endpoint: GET /api/bus/programming-mode"}, "fullDescription": {"text": "`routers/scan.py` declares `GET /api/bus/programming-mode` 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-ad2865997a7b597e", "name": "Unused endpoint: GET /api/device/{addr}/properties", "shortDescription": {"text": "Unused endpoint: GET /api/device/{addr}/properties"}, "fullDescription": {"text": "`routers/scan.py` declares `GET /api/device/{addr}/properties` 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-f720337ebc9b64d3", "name": "Unused endpoint: GET /lmstudio/models", "shortDescription": {"text": "Unused endpoint: GET /lmstudio/models"}, "fullDescription": {"text": "`routers/llm.py` declares `GET /lmstudio/models` 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-0666d1d987815276", "name": "Unused endpoint: POST /config", "shortDescription": {"text": "Unused endpoint: POST /config"}, "fullDescription": {"text": "`routers/llm.py` declares `POST /config` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fca11d494725d7c3", "name": "Unused endpoint: POST /analyze", "shortDescription": {"text": "Unused endpoint: POST /analyze"}, "fullDescription": {"text": "`routers/llm.py` declares `POST /analyze` 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-5cf10967b5fa0cac", "name": "Unused endpoint: POST /compare", "shortDescription": {"text": "Unused endpoint: POST /compare"}, "fullDescription": {"text": "`routers/llm.py` declares `POST /compare` 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-f67c8b3020a57e65", "name": "Unused endpoint: POST /write", "shortDescription": {"text": "Unused endpoint: POST /write"}, "fullDescription": {"text": "`routers/ga_ops.py` declares `POST /write` 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-3dfa27698203a144", "name": "Unused endpoint: POST /read", "shortDescription": {"text": "Unused endpoint: POST /read"}, "fullDescription": {"text": "`routers/ga_ops.py` declares `POST /read` 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-f8d576f6bf0f5660", "name": "Unused endpoint: POST /read-all", "shortDescription": {"text": "Unused endpoint: POST /read-all"}, "fullDescription": {"text": "`routers/ga_ops.py` declares `POST /read-all` 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": "`routers/snapshots.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-8b1b274b32469392", "name": "Unused endpoint: GET /diff", "shortDescription": {"text": "Unused endpoint: GET /diff"}, "fullDescription": {"text": "`routers/snapshots.py` declares `GET /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-f0ec7c44529c217a", "name": "Unused endpoint: DELETE /{sid}", "shortDescription": {"text": "Unused endpoint: DELETE /{sid}"}, "fullDescription": {"text": "`routers/snapshots.py` declares `DELETE /{sid}` 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-450115406f7a540e", "name": "Unused endpoint: GET /notes", "shortDescription": {"text": "Unused endpoint: GET /notes"}, "fullDescription": {"text": "`routers/recent_projects.py` declares `GET /notes` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8c47a69b353b118d", "name": "Unused endpoint: POST /{slug}/notes", "shortDescription": {"text": "Unused endpoint: POST /{slug}/notes"}, "fullDescription": {"text": "`routers/recent_projects.py` declares `POST /{slug}/notes` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a20243bfd8a31bde", "name": "Unused endpoint: GET /{slug}/knxproj", "shortDescription": {"text": "Unused endpoint: GET /{slug}/knxproj"}, "fullDescription": {"text": "`routers/recent_projects.py` declares `GET /{slug}/knxproj` 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-95dde0442249b699", "name": "Unused endpoint: GET /{slug}/xml", "shortDescription": {"text": "Unused endpoint: GET /{slug}/xml"}, "fullDescription": {"text": "`routers/recent_projects.py` declares `GET /{slug}/xml` 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-1a8705db6c698e43", "name": "Unused endpoint: GET /{slug}/data", "shortDescription": {"text": "Unused endpoint: GET /{slug}/data"}, "fullDescription": {"text": "`routers/recent_projects.py` declares `GET /{slug}/data` 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-6af3ab252307b440", "name": "Unused endpoint: GET /{slug}/raw", "shortDescription": {"text": "Unused endpoint: GET /{slug}/raw"}, "fullDescription": {"text": "`routers/recent_projects.py` declares `GET /{slug}/raw` 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-115736d40adf25ab", "name": "Unused endpoint: DELETE /{slug}", "shortDescription": {"text": "Unused endpoint: DELETE /{slug}"}, "fullDescription": {"text": "`routers/recent_projects.py` declares `DELETE /{slug}` 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/22675"}, "properties": {"repository": "whaeuser/open-knxviewer", "repoUrl": "https://github.com/whaeuser/open-knxviewer", "branch": "main"}, "results": [{"ruleId": "scanner-8197528bd2679cef", "level": "note", "message": {"text": "Possibly dead Python function: connection_made"}, "properties": {"repobilityId": "3bc7fe4c61b0a6b9", "scanner": "scanner-primary", "fingerprint": "8197528bd2679cef", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "knx_tunnel_agent.py:193"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b5a44ff4bb81ad9b", "level": "note", "message": {"text": "Possibly dead Python function: datagram_received"}, "properties": {"repobilityId": "a63a7a6bcf45d278", "scanner": "scanner-primary", "fingerprint": "b5a44ff4bb81ad9b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "knx_tunnel_agent.py:196"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6177861b1b29c95a", "level": "note", "message": {"text": "Possibly dead Python function: error_received"}, "properties": {"repobilityId": "243f5601bc9af9f9", "scanner": "scanner-primary", "fingerprint": "6177861b1b29c95a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "knx_tunnel_agent.py:199"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a7db746c047670c6", "level": "note", "message": {"text": "Possibly dead Python function: telegram_received_cb"}, "properties": {"repobilityId": "947e1e41adafbf95", "scanner": "scanner-primary", "fingerprint": "a7db746c047670c6", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "knx_gateway_proxy.py:91"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b19c5d97dfdacdc0", "level": "note", "message": {"text": "Possibly dead Python function: telegram_received_cb"}, "properties": {"repobilityId": "947e1e41adafbf95", "scanner": "scanner-primary", "fingerprint": "b19c5d97dfdacdc0", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server.py:77"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-be99fb2874875258", "level": "note", "message": {"text": "Possibly dead Python function: datagram_received"}, "properties": {"repobilityId": "a63a7a6bcf45d278", "scanner": "scanner-primary", "fingerprint": "be99fb2874875258", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server.py:415"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c6ca02749cde14f9", "level": "note", "message": {"text": "Possibly dead Python function: error_received"}, "properties": {"repobilityId": "243f5601bc9af9f9", "scanner": "scanner-primary", "fingerprint": "c6ca02749cde14f9", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server.py:419"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-001abd33707a6c2c", "level": "note", "message": {"text": "Possibly dead Python function: connection_lost"}, "properties": {"repobilityId": "be5b9d3363bebfcf", "scanner": "scanner-primary", "fingerprint": "001abd33707a6c2c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server.py:423"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-47f7431d26fa7e84", "level": "note", "message": {"text": "Possibly dead Python function: extract_security_data"}, "properties": {"repobilityId": "4fb6a3b7ef2f88f1", "scanner": "scanner-primary", "fingerprint": "47f7431d26fa7e84", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "common.py:28"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"ruleId": "scanner-9710c8d059e53154", "level": "none", "message": {"text": "No frontend routes/components detected"}, "properties": {"repobilityId": "44ca61485762e494", "scanner": "scanner-primary", "fingerprint": "9710c8d059e53154", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-2be813124d96ae63", "level": "note", "message": {"text": "Insecure pattern 'document_write' in static/app.js:1537"}, "properties": {"repobilityId": "c7da7d089af92459", "scanner": "scanner-primary", "fingerprint": "2be813124d96ae63", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/app.js"}, "region": {"startLine": 1537}}}]}, {"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-524912d74d5881ec", "level": "note", "message": {"text": "Very large file: static/app.js (2385 lines)"}, "properties": {"repobilityId": "1c051419cfdea300", "scanner": "scanner-primary", "fingerprint": "524912d74d5881ec", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "3752c2d122d44307", "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": "52c4f8118cbfa403", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ed644845837bc1c", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 knx_tunnel_agent.py:57"}, "properties": {"repobilityId": "793863763c261186", "scanner": "scanner-primary", "fingerprint": "3ed644845837bc1c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1018445c17c376e4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 static/app.js:269"}, "properties": {"repobilityId": "8bf53b7e157123de", "scanner": "scanner-primary", "fingerprint": "1018445c17c376e4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7a9f3362ea709780", "level": "error", "message": {"text": "Blocking `httpx.get(...)` inside `async def lmstudio_models` \u2014 routers/llm.py:122"}, "properties": {"repobilityId": "ef211f31d322637b", "scanner": "scanner-primary", "fingerprint": "7a9f3362ea709780", "layer": "quality", "severity": "high", "confidence": 1.0, "tags": ["integrity", "sync-io-in-async", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routers/llm.py"}, "region": {"startLine": 122}}}]}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "4fc2c22c69b99d82", "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": "7324d061231de195", "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": "e48ee1e865c3db2b", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-86b4344d21ad2eb1", "level": "error", "message": {"text": "FastAPI POST `export_xlsx_public` without auth dependency \u2014 server_public.py:143"}, "properties": {"repobilityId": "cc2776ca9a13358f", "scanner": "scanner-primary", "fingerprint": "86b4344d21ad2eb1", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server_public.py"}, "region": {"startLine": 143}}}]}, {"ruleId": "scanner-34e4a31ee50efed6", "level": "error", "message": {"text": "FastAPI POST `parse_project` without auth dependency \u2014 server_public.py:156"}, "properties": {"repobilityId": "2b8acdf0cba1d7bd", "scanner": "scanner-primary", "fingerprint": "34e4a31ee50efed6", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server_public.py"}, "region": {"startLine": 156}}}]}, {"ruleId": "scanner-beaf07974adc3042", "level": "error", "message": {"text": "FastAPI POST `set_gateway` without auth dependency \u2014 server.py:502"}, "properties": {"repobilityId": "bb380ea683a9c784", "scanner": "scanner-primary", "fingerprint": "beaf07974adc3042", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server.py"}, "region": {"startLine": 502}}}]}, {"ruleId": "scanner-56846ffeab0bb73f", "level": "error", "message": {"text": "FastAPI POST `save_annotations` without auth dependency \u2014 server.py:554"}, "properties": {"repobilityId": "50971c3ecd071352", "scanner": "scanner-primary", "fingerprint": "56846ffeab0bb73f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server.py"}, "region": {"startLine": 554}}}]}, {"ruleId": "scanner-c9cdd1fe689282d3", "level": "error", "message": {"text": "FastAPI POST `parse_project` without auth dependency \u2014 server.py:736"}, "properties": {"repobilityId": "4d89fdee686c73a6", "scanner": "scanner-primary", "fingerprint": "c9cdd1fe689282d3", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server.py"}, "region": {"startLine": 736}}}]}, {"ruleId": "scanner-84fed42832711394", "level": "error", "message": {"text": "FastAPI POST `wg_setup_endpoint` without auth dependency \u2014 routers/wireguard.py:203"}, "properties": {"repobilityId": "3dbf15d5c34f5560", "scanner": "scanner-primary", "fingerprint": "84fed42832711394", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routers/wireguard.py"}, "region": {"startLine": 203}}}]}, {"ruleId": "scanner-98ba2552f72a804c", "level": "error", "message": {"text": "FastAPI POST `wg_peer_endpoint` without auth dependency \u2014 routers/wireguard.py:234"}, "properties": {"repobilityId": "000fd8acef96b2ed", "scanner": "scanner-primary", "fingerprint": "98ba2552f72a804c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routers/wireguard.py"}, "region": {"startLine": 234}}}]}, {"ruleId": "scanner-758fcbf2501be089", "level": "error", "message": {"text": "FastAPI POST `wg_ets_access` without auth dependency \u2014 routers/wireguard.py:277"}, "properties": {"repobilityId": "f5f0e9517176ab87", "scanner": "scanner-primary", "fingerprint": "758fcbf2501be089", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routers/wireguard.py"}, "region": {"startLine": 277}}}]}, {"ruleId": "scanner-48152d6c10aac7af", "level": "error", "message": {"text": "FastAPI POST `wg_latency_test` without auth dependency \u2014 routers/wireguard.py:292"}, "properties": {"repobilityId": "24c888f2a583d462", "scanner": "scanner-primary", "fingerprint": "48152d6c10aac7af", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routers/wireguard.py"}, "region": {"startLine": 292}}}]}, {"ruleId": "scanner-44e03e9598b2065a", "level": "error", "message": {"text": "FastAPI DELETE `wg_teardown` without auth dependency \u2014 routers/wireguard.py:315"}, "properties": {"repobilityId": "600febaf930deb2a", "scanner": "scanner-primary", "fingerprint": "44e03e9598b2065a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routers/wireguard.py"}, "region": {"startLine": 315}}}]}, {"ruleId": "scanner-46ba770d59366c8a", "level": "error", "message": {"text": "FastAPI POST `ga_scan` without auth dependency \u2014 routers/scan.py:25"}, "properties": {"repobilityId": "db076a2ee285cbcd", "scanner": "scanner-primary", "fingerprint": "46ba770d59366c8a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routers/scan.py"}, "region": {"startLine": 25}}}]}, {"ruleId": "scanner-c90c77d21ba916e5", "level": "error", "message": {"text": "FastAPI POST `ga_scan_cancel` without auth dependency \u2014 routers/scan.py:100"}, "properties": {"repobilityId": "fb31ba7cf4338dfb", "scanner": "scanner-primary", "fingerprint": "c90c77d21ba916e5", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routers/scan.py"}, "region": {"startLine": 100}}}]}, {"ruleId": "scanner-6316b1a3470d8c80", "level": "error", "message": {"text": "FastAPI POST `bus_scan` without auth dependency \u2014 routers/scan.py:106"}, "properties": {"repobilityId": "ccb199c8a127e571", "scanner": "scanner-primary", "fingerprint": "6316b1a3470d8c80", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routers/scan.py"}, "region": {"startLine": 106}}}]}, {"ruleId": "scanner-876f7c2165779b0b", "level": "error", "message": {"text": "FastAPI POST `bus_scan_cancel` without auth dependency \u2014 routers/scan.py:168"}, "properties": {"repobilityId": "cc5981629851a97b", "scanner": "scanner-primary", "fingerprint": "876f7c2165779b0b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routers/scan.py"}, "region": {"startLine": 168}}}]}, {"ruleId": "scanner-3e5bd39efff236c9", "level": "error", "message": {"text": "FastAPI POST `set_llm_config` without auth dependency \u2014 routers/llm.py:142"}, "properties": {"repobilityId": "23a7a338fbacc8ac", "scanner": "scanner-primary", "fingerprint": "3e5bd39efff236c9", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routers/llm.py"}, "region": {"startLine": 142}}}]}, {"ruleId": "scanner-5983df32710b57a0", "level": "error", "message": {"text": "FastAPI POST `llm_analyze` without auth dependency \u2014 routers/llm.py:164"}, "properties": {"repobilityId": "f81d1688c6351f80", "scanner": "scanner-primary", "fingerprint": "5983df32710b57a0", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routers/llm.py"}, "region": {"startLine": 164}}}]}, {"ruleId": "scanner-7ea1b22e14a2425b", "level": "error", "message": {"text": "FastAPI POST `llm_compare` without auth dependency \u2014 routers/llm.py:213"}, "properties": {"repobilityId": "ef2ac442345e30c3", "scanner": "scanner-primary", "fingerprint": "7ea1b22e14a2425b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routers/llm.py"}, "region": {"startLine": 213}}}]}, {"ruleId": "scanner-f9b1497d61400189", "level": "error", "message": {"text": "FastAPI POST `ga_write` without auth dependency \u2014 routers/ga_ops.py:26"}, "properties": {"repobilityId": "6f111ae7b1de7375", "scanner": "scanner-primary", "fingerprint": "f9b1497d61400189", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routers/ga_ops.py"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-189cabbbe1378374", "level": "error", "message": {"text": "FastAPI POST `ga_read` without auth dependency \u2014 routers/ga_ops.py:109"}, "properties": {"repobilityId": "034f7f53579206e7", "scanner": "scanner-primary", "fingerprint": "189cabbbe1378374", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routers/ga_ops.py"}, "region": {"startLine": 109}}}]}, {"ruleId": "scanner-b9ce07f668e8376e", "level": "error", "message": {"text": "FastAPI POST `ga_read_all` without auth dependency \u2014 routers/ga_ops.py:128"}, "properties": {"repobilityId": "9374b15c4ba8baef", "scanner": "scanner-primary", "fingerprint": "b9ce07f668e8376e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routers/ga_ops.py"}, "region": {"startLine": 128}}}]}, {"ruleId": "scanner-3c07ba972375b2c0", "level": "error", "message": {"text": "FastAPI POST `create_snapshot` without auth dependency \u2014 routers/snapshots.py:50"}, "properties": {"repobilityId": "b055bd9e228aac22", "scanner": "scanner-primary", "fingerprint": "3c07ba972375b2c0", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routers/snapshots.py"}, "region": {"startLine": 50}}}]}, {"ruleId": "scanner-4e7f52c4d975ffd8", "level": "error", "message": {"text": "FastAPI DELETE `delete_snapshot` without auth dependency \u2014 routers/snapshots.py:131"}, "properties": {"repobilityId": "65549b30e762d02d", "scanner": "scanner-primary", "fingerprint": "4e7f52c4d975ffd8", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routers/snapshots.py"}, "region": {"startLine": 131}}}]}, {"ruleId": "scanner-f2ae91828635eb09", "level": "error", "message": {"text": "FastAPI POST `save_notes` without auth dependency \u2014 routers/recent_projects.py:38"}, "properties": {"repobilityId": "c1102a7f58c80171", "scanner": "scanner-primary", "fingerprint": "f2ae91828635eb09", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routers/recent_projects.py"}, "region": {"startLine": 38}}}]}, {"ruleId": "scanner-4ec23eab694b6513", "level": "error", "message": {"text": "FastAPI DELETE `delete_recent_project` without auth dependency \u2014 routers/recent_projects.py:109"}, "properties": {"repobilityId": "f12147f186e3dab2", "scanner": "scanner-primary", "fingerprint": "4ec23eab694b6513", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routers/recent_projects.py"}, "region": {"startLine": 109}}}]}, {"ruleId": "scanner-139cda4b1f85106d", "level": "error", "message": {"text": "Dangling fetch: GET /api/wireguard/status (static/app.js:260)"}, "properties": {"repobilityId": "d0afa388f74d5c82", "scanner": "scanner-primary", "fingerprint": "139cda4b1f85106d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8289594ea6e23a69", "level": "error", "message": {"text": "Dangling fetch: GET /api/wireguard/config (static/app.js:269)"}, "properties": {"repobilityId": "c95f05fc06a1d10e", "scanner": "scanner-primary", "fingerprint": "8289594ea6e23a69", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b88b75e17d2f117c", "level": "error", "message": {"text": "Dangling fetch: POST /api/wireguard/setup (static/app.js:306)"}, "properties": {"repobilityId": "04f9aa95a3f30e2a", "scanner": "scanner-primary", "fingerprint": "b88b75e17d2f117c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4ef7918ada7df1c6", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/wireguard/setup (static/app.js:326)"}, "properties": {"repobilityId": "48ae0016fd92f1ed", "scanner": "scanner-primary", "fingerprint": "4ef7918ada7df1c6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-17c2e1968b4573a3", "level": "error", "message": {"text": "Dangling fetch: POST /api/wireguard/ets-access (static/app.js:338)"}, "properties": {"repobilityId": "c5d3077dca891a38", "scanner": "scanner-primary", "fingerprint": "17c2e1968b4573a3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7548542df250eef1", "level": "error", "message": {"text": "Dangling fetch: POST /api/wireguard/latency-test (static/app.js:352)"}, "properties": {"repobilityId": "73c60142a09c28a7", "scanner": "scanner-primary", "fingerprint": "7548542df250eef1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6420c502f9e619d1", "level": "error", "message": {"text": "Dangling fetch: GET /api/recent-projects (static/app.js:507)"}, "properties": {"repobilityId": "1db243fbac957f33", "scanner": "scanner-primary", "fingerprint": "6420c502f9e619d1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ad0dedb42ce5b25d", "level": "error", "message": {"text": "Dangling fetch: GET /api/recent-projects/notes (static/app.js:514)"}, "properties": {"repobilityId": "25d4baa968b01ce7", "scanner": "scanner-primary", "fingerprint": "ad0dedb42ce5b25d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d42e00ce435a6b54", "level": "error", "message": {"text": "Dangling fetch: GET /api/recent-projects/${this.selectedRecentSlug}/data (static/app.js:524)"}, "properties": {"repobilityId": "7f1215bd4cc1dc26", "scanner": "scanner-primary", "fingerprint": "d42e00ce435a6b54", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e60c2730355ef3f4", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/recent-projects/${slug} (static/app.js:542)"}, "properties": {"repobilityId": "384d25093db8b12d", "scanner": "scanner-primary", "fingerprint": "e60c2730355ef3f4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-31bde2c187c18ee5", "level": "error", "message": {"text": "Dangling fetch: GET /api/recent-projects/${proj.slug}/data (static/app.js:550)"}, "properties": {"repobilityId": "e628f274e00a975e", "scanner": "scanner-primary", "fingerprint": "31bde2c187c18ee5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-936a5fedf4317b7f", "level": "error", "message": {"text": "Dangling fetch: GET /api/recent-projects/${proj.slug}/xml (static/app.js:575)"}, "properties": {"repobilityId": "cd7d8a38edce4d8d", "scanner": "scanner-primary", "fingerprint": "936a5fedf4317b7f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ef4db4da1a1c7ce7", "level": "error", "message": {"text": "Dangling fetch: POST /api/recent-projects/${this.notesModalSlug}/notes (static/app.js:592)"}, "properties": {"repobilityId": "f4147954a65aaf56", "scanner": "scanner-primary", "fingerprint": "ef4db4da1a1c7ce7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cab22b767b8b75cf", "level": "error", "message": {"text": "Dangling fetch: POST /api/ga/write (static/app.js:688)"}, "properties": {"repobilityId": "36ba0b8d6339b338", "scanner": "scanner-primary", "fingerprint": "cab22b767b8b75cf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-365cccdf9285dfc9", "level": "error", "message": {"text": "Dangling fetch: POST /api/ga/read (static/app.js:704)"}, "properties": {"repobilityId": "b9c826b874c508ee", "scanner": "scanner-primary", "fingerprint": "365cccdf9285dfc9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-87e28c43549c2595", "level": "error", "message": {"text": "Dangling fetch: POST /api/ga/read-all (static/app.js:717)"}, "properties": {"repobilityId": "a2b618ddbb759a27", "scanner": "scanner-primary", "fingerprint": "87e28c43549c2595", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a87b2c1af41837b9", "level": "error", "message": {"text": "Dangling fetch: GET /api/llm/config (static/app.js:732)"}, "properties": {"repobilityId": "339c79db5759ee71", "scanner": "scanner-primary", "fingerprint": "a87b2c1af41837b9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b8207c90a2628375", "level": "error", "message": {"text": "Dangling fetch: GET /api/llm/lmstudio/models (static/app.js:746)"}, "properties": {"repobilityId": "c2a30c8fff267339", "scanner": "scanner-primary", "fingerprint": "b8207c90a2628375", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6415bf38cc45134a", "level": "error", "message": {"text": "Dangling fetch: POST /api/llm/config (static/app.js:773)"}, "properties": {"repobilityId": "6a658b3f9e8f2125", "scanner": "scanner-primary", "fingerprint": "6415bf38cc45134a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6ac852540536e5d1", "level": "error", "message": {"text": "Dangling fetch: POST /api/llm/analyze (static/app.js:806)"}, "properties": {"repobilityId": "47acee91a7b718cf", "scanner": "scanner-primary", "fingerprint": "6ac852540536e5d1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-71a0aa60beb34eac", "level": "error", "message": {"text": "Dangling fetch: GET /api/recent-projects/${encodeURIComponent(this.compareSlug)}/raw (static/app.js:937)"}, "properties": {"repobilityId": "b45a663696f8ae85", "scanner": "scanner-primary", "fingerprint": "71a0aa60beb34eac", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-33397bf1c6f5bbf1", "level": "error", "message": {"text": "Dangling fetch: POST /api/llm/compare (static/app.js:952)"}, "properties": {"repobilityId": "336bff0a3f362c2f", "scanner": "scanner-primary", "fingerprint": "33397bf1c6f5bbf1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-29d02c422db1ad97", "level": "error", "message": {"text": "Dangling fetch: GET /api/snapshots (static/app.js:2058)"}, "properties": {"repobilityId": "16c84a544d8ff903", "scanner": "scanner-primary", "fingerprint": "29d02c422db1ad97", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6c359013c22aeb53", "level": "error", "message": {"text": "Dangling fetch: POST /api/snapshots (static/app.js:2069)"}, "properties": {"repobilityId": "7f0f74f53827670a", "scanner": "scanner-primary", "fingerprint": "6c359013c22aeb53", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f85fbffe1ce142c7", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/snapshots/${encodeURIComponent(id)} (static/app.js:2091)"}, "properties": {"repobilityId": "5e59c7f508a698f6", "scanner": "scanner-primary", "fingerprint": "f85fbffe1ce142c7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "cf9380412ee712c9", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-292707b23cf3cc89", "level": "note", "message": {"text": "Unused endpoint: GET /api/current-values"}, "properties": {"repobilityId": "1a7bc0002dac68fd", "scanner": "scanner-primary", "fingerprint": "292707b23cf3cc89", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-06b603fde47f0b49", "level": "note", "message": {"text": "Unused endpoint: GET /api/last-project/info"}, "properties": {"repobilityId": "5dbd1e1aaa32798f", "scanner": "scanner-primary", "fingerprint": "06b603fde47f0b49", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1ee169aa5640a319", "level": "note", "message": {"text": "Unused endpoint: GET /api/log"}, "properties": {"repobilityId": "669f6d51291f525a", "scanner": "scanner-primary", "fingerprint": "1ee169aa5640a319", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3a9a776cfeb5887b", "level": "note", "message": {"text": "Unused endpoint: GET /api/log/export.csv"}, "properties": {"repobilityId": "04e585f855a2d1f0", "scanner": "scanner-primary", "fingerprint": "3a9a776cfeb5887b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a6f48e60c30777ab", "level": "note", "message": {"text": "Unused endpoint: GET /config"}, "properties": {"repobilityId": "257e7e93936e751f", "scanner": "scanner-primary", "fingerprint": "a6f48e60c30777ab", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-eb757797f6bd3444", "level": "note", "message": {"text": "Unused endpoint: POST /setup"}, "properties": {"repobilityId": "c24a2229403f3b3c", "scanner": "scanner-primary", "fingerprint": "eb757797f6bd3444", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-27498e0ddc597267", "level": "note", "message": {"text": "Unused endpoint: POST /peer"}, "properties": {"repobilityId": "43db07089b5abd54", "scanner": "scanner-primary", "fingerprint": "27498e0ddc597267", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6f77e5d5bd632d72", "level": "note", "message": {"text": "Unused endpoint: GET /peer-config"}, "properties": {"repobilityId": "a3adb601169a6bd3", "scanner": "scanner-primary", "fingerprint": "6f77e5d5bd632d72", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dde75da268c2def4", "level": "note", "message": {"text": "Unused endpoint: POST /ets-access"}, "properties": {"repobilityId": "d352e7eb4f593b99", "scanner": "scanner-primary", "fingerprint": "dde75da268c2def4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-28aac16ea168bb0e", "level": "note", "message": {"text": "Unused endpoint: POST /latency-test"}, "properties": {"repobilityId": "eaab0300831f2881", "scanner": "scanner-primary", "fingerprint": "28aac16ea168bb0e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c89f443df81224bb", "level": "note", "message": {"text": "Unused endpoint: DELETE /setup"}, "properties": {"repobilityId": "5a21e63a1f090876", "scanner": "scanner-primary", "fingerprint": "c89f443df81224bb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-75e54e9765e5a8c3", "level": "note", "message": {"text": "Unused endpoint: GET /api/bus/programming-mode"}, "properties": {"repobilityId": "00bf0383a61b1a8c", "scanner": "scanner-primary", "fingerprint": "75e54e9765e5a8c3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ad2865997a7b597e", "level": "note", "message": {"text": "Unused endpoint: GET /api/device/{addr}/properties"}, "properties": {"repobilityId": "76889d04f35e5b72", "scanner": "scanner-primary", "fingerprint": "ad2865997a7b597e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f720337ebc9b64d3", "level": "note", "message": {"text": "Unused endpoint: GET /lmstudio/models"}, "properties": {"repobilityId": "82b805f5e3cbf8e6", "scanner": "scanner-primary", "fingerprint": "f720337ebc9b64d3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0666d1d987815276", "level": "note", "message": {"text": "Unused endpoint: POST /config"}, "properties": {"repobilityId": "a02c39781c7beca1", "scanner": "scanner-primary", "fingerprint": "0666d1d987815276", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fca11d494725d7c3", "level": "note", "message": {"text": "Unused endpoint: POST /analyze"}, "properties": {"repobilityId": "ab1ef52a563779f0", "scanner": "scanner-primary", "fingerprint": "fca11d494725d7c3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5cf10967b5fa0cac", "level": "note", "message": {"text": "Unused endpoint: POST /compare"}, "properties": {"repobilityId": "4cedfd18d5c51e79", "scanner": "scanner-primary", "fingerprint": "5cf10967b5fa0cac", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f67c8b3020a57e65", "level": "note", "message": {"text": "Unused endpoint: POST /write"}, "properties": {"repobilityId": "ce5f6963d85e79e1", "scanner": "scanner-primary", "fingerprint": "f67c8b3020a57e65", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3dfa27698203a144", "level": "note", "message": {"text": "Unused endpoint: POST /read"}, "properties": {"repobilityId": "67a68af545345831", "scanner": "scanner-primary", "fingerprint": "3dfa27698203a144", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f8d576f6bf0f5660", "level": "note", "message": {"text": "Unused endpoint: POST /read-all"}, "properties": {"repobilityId": "3729d0e2855c8dbd", "scanner": "scanner-primary", "fingerprint": "f8d576f6bf0f5660", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a009b1a56794f45", "level": "note", "message": {"text": "Unused endpoint: POST /"}, "properties": {"repobilityId": "f9e821cc9499128c", "scanner": "scanner-primary", "fingerprint": "7a009b1a56794f45", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8b1b274b32469392", "level": "note", "message": {"text": "Unused endpoint: GET /diff"}, "properties": {"repobilityId": "942e4a9ae785e049", "scanner": "scanner-primary", "fingerprint": "8b1b274b32469392", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f0ec7c44529c217a", "level": "note", "message": {"text": "Unused endpoint: DELETE /{sid}"}, "properties": {"repobilityId": "1ba0087f44739af2", "scanner": "scanner-primary", "fingerprint": "f0ec7c44529c217a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-450115406f7a540e", "level": "note", "message": {"text": "Unused endpoint: GET /notes"}, "properties": {"repobilityId": "09a57c1530992bfe", "scanner": "scanner-primary", "fingerprint": "450115406f7a540e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8c47a69b353b118d", "level": "note", "message": {"text": "Unused endpoint: POST /{slug}/notes"}, "properties": {"repobilityId": "a087b1ff88ee0e9b", "scanner": "scanner-primary", "fingerprint": "8c47a69b353b118d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a20243bfd8a31bde", "level": "note", "message": {"text": "Unused endpoint: GET /{slug}/knxproj"}, "properties": {"repobilityId": "e8c7e49ace1e01ef", "scanner": "scanner-primary", "fingerprint": "a20243bfd8a31bde", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-95dde0442249b699", "level": "note", "message": {"text": "Unused endpoint: GET /{slug}/xml"}, "properties": {"repobilityId": "fd3eccb0fb4e5947", "scanner": "scanner-primary", "fingerprint": "95dde0442249b699", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1a8705db6c698e43", "level": "note", "message": {"text": "Unused endpoint: GET /{slug}/data"}, "properties": {"repobilityId": "d59ab97d52379343", "scanner": "scanner-primary", "fingerprint": "1a8705db6c698e43", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6af3ab252307b440", "level": "note", "message": {"text": "Unused endpoint: GET /{slug}/raw"}, "properties": {"repobilityId": "26cd2bf830a18c6d", "scanner": "scanner-primary", "fingerprint": "6af3ab252307b440", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-115736d40adf25ab", "level": "note", "message": {"text": "Unused endpoint: DELETE /{slug}"}, "properties": {"repobilityId": "a192c0873f1bc09b", "scanner": "scanner-primary", "fingerprint": "115736d40adf25ab", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}