{"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-92d53b8920b6a7b5", "name": "Possibly dead Python function: set_db_path", "shortDescription": {"text": "Possibly dead Python function: set_db_path"}, "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-0fae40589a014659", "name": "Possibly dead Python function: process_ai_response", "shortDescription": {"text": "Possibly dead Python function: process_ai_response"}, "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-90c09404d2b40212", "name": "Possibly dead Python function: button_callback", "shortDescription": {"text": "Possibly dead Python function: button_callback"}, "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-232ca760e6383674", "name": "Possibly dead Python function: detect_protocol", "shortDescription": {"text": "Possibly dead Python function: detect_protocol"}, "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-43897b6ceab3036b", "name": "Possibly dead Python function: bit_names_from_value", "shortDescription": {"text": "Possibly dead Python function: bit_names_from_value"}, "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-798d05018188a246", "name": "Possibly dead Python function: scan_port", "shortDescription": {"text": "Possibly dead Python function: scan_port"}, "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-301e9aebf3848f96", "name": "Possibly dead Python function: ensure_maintenance_table_in_pool_db", "shortDescription": {"text": "Possibly dead Python function: ensure_maintenance_table_in_pool_db"}, "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-b0c769c063bd5ed8", "name": "Possibly dead Python function: init_database", "shortDescription": {"text": "Possibly dead Python function: init_database"}, "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-a9085c7f5881c120", "name": "Possibly dead Python function: check_database_health", "shortDescription": {"text": "Possibly dead Python function: check_database_health"}, "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-fb145c29f7adaf8a", "name": "Possibly dead Python function: delete_lsi_reading", "shortDescription": {"text": "Possibly dead Python function: delete_lsi_reading"}, "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-82545c61eb0e6a2c", "name": "Possibly dead Python function: log_alarm", "shortDescription": {"text": "Possibly dead Python function: log_alarm"}, "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-795052e675488ac2", "name": "Possibly dead Python function: add_alarm_note", "shortDescription": {"text": "Possibly dead Python function: add_alarm_note"}, "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-45c70a553534a0fa", "name": "Possibly dead Python function: save_insight", "shortDescription": {"text": "Possibly dead Python function: save_insight"}, "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-1670f200f21dbebc", "name": "Possibly dead Python function: update_equipment", "shortDescription": {"text": "Possibly dead Python function: update_equipment"}, "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-07f463ee7e692878", "name": "Possibly dead Python function: update_optimal_parameters", "shortDescription": {"text": "Possibly dead Python function: update_optimal_parameters"}, "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-13de5b66bfd15095", "name": "Possibly dead Python function: cmd_list", "shortDescription": {"text": "Possibly dead Python function: cmd_list"}, "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-934d147b57d0f9c5", "name": "Possibly dead Python function: cmd_deploy", "shortDescription": {"text": "Possibly dead Python function: cmd_deploy"}, "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-16f912ae96c44df5", "name": "Possibly dead Python function: cmd_verify", "shortDescription": {"text": "Possibly dead Python function: cmd_verify"}, "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-1c139fe8220f1139", "name": "Stray `console.log` in TS/JS \u2014 mobile-app/src/stores/deviceStore.ts:145", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 mobile-app/src/stores/deviceStore.ts:145"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7936caae009575a6", "name": "Stray `console.log` in TS/JS \u2014 mobile-app/src/stores/authStore.ts:146", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 mobile-app/src/stores/authStore.ts:146"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3bd34547b17a9015", "name": "Stray `console.log` in TS/JS \u2014 mobile-app/src/services/auth.ts:67", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 mobile-app/src/services/auth.ts:67"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7748b645ecec6138", "name": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 pi-software/PoolDash_v6/pooldash_app/static/", "shortDescription": {"text": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 pi-software/PoolDash_v6/pooldash_app/static/js/plotly-basic-2.27.0.min.js:8"}, "fullDescription": {"text": "React Flow edge labels render with a white rectangle behind the text by default, which scatters bright boxes across a dark canvas. Either drop the label, or override `.react-flow__edge-textbg` and `.react-flow__edge-text` in your stylesheet.\n\nWhy: P-H in CHECKLIST.md \u2014 vendor edge labels bleed white through a dark canvas.\nRule id: fq.edge-label.no-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d730b475a7c16d75", "name": "Stray `console.log` in TS/JS \u2014 web-portal/poolai_deploy/service-worker.js:42", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 web-portal/poolai_deploy/service-worker.js:42"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2f48467303c91494", "name": "Stray `console.log` in TS/JS \u2014 web-portal/poolai_deploy/assets/js/pwa.js:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 web-portal/poolai_deploy/assets/js/pwa.js:32"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-98ee9b1ab891d9a1", "name": "Privileged port 502 in use", "shortDescription": {"text": "Privileged port 502 in use"}, "fullDescription": {"text": "Port 502 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b1e89245239e0936", "name": "Privileged port 1000 in use", "shortDescription": {"text": "Privileged port 1000 in use"}, "fullDescription": {"text": "Port 1000 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-875ebe51f94341a5", "name": "Insecure pattern 'python_os_system' in pi-software/PoolDash_v6/scripts/device_upload.py:69", "shortDescription": {"text": "Insecure pattern 'python_os_system' in pi-software/PoolDash_v6/scripts/device_upload.py:69"}, "fullDescription": {"text": "Found a known-risky pattern (python_os_system). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6ce2be902220f9c7", "name": "Insecure pattern 'subprocess_shell_true' in pi-software/PoolDash_v6/scripts/button_handler.py:83", "shortDescription": {"text": "Insecure pattern 'subprocess_shell_true' in pi-software/PoolDash_v6/scripts/button_handler.py:83"}, "fullDescription": {"text": "Found a known-risky pattern (subprocess_shell_true). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-756e3a2870a55daa", "name": "Insecure pattern 'new_function_used' in pi-software/PoolDash_v6/pooldash_app/static/js/plotly-basic-2.27.0.min.js:8", "shortDescription": {"text": "Insecure pattern 'new_function_used' in pi-software/PoolDash_v6/pooldash_app/static/js/plotly-basic-2.27.0.min.js:8"}, "fullDescription": {"text": "Found a known-risky pattern (new_function_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a10578cac83497b3", "name": "Insecure pattern 'direct_innerhtml_assignment' in pi-software/PoolDash_v6/pooldash_app/static/js/plotly-basic-2.27.0.min", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in pi-software/PoolDash_v6/pooldash_app/static/js/plotly-basic-2.27.0.min.js:8"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-96918141a33706ce", "name": "Insecure pattern 'direct_innerhtml_assignment' in pi-software/PoolDash_v6/pooldash_app/blueprints/charts.py:426", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in pi-software/PoolDash_v6/pooldash_app/blueprints/charts.py:426"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-84d6b1474f028820", "name": "Insecure pattern 'direct_innerhtml_assignment' in pi-software/PoolDash_v6/pooldash_app/blueprints/main_ui.py:1173", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in pi-software/PoolDash_v6/pooldash_app/blueprints/main_ui.py:1173"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a1b878189c5ea7b9", "name": "Insecure pattern 'direct_innerhtml_assignment' in pi-software/PoolDash_v6/pooldash_app/blueprints/proxy.py:60", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in pi-software/PoolDash_v6/pooldash_app/blueprints/proxy.py:60"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-37824f2b259589be", "name": "Insecure pattern 'direct_innerhtml_assignment' in brain/launcher.py:565", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in brain/launcher.py:565"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-acffd109e2fa774b", "name": "Insecure pattern 'direct_innerhtml_assignment' in web-portal/js/portal.js:18", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in web-portal/js/portal.js:18"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ccabba5fc0ee0460", "name": "Insecure pattern 'direct_innerhtml_assignment' in web-portal/js/app.js:86", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in web-portal/js/app.js:86"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-35e6ce54a9c7444c", "name": "Insecure pattern 'direct_innerhtml_assignment' in web-portal/js/admin.js:31", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in web-portal/js/admin.js:31"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2385946e81041ed5", "name": "Insecure pattern 'direct_innerhtml_assignment' in web-portal/poolai_deploy/assets/js/pwa.js:90", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in web-portal/poolai_deploy/assets/js/pwa.js:90"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0b6f1ad7c106efe7", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-42b5222450df9811", "name": "Very large file: pi-software/PoolDash_v6/tools/modbus_logger.py (2073 lines)", "shortDescription": {"text": "Very large file: pi-software/PoolDash_v6/tools/modbus_logger.py (2073 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-944ed75fad73077f", "name": "Very large file: pi-software/PoolDash_v6/pooldash_app/blueprints/main_ui.py (4929 lines)", "shortDescription": {"text": "Very large file: pi-software/PoolDash_v6/pooldash_app/blueprints/main_ui.py (4929 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-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "11 test file(s) for 126 source file(s) (ratio 0.09). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 717 console/debugger/print-style debug statements in non-test source. This is a common fast-generation residue before production cleanup."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 70 placeholder/mock markers across 27 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9a2f5711d445061a", "name": "Agent instruction/config may expose a secret: pi-software/CLAUDE.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: pi-software/CLAUDE.md"}, "fullDescription": {"text": "Agent-facing files are routinely pasted into LLM/tool contexts. Move literal tokens, keys, and passwords into a secret manager or document them as placeholders only."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c74c9b639da1d226", "name": "Agent instruction/config may expose a secret: pi-software/PoolDash_v6/CLAUDE.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: pi-software/PoolDash_v6/CLAUDE.md"}, "fullDescription": {"text": "Agent-facing files are routinely pasted into LLM/tool contexts. Move literal tokens, keys, and passwords into a secret manager or document them as placeholders only."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d4de38c3d3a2f9ba", "name": "Agent authority lacks a verifier contract: pi-software/PoolDash_v6/CLAUDE.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: pi-software/PoolDash_v6/CLAUDE.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4d6ed31ce96e8a7d", "name": "Agent authority lacks a verifier contract: pi-software/.claude/settings.local.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: pi-software/.claude/settings.local.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-643b10d84d18f7a3", "name": "Agent authority lacks a verifier contract: brain/CLAUDE.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: brain/CLAUDE.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-08e1159f6534e180", "name": "Legacy-named symbol `app_backup` in pi-software/PoolDash_v6/scripts/update_check.py:447", "shortDescription": {"text": "Legacy-named symbol `app_backup` in pi-software/PoolDash_v6/scripts/update_check.py:447"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a5702eb7e86d48b6", "name": "Commented-code block (5 lines) in pi-software/PoolDash_v6/scripts/update_check.py:756", "shortDescription": {"text": "Commented-code block (5 lines) in pi-software/PoolDash_v6/scripts/update_check.py:756"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-025bbe47d49ecf5c", "name": "Network/subprocess call without timeout or try/except \u2014 pi-software/PoolDash_v6/scripts/update_check.py:626", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 pi-software/PoolDash_v6/scripts/update_check.py:626"}, "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-fa390febc6a282bb", "name": "Commented-code block (5 lines) in pi-software/PoolDash_v6/scripts/health_reporter.py:72", "shortDescription": {"text": "Commented-code block (5 lines) in pi-software/PoolDash_v6/scripts/health_reporter.py:72"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5077895525bf8830", "name": "Network/subprocess call without timeout or try/except \u2014 pi-software/PoolDash_v6/scripts/publish_update.py:56", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 pi-software/PoolDash_v6/scripts/publish_update.py:56"}, "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-741fdd2541bc7b52", "name": "Legacy-named symbol `old_backup` in pi-software/PoolDash_v6/tools/config_backup.py:84", "shortDescription": {"text": "Legacy-named symbol `old_backup` in pi-software/PoolDash_v6/tools/config_backup.py:84"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bd394435f6264082", "name": "Commented-code block (27 lines) in pi-software/PoolDash_v6/tools/modbus_logger.py:667", "shortDescription": {"text": "Commented-code block (27 lines) in pi-software/PoolDash_v6/tools/modbus_logger.py:667"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a12dc31e19d7701e", "name": "Commented-code block (8 lines) in pi-software/PoolDash_v6/modbus/ezetrol_modbus_points.py:6", "shortDescription": {"text": "Commented-code block (8 lines) in pi-software/PoolDash_v6/modbus/ezetrol_modbus_points.py:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2f8e372483668f06", "name": "Commented-code block (5 lines) in pi-software/PoolDash_v6/modbus/walchem_modbus_points.py:12", "shortDescription": {"text": "Commented-code block (5 lines) in pi-software/PoolDash_v6/modbus/walchem_modbus_points.py:12"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-aba9c708bb0d000e", "name": "Commented-code block (8 lines) in pi-software/PoolDash_v6/modbus/rs485/water_tester_points.py:8", "shortDescription": {"text": "Commented-code block (8 lines) in pi-software/PoolDash_v6/modbus/rs485/water_tester_points.py:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-200572e67de7af5e", "name": "Commented-code block (5 lines) in pi-software/PoolDash_v6/pooldash_app/persist.py:130", "shortDescription": {"text": "Commented-code block (5 lines) in pi-software/PoolDash_v6/pooldash_app/persist.py:130"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7e96d18dfb7368a0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 pi-software/PoolDash_v6/pooldash_app/static/sw.js:53", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 pi-software/PoolDash_v6/pooldash_app/static/sw.js:53"}, "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-26fc2deaa38ac08d", "name": "Legacy-named symbol `ssh_authorized_keys_backup` in pi-software/PoolDash_v6/pooldash_app/blueprints/main_ui.py:1962", "shortDescription": {"text": "Legacy-named symbol `ssh_authorized_keys_backup` in pi-software/PoolDash_v6/pooldash_app/blueprints/main_ui.py:1962"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c1700ca24493cec7", "name": "Commented-code block (5 lines) in pi-software/PoolDash_v6/pooldash_app/blueprints/main_ui.py:223", "shortDescription": {"text": "Commented-code block (5 lines) in pi-software/PoolDash_v6/pooldash_app/blueprints/main_ui.py:223"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4624833d548ef673", "name": "Network/subprocess call without timeout or try/except \u2014 pi-software/PoolDash_v6/pooldash_app/blueprints/main_ui.py:2929", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 pi-software/PoolDash_v6/pooldash_app/blueprints/main_ui.py:2929"}, "fullDescription": {"text": "`subprocess.Popen(...)` 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-956c80c6ad9c5e66", "name": "Commented-code block (5 lines) in brain/alert_checker.py:24", "shortDescription": {"text": "Commented-code block (5 lines) in brain/alert_checker.py:24"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c867d07c45194f34", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-portal/js/portal.js:85", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-portal/js/portal.js:85"}, "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-e03ba1a646b6dd10", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-portal/js/admin.js:22", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-portal/js/admin.js:22"}, "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-1662ae7a5bb4e048", "name": "33 env vars used in code but missing from .env.example", "shortDescription": {"text": "33 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `BACKOFF_ENABLED`, `DB_PORT`, `DEVICE_IDS`, `FAILURE_ALERT_THRESHOLD`, `HEALTH_LOG_INTERVAL`, `LOG_LEVEL`, `MAINT_DB_PATH`, `MODBUS_PROFILE` + 25 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nai-assistant/pi/ai_sync.py:get_db_path, ai-assistant/pi/ai_sync.py:get_db\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-cad9289176197521", "name": "Flask mutation route `api_settings` without `@login_required` \u2014 brain/launcher.py:646", "shortDescription": {"text": "Flask mutation route `api_settings` without `@login_required` \u2014 brain/launcher.py:646"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7583250d8b26919e", "name": "Flask mutation route `api_push` without `@login_required` \u2014 brain/launcher.py:657", "shortDescription": {"text": "Flask mutation route `api_push` without `@login_required` \u2014 brain/launcher.py:657"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0e32932f662ab7a0", "name": "Flask mutation route `api_initiate` without `@login_required` \u2014 brain/launcher.py:685", "shortDescription": {"text": "Flask mutation route `api_initiate` without `@login_required` \u2014 brain/launcher.py:685"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-52fa44005b6ece23", "name": "Flask mutation route `start_session` without `@login_required` \u2014 brain/technician_web.py:261", "shortDescription": {"text": "Flask mutation route `start_session` without `@login_required` \u2014 brain/technician_web.py:261"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f5b4a24d07f87bcd", "name": "Flask mutation route `respond` without `@login_required` \u2014 brain/technician_web.py:270", "shortDescription": {"text": "Flask mutation route `respond` without `@login_required` \u2014 brain/technician_web.py:270"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5bb24e267d94959a", "name": "Flask mutation route `finish_session` without `@login_required` \u2014 brain/technician_web.py:281", "shortDescription": {"text": "Flask mutation route `finish_session` without `@login_required` \u2014 brain/technician_web.py:281"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-175c7947c681b839", "name": "Flask mutation route `apply_changes` without `@login_required` \u2014 brain/technician_web.py:303", "shortDescription": {"text": "Flask mutation route `apply_changes` without `@login_required` \u2014 brain/technician_web.py:303"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-63da891c38a4ee68", "name": "Flask mutation route `sms_webhook` without `@login_required` \u2014 brain/technician_sms.py:225", "shortDescription": {"text": "Flask mutation route `sms_webhook` without `@login_required` \u2014 brain/technician_sms.py:225"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-99f632a3c167556b", "name": "Flask mutation route `whatsapp_webhook` without `@login_required` \u2014 brain/technician_sms.py:240", "shortDescription": {"text": "Flask mutation route `whatsapp_webhook` without `@login_required` \u2014 brain/technician_sms.py:240"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-be3f4aae41c90efb", "name": "Dangling fetch: GET /api/portal/pools (web-portal/js/portal.js:184)", "shortDescription": {"text": "Dangling fetch: GET /api/portal/pools (web-portal/js/portal.js:184)"}, "fullDescription": {"text": "`web-portal/js/portal.js:184` calls `GET /api/portal/pools` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/portal/pools`\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-079850c80cc62a7c", "name": "Dangling fetch: POST /api/admin/accounts (web-portal/js/admin.js:221)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/accounts (web-portal/js/admin.js:221)"}, "fullDescription": {"text": "`web-portal/js/admin.js:221` calls `POST /api/admin/accounts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/accounts`\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-ad753fc4e3803df1", "name": "Dangling fetch: POST /api/admin/pools (web-portal/js/admin.js:292)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/pools (web-portal/js/admin.js:292)"}, "fullDescription": {"text": "`web-portal/js/admin.js:292` calls `POST /api/admin/pools` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/pools`\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-31400245f65232f2", "name": "Dangling fetch: POST /api/admin/users (web-portal/js/admin.js:327)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/users (web-portal/js/admin.js:327)"}, "fullDescription": {"text": "`web-portal/js/admin.js:327` calls `POST /api/admin/users` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/users`\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-1a6d91f2236825bf", "name": "Unused endpoint: ANY /", "shortDescription": {"text": "Unused endpoint: ANY /"}, "fullDescription": {"text": "`ai-assistant/pi/blueprints/ai_assistant.py` declares `ANY /` 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-d25275a307dd9d7e", "name": "Unused endpoint: ANY /api/questions", "shortDescription": {"text": "Unused endpoint: ANY /api/questions"}, "fullDescription": {"text": "`ai-assistant/pi/blueprints/ai_assistant.py` declares `ANY /api/questions` 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-c6aedc5902ae2a7b", "name": "Unused endpoint: ANY /api/answer", "shortDescription": {"text": "Unused endpoint: ANY /api/answer"}, "fullDescription": {"text": "`ai-assistant/pi/blueprints/ai_assistant.py` declares `ANY /api/answer` 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-94cf8ac3c15e385d", "name": "Unused endpoint: ANY /api/suggestions", "shortDescription": {"text": "Unused endpoint: ANY /api/suggestions"}, "fullDescription": {"text": "`ai-assistant/pi/blueprints/ai_assistant.py` declares `ANY /api/suggestions` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ef6ac3856a926303", "name": "Unused endpoint: ANY /api/suggestion/<int:suggestion_id>/read", "shortDescription": {"text": "Unused endpoint: ANY /api/suggestion/<int:suggestion_id>/read"}, "fullDescription": {"text": "`ai-assistant/pi/blueprints/ai_assistant.py` declares `ANY /api/suggestion/<int:suggestion_id>/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-7a9b3675fb0d4e78", "name": "Unused endpoint: ANY /api/suggestion/<int:suggestion_id>/action", "shortDescription": {"text": "Unused endpoint: ANY /api/suggestion/<int:suggestion_id>/action"}, "fullDescription": {"text": "`ai-assistant/pi/blueprints/ai_assistant.py` declares `ANY /api/suggestion/<int:suggestion_id>/action` 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-d378219dfb1107c3", "name": "Unused endpoint: ANY /api/ask-me", "shortDescription": {"text": "Unused endpoint: ANY /api/ask-me"}, "fullDescription": {"text": "`ai-assistant/pi/blueprints/ai_assistant.py` declares `ANY /api/ask-me` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ec3442aa0b6ba39d", "name": "Unused endpoint: ANY /api/stats", "shortDescription": {"text": "Unused endpoint: ANY /api/stats"}, "fullDescription": {"text": "`ai-assistant/pi/blueprints/ai_assistant.py` declares `ANY /api/stats` 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-e1ed71a0cbdc0baf", "name": "Unused endpoint: ANY /hotspot-detect.html", "shortDescription": {"text": "Unused endpoint: ANY /hotspot-detect.html"}, "fullDescription": {"text": "`pi-software/PoolDash_v6/pooldash_app/__init__.py` declares `ANY /hotspot-detect.html` 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-c27a320d71dc671b", "name": "Unused endpoint: ANY /library/test/success.html", "shortDescription": {"text": "Unused endpoint: ANY /library/test/success.html"}, "fullDescription": {"text": "`pi-software/PoolDash_v6/pooldash_app/__init__.py` declares `ANY /library/test/success.html` 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-3938916e419a6288", "name": "Unused endpoint: ANY /generate_204", "shortDescription": {"text": "Unused endpoint: ANY /generate_204"}, "fullDescription": {"text": "`pi-software/PoolDash_v6/pooldash_app/__init__.py` declares `ANY /generate_204` 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-665321754fa6c7c9", "name": "Unused endpoint: ANY /gen_204", "shortDescription": {"text": "Unused endpoint: ANY /gen_204"}, "fullDescription": {"text": "`pi-software/PoolDash_v6/pooldash_app/__init__.py` declares `ANY /gen_204` 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-ffd113257a60f7e1", "name": "Unused endpoint: ANY /connectivitycheck.gstatic.com", "shortDescription": {"text": "Unused endpoint: ANY /connectivitycheck.gstatic.com"}, "fullDescription": {"text": "`pi-software/PoolDash_v6/pooldash_app/__init__.py` declares `ANY /connectivitycheck.gstatic.com` 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-533c5ba7c225e237", "name": "Unused endpoint: ANY /success.txt", "shortDescription": {"text": "Unused endpoint: ANY /success.txt"}, "fullDescription": {"text": "`pi-software/PoolDash_v6/pooldash_app/__init__.py` declares `ANY /success.txt` 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-78ae901d6447c721", "name": "Unused endpoint: ANY /canonical.html", "shortDescription": {"text": "Unused endpoint: ANY /canonical.html"}, "fullDescription": {"text": "`pi-software/PoolDash_v6/pooldash_app/__init__.py` declares `ANY /canonical.html` 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-2ee9aa9110562a1c", "name": "Unused endpoint: ANY /ncsi.txt", "shortDescription": {"text": "Unused endpoint: ANY /ncsi.txt"}, "fullDescription": {"text": "`pi-software/PoolDash_v6/pooldash_app/__init__.py` declares `ANY /ncsi.txt` 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-8ece8c987ff9c424", "name": "Unused endpoint: ANY /api/health", "shortDescription": {"text": "Unused endpoint: ANY /api/health"}, "fullDescription": {"text": "`pi-software/PoolDash_v6/pooldash_app/blueprints/health.py` declares `ANY /api/health` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d87d1b555a41341a", "name": "Unused endpoint: ANY /api/ping", "shortDescription": {"text": "Unused endpoint: ANY /api/ping"}, "fullDescription": {"text": "`pi-software/PoolDash_v6/pooldash_app/blueprints/health.py` declares `ANY /api/ping` 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-cef85d74321f8d23", "name": "Unused endpoint: GET /<pool>", "shortDescription": {"text": "Unused endpoint: GET /<pool>"}, "fullDescription": {"text": "`pi-software/PoolDash_v6/pooldash_app/blueprints/alarms.py` declares `GET /<pool>` 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-d1d75a1138964439", "name": "Unused endpoint: GET /api/<pool>", "shortDescription": {"text": "Unused endpoint: GET /api/<pool>"}, "fullDescription": {"text": "`pi-software/PoolDash_v6/pooldash_app/blueprints/alarms.py` declares `GET /api/<pool>` 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-2e5aabe12b61af72", "name": "Unused endpoint: GET /api/<pool>/controller-states", "shortDescription": {"text": "Unused endpoint: GET /api/<pool>/controller-states"}, "fullDescription": {"text": "`pi-software/PoolDash_v6/pooldash_app/blueprints/alarms.py` declares `GET /api/<pool>/controller-states` 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-eeb3d5890bfa4277", "name": "Unused endpoint: GET /api/<pool>/states", "shortDescription": {"text": "Unused endpoint: GET /api/<pool>/states"}, "fullDescription": {"text": "`pi-software/PoolDash_v6/pooldash_app/blueprints/alarms.py` declares `GET /api/<pool>/states` 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-404e8721d02e48ce", "name": "Unused endpoint: GET /<pool>/history", "shortDescription": {"text": "Unused endpoint: GET /<pool>/history"}, "fullDescription": {"text": "`pi-software/PoolDash_v6/pooldash_app/blueprints/alarms.py` declares `GET /<pool>/history` 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-f98a967888e658b8", "name": "Unused endpoint: POST /acknowledge/<int:alarm_id>", "shortDescription": {"text": "Unused endpoint: POST /acknowledge/<int:alarm_id>"}, "fullDescription": {"text": "`pi-software/PoolDash_v6/pooldash_app/blueprints/alarms.py` declares `POST /acknowledge/<int:alarm_id>` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-98a7ee3c9be7c4db", "name": "Unused endpoint: POST /<pool>/sync", "shortDescription": {"text": "Unused endpoint: POST /<pool>/sync"}, "fullDescription": {"text": "`pi-software/PoolDash_v6/pooldash_app/blueprints/alarms.py` declares `POST /<pool>/sync` 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-44d648b4a5bba022", "name": "Unused endpoint: GET /<pool>/export", "shortDescription": {"text": "Unused endpoint: GET /<pool>/export"}, "fullDescription": {"text": "`pi-software/PoolDash_v6/pooldash_app/blueprints/alarms.py` declares `GET /<pool>/export` 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-d51b194a95fa8fbd", "name": "Unused endpoint: ANY /api/<pool>/<metric>/data", "shortDescription": {"text": "Unused endpoint: ANY /api/<pool>/<metric>/data"}, "fullDescription": {"text": "`pi-software/PoolDash_v6/pooldash_app/blueprints/charts.py` declares `ANY /api/<pool>/<metric>/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-afe1d2b968d293bb", "name": "Unused endpoint: ANY /<pool>/<metric>", "shortDescription": {"text": "Unused endpoint: ANY /<pool>/<metric>"}, "fullDescription": {"text": "`pi-software/PoolDash_v6/pooldash_app/blueprints/charts.py` declares `ANY /<pool>/<metric>` 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-9bc89dc39169ae5f", "name": "Unused endpoint: ANY /api/<pool>/trends/data", "shortDescription": {"text": "Unused endpoint: ANY /api/<pool>/trends/data"}, "fullDescription": {"text": "`pi-software/PoolDash_v6/pooldash_app/blueprints/charts.py` declares `ANY /api/<pool>/trends/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-848cf0c2042e1ca5", "name": "Unused endpoint: ANY /<pool>/trends", "shortDescription": {"text": "Unused endpoint: ANY /<pool>/trends"}, "fullDescription": {"text": "`pi-software/PoolDash_v6/pooldash_app/blueprints/charts.py` declares `ANY /<pool>/trends` 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-3de800d2ede5d76e", "name": "Unused endpoint: ANY /<pool>/lsi", "shortDescription": {"text": "Unused endpoint: ANY /<pool>/lsi"}, "fullDescription": {"text": "`pi-software/PoolDash_v6/pooldash_app/blueprints/charts.py` declares `ANY /<pool>/lsi` 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-7d78baeac93db0f5", "name": "Unused endpoint: ANY /ip_view", "shortDescription": {"text": "Unused endpoint: ANY /ip_view"}, "fullDescription": {"text": "`pi-software/PoolDash_v6/pooldash_app/blueprints/ip_view.py` declares `ANY /ip_view` 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-8082a73471c12ab9", "name": "Unused endpoint: ANY /ip_proxy", "shortDescription": {"text": "Unused endpoint: ANY /ip_proxy"}, "fullDescription": {"text": "`pi-software/PoolDash_v6/pooldash_app/blueprints/ip_view.py` declares `ANY /ip_proxy` 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-9d5009ebe5309323", "name": "Unused endpoint: ANY /pool/<pool>", "shortDescription": {"text": "Unused endpoint: ANY /pool/<pool>"}, "fullDescription": {"text": "`pi-software/PoolDash_v6/pooldash_app/blueprints/main_ui.py` declares `ANY /pool/<pool>` 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-c8895667bd0d82d1", "name": "Unused endpoint: ANY /pool/<pool>/maintenance", "shortDescription": {"text": "Unused endpoint: ANY /pool/<pool>/maintenance"}, "fullDescription": {"text": "`pi-software/PoolDash_v6/pooldash_app/blueprints/main_ui.py` declares `ANY /pool/<pool>/maintenance` 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-f98b7cfdb2b8a3ce", "name": "Unused endpoint: ANY /pool/<pool>/maintenance/logs", "shortDescription": {"text": "Unused endpoint: ANY /pool/<pool>/maintenance/logs"}, "fullDescription": {"text": "`pi-software/PoolDash_v6/pooldash_app/blueprints/main_ui.py` declares `ANY /pool/<pool>/maintenance/logs` 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-7cc81dbd0f76f055", "name": "Unused endpoint: ANY /pool/<pool>/lsi/autofill", "shortDescription": {"text": "Unused endpoint: ANY /pool/<pool>/lsi/autofill"}, "fullDescription": {"text": "`pi-software/PoolDash_v6/pooldash_app/blueprints/main_ui.py` declares `ANY /pool/<pool>/lsi/autofill` 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-3f15153a9bac1f96", "name": "Unused endpoint: ANY /pool/<pool>/lsi/history", "shortDescription": {"text": "Unused endpoint: ANY /pool/<pool>/lsi/history"}, "fullDescription": {"text": "`pi-software/PoolDash_v6/pooldash_app/blueprints/main_ui.py` declares `ANY /pool/<pool>/lsi/history` 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-730243f5702f0b8a", "name": "Unused endpoint: ANY /settings", "shortDescription": {"text": "Unused endpoint: ANY /settings"}, "fullDescription": {"text": "`pi-software/PoolDash_v6/pooldash_app/blueprints/main_ui.py` declares `ANY /settings` 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-7875e0cd18e3595e", "name": "Unused endpoint: ANY /qr", "shortDescription": {"text": "Unused endpoint: ANY /qr"}, "fullDescription": {"text": "`pi-software/PoolDash_v6/pooldash_app/blueprints/main_ui.py` declares `ANY /qr` 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-cc13121b336b41af", "name": "Unused endpoint: ANY /connect", "shortDescription": {"text": "Unused endpoint: ANY /connect"}, "fullDescription": {"text": "`pi-software/PoolDash_v6/pooldash_app/blueprints/main_ui.py` declares `ANY /connect` 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-9b6c35c8f546b846", "name": "Unused endpoint: ANY /qr/page", "shortDescription": {"text": "Unused endpoint: ANY /qr/page"}, "fullDescription": {"text": "`pi-software/PoolDash_v6/pooldash_app/blueprints/main_ui.py` declares `ANY /qr/page` 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-d6b170c1d7ce65fb", "name": "Unused endpoint: ANY /settings/wifi/scan", "shortDescription": {"text": "Unused endpoint: ANY /settings/wifi/scan"}, "fullDescription": {"text": "`pi-software/PoolDash_v6/pooldash_app/blueprints/main_ui.py` declares `ANY /settings/wifi/scan` 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-9920b054e8c4a493", "name": "Unused endpoint: ANY /settings/wifi", "shortDescription": {"text": "Unused endpoint: ANY /settings/wifi"}, "fullDescription": {"text": "`pi-software/PoolDash_v6/pooldash_app/blueprints/main_ui.py` declares `ANY /settings/wifi` 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-ae24ab024b7f9e7c", "name": "Unused endpoint: ANY /settings/wifi/disconnect", "shortDescription": {"text": "Unused endpoint: ANY /settings/wifi/disconnect"}, "fullDescription": {"text": "`pi-software/PoolDash_v6/pooldash_app/blueprints/main_ui.py` declares `ANY /settings/wifi/disconnect` 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-18437d3ab3c11278", "name": "Unused endpoint: ANY /settings/ethernet", "shortDescription": {"text": "Unused endpoint: ANY /settings/ethernet"}, "fullDescription": {"text": "`pi-software/PoolDash_v6/pooldash_app/blueprints/main_ui.py` declares `ANY /settings/ethernet` 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-211cc62be0a2adf3", "name": "Unused endpoint: ANY /settings/wifi/ip", "shortDescription": {"text": "Unused endpoint: ANY /settings/wifi/ip"}, "fullDescription": {"text": "`pi-software/PoolDash_v6/pooldash_app/blueprints/main_ui.py` declares `ANY /settings/wifi/ip` 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-f069ca41b7dc4d6a", "name": "Unused endpoint: ANY /settings/network/reset", "shortDescription": {"text": "Unused endpoint: ANY /settings/network/reset"}, "fullDescription": {"text": "`pi-software/PoolDash_v6/pooldash_app/blueprints/main_ui.py` declares `ANY /settings/network/reset` 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-d32fa92596767616", "name": "Unused endpoint: ANY /settings/network/diagnostics", "shortDescription": {"text": "Unused endpoint: ANY /settings/network/diagnostics"}, "fullDescription": {"text": "`pi-software/PoolDash_v6/pooldash_app/blueprints/main_ui.py` declares `ANY /settings/network/diagnostics` 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-8e29637c20833895", "name": "Unused endpoint: ANY /settings/reboot", "shortDescription": {"text": "Unused endpoint: ANY /settings/reboot"}, "fullDescription": {"text": "`pi-software/PoolDash_v6/pooldash_app/blueprints/main_ui.py` declares `ANY /settings/reboot` 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/24554"}, "properties": {"repository": "bensalmon91-cpu/PoolAI", "repoUrl": "https://github.com/bensalmon91-cpu/PoolAI", "branch": "main"}, "results": [{"ruleId": "scanner-92d53b8920b6a7b5", "level": "note", "message": {"text": "Possibly dead Python function: set_db_path"}, "properties": {"repobilityId": "a76a91a0e319bca0", "scanner": "scanner-primary", "fingerprint": "92d53b8920b6a7b5", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "ai-assistant/pi/ai_sync.py:39"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0fae40589a014659", "level": "note", "message": {"text": "Possibly dead Python function: process_ai_response"}, "properties": {"repobilityId": "4ac0106fa5bbb6e0", "scanner": "scanner-primary", "fingerprint": "0fae40589a014659", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "ai-assistant/pi/ai_sync.py:153"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-90c09404d2b40212", "level": "note", "message": {"text": "Possibly dead Python function: button_callback"}, "properties": {"repobilityId": "005d05eb705beac2", "scanner": "scanner-primary", "fingerprint": "90c09404d2b40212", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pi-software/PoolDash_v6/scripts/button_handler.py:172"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-232ca760e6383674", "level": "note", "message": {"text": "Possibly dead Python function: detect_protocol"}, "properties": {"repobilityId": "04efa4818d90c1a6", "scanner": "scanner-primary", "fingerprint": "232ca760e6383674", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pi-software/PoolDash_v6/tools/modbus_logger.py:257"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-43897b6ceab3036b", "level": "note", "message": {"text": "Possibly dead Python function: bit_names_from_value"}, "properties": {"repobilityId": "ed6abbbf36b458a6", "scanner": "scanner-primary", "fingerprint": "43897b6ceab3036b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pi-software/PoolDash_v6/tools/modbus_logger.py:1048"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-798d05018188a246", "level": "note", "message": {"text": "Possibly dead Python function: scan_port"}, "properties": {"repobilityId": "e453ca5b239ff743", "scanner": "scanner-primary", "fingerprint": "798d05018188a246", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pi-software/PoolDash_v6/pooldash_app/utils/net.py:324"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-301e9aebf3848f96", "level": "note", "message": {"text": "Possibly dead Python function: ensure_maintenance_table_in_pool_db"}, "properties": {"repobilityId": "aeaeb79cd4e9d43f", "scanner": "scanner-primary", "fingerprint": "301e9aebf3848f96", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pi-software/PoolDash_v6/pooldash_app/db/maintenance.py:49"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b0c769c063bd5ed8", "level": "note", "message": {"text": "Possibly dead Python function: init_database"}, "properties": {"repobilityId": "88b949c51f59c4b2", "scanner": "scanner-primary", "fingerprint": "b0c769c063bd5ed8", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pi-software/PoolDash_v6/pooldash_app/db/connection.py:26"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a9085c7f5881c120", "level": "note", "message": {"text": "Possibly dead Python function: check_database_health"}, "properties": {"repobilityId": "5f99802fcc196b0f", "scanner": "scanner-primary", "fingerprint": "a9085c7f5881c120", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pi-software/PoolDash_v6/pooldash_app/db/connection.py:144"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-fb145c29f7adaf8a", "level": "note", "message": {"text": "Possibly dead Python function: delete_lsi_reading"}, "properties": {"repobilityId": "5a25b72c8be2b343", "scanner": "scanner-primary", "fingerprint": "fb145c29f7adaf8a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pi-software/PoolDash_v6/pooldash_app/db/lsi_history.py:196"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-82545c61eb0e6a2c", "level": "note", "message": {"text": "Possibly dead Python function: log_alarm"}, "properties": {"repobilityId": "96d4c664e11b00af", "scanner": "scanner-primary", "fingerprint": "82545c61eb0e6a2c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pi-software/PoolDash_v6/pooldash_app/db/alarm_log.py:57"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-795052e675488ac2", "level": "note", "message": {"text": "Possibly dead Python function: add_alarm_note"}, "properties": {"repobilityId": "acd7c8d23ada476b", "scanner": "scanner-primary", "fingerprint": "795052e675488ac2", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pi-software/PoolDash_v6/pooldash_app/db/alarm_log.py:102"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-45c70a553534a0fa", "level": "note", "message": {"text": "Possibly dead Python function: save_insight"}, "properties": {"repobilityId": "c48c0af29f27e57a", "scanner": "scanner-primary", "fingerprint": "45c70a553534a0fa", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "brain/llm_analyzer.py:82"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1670f200f21dbebc", "level": "note", "message": {"text": "Possibly dead Python function: update_equipment"}, "properties": {"repobilityId": "efb73d504da95e90", "scanner": "scanner-primary", "fingerprint": "1670f200f21dbebc", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "brain/investigator.py:218"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-07f463ee7e692878", "level": "note", "message": {"text": "Possibly dead Python function: update_optimal_parameters"}, "properties": {"repobilityId": "dfe2547bec989879", "scanner": "scanner-primary", "fingerprint": "07f463ee7e692878", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "brain/investigator.py:224"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-13de5b66bfd15095", "level": "note", "message": {"text": "Possibly dead Python function: cmd_list"}, "properties": {"repobilityId": "bd09044da90857da", "scanner": "scanner-primary", "fingerprint": "13de5b66bfd15095", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "web-portal/deploy.py:425"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-934d147b57d0f9c5", "level": "note", "message": {"text": "Possibly dead Python function: cmd_deploy"}, "properties": {"repobilityId": "d479bab747bee079", "scanner": "scanner-primary", "fingerprint": "934d147b57d0f9c5", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "web-portal/deploy.py:438"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-16f912ae96c44df5", "level": "note", "message": {"text": "Possibly dead Python function: cmd_verify"}, "properties": {"repobilityId": "658bcb24bc7535c7", "scanner": "scanner-primary", "fingerprint": "16f912ae96c44df5", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "web-portal/deploy.py:466"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1c139fe8220f1139", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 mobile-app/src/stores/deviceStore.ts:145"}, "properties": {"repobilityId": "67ff0ddcab318633", "scanner": "scanner-primary", "fingerprint": "1c139fe8220f1139", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7936caae009575a6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 mobile-app/src/stores/authStore.ts:146"}, "properties": {"repobilityId": "11c0fc5221270e5f", "scanner": "scanner-primary", "fingerprint": "7936caae009575a6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3bd34547b17a9015", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 mobile-app/src/services/auth.ts:67"}, "properties": {"repobilityId": "ce85ddf3e64601a9", "scanner": "scanner-primary", "fingerprint": "3bd34547b17a9015", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7748b645ecec6138", "level": "note", "message": {"text": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 pi-software/PoolDash_v6/pooldash_app/static/js/plotly-basic-2.27.0.min.js:8"}, "properties": {"repobilityId": "b97550ba2c8e1d20", "scanner": "scanner-primary", "fingerprint": "7748b645ecec6138", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.edge-label.no-bg"]}}, {"ruleId": "scanner-d730b475a7c16d75", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 web-portal/poolai_deploy/service-worker.js:42"}, "properties": {"repobilityId": "48f5dc4fe0283c9a", "scanner": "scanner-primary", "fingerprint": "d730b475a7c16d75", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2f48467303c91494", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 web-portal/poolai_deploy/assets/js/pwa.js:32"}, "properties": {"repobilityId": "a55807e4190b5b39", "scanner": "scanner-primary", "fingerprint": "2f48467303c91494", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-98ee9b1ab891d9a1", "level": "warning", "message": {"text": "Privileged port 502 in use"}, "properties": {"repobilityId": "266ca9fc258b3118", "scanner": "scanner-primary", "fingerprint": "98ee9b1ab891d9a1", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pi-software/PoolDash_v6/scripts/post_install.sh"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b1e89245239e0936", "level": "warning", "message": {"text": "Privileged port 1000 in use"}, "properties": {"repobilityId": "5ac9fc9372cfe169", "scanner": "scanner-primary", "fingerprint": "b1e89245239e0936", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pi-software/PoolDash_v6/deploy/pre_configure.sh"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-875ebe51f94341a5", "level": "error", "message": {"text": "Insecure pattern 'python_os_system' in pi-software/PoolDash_v6/scripts/device_upload.py:69"}, "properties": {"repobilityId": "ed62aea60e86e7d6", "scanner": "scanner-primary", "fingerprint": "875ebe51f94341a5", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "python_os_system"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pi-software/PoolDash_v6/scripts/device_upload.py"}, "region": {"startLine": 69}}}]}, {"ruleId": "scanner-6ce2be902220f9c7", "level": "error", "message": {"text": "Insecure pattern 'subprocess_shell_true' in pi-software/PoolDash_v6/scripts/button_handler.py:83"}, "properties": {"repobilityId": "21c3ffaedccf00c0", "scanner": "scanner-primary", "fingerprint": "6ce2be902220f9c7", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "subprocess_shell_true"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pi-software/PoolDash_v6/scripts/button_handler.py"}, "region": {"startLine": 83}}}]}, {"ruleId": "scanner-756e3a2870a55daa", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in pi-software/PoolDash_v6/pooldash_app/static/js/plotly-basic-2.27.0.min.js:8"}, "properties": {"repobilityId": "5e0ff80b6d1154f7", "scanner": "scanner-primary", "fingerprint": "756e3a2870a55daa", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pi-software/PoolDash_v6/pooldash_app/static/js/plotly-basic-2.27.0.min.js"}, "region": {"startLine": 8}}}]}, {"ruleId": "scanner-a10578cac83497b3", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in pi-software/PoolDash_v6/pooldash_app/static/js/plotly-basic-2.27.0.min.js:8"}, "properties": {"repobilityId": "e98c615954302a48", "scanner": "scanner-primary", "fingerprint": "a10578cac83497b3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pi-software/PoolDash_v6/pooldash_app/static/js/plotly-basic-2.27.0.min.js"}, "region": {"startLine": 8}}}]}, {"ruleId": "scanner-96918141a33706ce", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in pi-software/PoolDash_v6/pooldash_app/blueprints/charts.py:426"}, "properties": {"repobilityId": "c65150c83b2b17c4", "scanner": "scanner-primary", "fingerprint": "96918141a33706ce", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pi-software/PoolDash_v6/pooldash_app/blueprints/charts.py"}, "region": {"startLine": 426}}}]}, {"ruleId": "scanner-84d6b1474f028820", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in pi-software/PoolDash_v6/pooldash_app/blueprints/main_ui.py:1173"}, "properties": {"repobilityId": "259875612612b95f", "scanner": "scanner-primary", "fingerprint": "84d6b1474f028820", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pi-software/PoolDash_v6/pooldash_app/blueprints/main_ui.py"}, "region": {"startLine": 1173}}}]}, {"ruleId": "scanner-a1b878189c5ea7b9", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in pi-software/PoolDash_v6/pooldash_app/blueprints/proxy.py:60"}, "properties": {"repobilityId": "abcf954ed6c9411b", "scanner": "scanner-primary", "fingerprint": "a1b878189c5ea7b9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pi-software/PoolDash_v6/pooldash_app/blueprints/proxy.py"}, "region": {"startLine": 60}}}]}, {"ruleId": "scanner-37824f2b259589be", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in brain/launcher.py:565"}, "properties": {"repobilityId": "7e9ee05e7fe708bb", "scanner": "scanner-primary", "fingerprint": "37824f2b259589be", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "brain/launcher.py"}, "region": {"startLine": 565}}}]}, {"ruleId": "scanner-acffd109e2fa774b", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in web-portal/js/portal.js:18"}, "properties": {"repobilityId": "eb15919c374bd1fe", "scanner": "scanner-primary", "fingerprint": "acffd109e2fa774b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "web-portal/js/portal.js"}, "region": {"startLine": 18}}}]}, {"ruleId": "scanner-ccabba5fc0ee0460", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in web-portal/js/app.js:86"}, "properties": {"repobilityId": "5eadd307604fbed2", "scanner": "scanner-primary", "fingerprint": "ccabba5fc0ee0460", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "web-portal/js/app.js"}, "region": {"startLine": 86}}}]}, {"ruleId": "scanner-35e6ce54a9c7444c", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in web-portal/js/admin.js:31"}, "properties": {"repobilityId": "9a9645207db713b8", "scanner": "scanner-primary", "fingerprint": "35e6ce54a9c7444c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "web-portal/js/admin.js"}, "region": {"startLine": 31}}}]}, {"ruleId": "scanner-2385946e81041ed5", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in web-portal/poolai_deploy/assets/js/pwa.js:90"}, "properties": {"repobilityId": "35cc1d59222acca3", "scanner": "scanner-primary", "fingerprint": "2385946e81041ed5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "web-portal/poolai_deploy/assets/js/pwa.js"}, "region": {"startLine": 90}}}]}, {"ruleId": "scanner-0b6f1ad7c106efe7", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "e01298756965f4f1", "scanner": "scanner-primary", "fingerprint": "0b6f1ad7c106efe7", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "web-portal/.github/workflows/test.yml"}, "region": {"startLine": 19}}}]}, {"ruleId": "scanner-0b6f1ad7c106efe7", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "94ccd55aac853b96", "scanner": "scanner-primary", "fingerprint": "0b6f1ad7c106efe7", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "web-portal/.github/workflows/test.yml"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-0b6f1ad7c106efe7", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "fc16dc024685719a", "scanner": "scanner-primary", "fingerprint": "0b6f1ad7c106efe7", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "web-portal/.github/workflows/test.yml"}, "region": {"startLine": 42}}}]}, {"ruleId": "scanner-42b5222450df9811", "level": "note", "message": {"text": "Very large file: pi-software/PoolDash_v6/tools/modbus_logger.py (2073 lines)"}, "properties": {"repobilityId": "9da5ee24f4ac79c8", "scanner": "scanner-primary", "fingerprint": "42b5222450df9811", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-944ed75fad73077f", "level": "note", "message": {"text": "Very large file: pi-software/PoolDash_v6/pooldash_app/blueprints/main_ui.py (4929 lines)"}, "properties": {"repobilityId": "1059e338bbbf189a", "scanner": "scanner-primary", "fingerprint": "944ed75fad73077f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "b3080593c8630242", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "ed4a6b3a951343a3", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "060f2c925750e903", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "5d7d82c8779d5905", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "8356f3c0c97cff63", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-9a2f5711d445061a", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: pi-software/CLAUDE.md"}, "properties": {"repobilityId": "abb574f331b4acca", "scanner": "scanner-primary", "fingerprint": "9a2f5711d445061a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pi-software/CLAUDE.md"}, "region": {"startLine": 62}}}]}, {"ruleId": "scanner-c74c9b639da1d226", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: pi-software/PoolDash_v6/CLAUDE.md"}, "properties": {"repobilityId": "5734cacae48d1578", "scanner": "scanner-primary", "fingerprint": "c74c9b639da1d226", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pi-software/PoolDash_v6/CLAUDE.md"}, "region": {"startLine": 41}}}]}, {"ruleId": "scanner-d4de38c3d3a2f9ba", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: pi-software/PoolDash_v6/CLAUDE.md"}, "properties": {"repobilityId": "eac0a4751aa93d71", "scanner": "scanner-primary", "fingerprint": "d4de38c3d3a2f9ba", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pi-software/PoolDash_v6/CLAUDE.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4d6ed31ce96e8a7d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: pi-software/.claude/settings.local.json"}, "properties": {"repobilityId": "f635ea548b1ff728", "scanner": "scanner-primary", "fingerprint": "4d6ed31ce96e8a7d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pi-software/.claude/settings.local.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-643b10d84d18f7a3", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: brain/CLAUDE.md"}, "properties": {"repobilityId": "9cd83a03c2389459", "scanner": "scanner-primary", "fingerprint": "643b10d84d18f7a3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "brain/CLAUDE.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-08e1159f6534e180", "level": "note", "message": {"text": "Legacy-named symbol `app_backup` in pi-software/PoolDash_v6/scripts/update_check.py:447"}, "properties": {"repobilityId": "2f7032d60a588dc2", "scanner": "scanner-primary", "fingerprint": "08e1159f6534e180", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a5702eb7e86d48b6", "level": "none", "message": {"text": "Commented-code block (5 lines) in pi-software/PoolDash_v6/scripts/update_check.py:756"}, "properties": {"repobilityId": "1efa0855231d0ea9", "scanner": "scanner-primary", "fingerprint": "a5702eb7e86d48b6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-025bbe47d49ecf5c", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 pi-software/PoolDash_v6/scripts/update_check.py:626"}, "properties": {"repobilityId": "a935cc55e4d9a333", "scanner": "scanner-primary", "fingerprint": "025bbe47d49ecf5c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fa390febc6a282bb", "level": "none", "message": {"text": "Commented-code block (5 lines) in pi-software/PoolDash_v6/scripts/health_reporter.py:72"}, "properties": {"repobilityId": "eaad4dc86e4a843d", "scanner": "scanner-primary", "fingerprint": "fa390febc6a282bb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5077895525bf8830", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 pi-software/PoolDash_v6/scripts/publish_update.py:56"}, "properties": {"repobilityId": "a7671d4b966f24d5", "scanner": "scanner-primary", "fingerprint": "5077895525bf8830", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-741fdd2541bc7b52", "level": "note", "message": {"text": "Legacy-named symbol `old_backup` in pi-software/PoolDash_v6/tools/config_backup.py:84"}, "properties": {"repobilityId": "87461ccb45c287dd", "scanner": "scanner-primary", "fingerprint": "741fdd2541bc7b52", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-bd394435f6264082", "level": "none", "message": {"text": "Commented-code block (27 lines) in pi-software/PoolDash_v6/tools/modbus_logger.py:667"}, "properties": {"repobilityId": "87adaf680dfd568e", "scanner": "scanner-primary", "fingerprint": "bd394435f6264082", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a12dc31e19d7701e", "level": "none", "message": {"text": "Commented-code block (8 lines) in pi-software/PoolDash_v6/modbus/ezetrol_modbus_points.py:6"}, "properties": {"repobilityId": "e50136da463950cc", "scanner": "scanner-primary", "fingerprint": "a12dc31e19d7701e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2f8e372483668f06", "level": "none", "message": {"text": "Commented-code block (5 lines) in pi-software/PoolDash_v6/modbus/walchem_modbus_points.py:12"}, "properties": {"repobilityId": "a39fd2821d708ad1", "scanner": "scanner-primary", "fingerprint": "2f8e372483668f06", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-aba9c708bb0d000e", "level": "none", "message": {"text": "Commented-code block (8 lines) in pi-software/PoolDash_v6/modbus/rs485/water_tester_points.py:8"}, "properties": {"repobilityId": "f6395de47d70884e", "scanner": "scanner-primary", "fingerprint": "aba9c708bb0d000e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-200572e67de7af5e", "level": "none", "message": {"text": "Commented-code block (5 lines) in pi-software/PoolDash_v6/pooldash_app/persist.py:130"}, "properties": {"repobilityId": "e54c56156a38acd2", "scanner": "scanner-primary", "fingerprint": "200572e67de7af5e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7e96d18dfb7368a0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 pi-software/PoolDash_v6/pooldash_app/static/sw.js:53"}, "properties": {"repobilityId": "e5c25ee41a60032e", "scanner": "scanner-primary", "fingerprint": "7e96d18dfb7368a0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-26fc2deaa38ac08d", "level": "note", "message": {"text": "Legacy-named symbol `ssh_authorized_keys_backup` in pi-software/PoolDash_v6/pooldash_app/blueprints/main_ui.py:1962"}, "properties": {"repobilityId": "81188460f252ce3c", "scanner": "scanner-primary", "fingerprint": "26fc2deaa38ac08d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-c1700ca24493cec7", "level": "none", "message": {"text": "Commented-code block (5 lines) in pi-software/PoolDash_v6/pooldash_app/blueprints/main_ui.py:223"}, "properties": {"repobilityId": "9d7ad2ee1edad4e5", "scanner": "scanner-primary", "fingerprint": "c1700ca24493cec7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4624833d548ef673", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 pi-software/PoolDash_v6/pooldash_app/blueprints/main_ui.py:2929"}, "properties": {"repobilityId": "6ffa7de01ed7a158", "scanner": "scanner-primary", "fingerprint": "4624833d548ef673", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-956c80c6ad9c5e66", "level": "none", "message": {"text": "Commented-code block (5 lines) in brain/alert_checker.py:24"}, "properties": {"repobilityId": "a19dd652e2b45245", "scanner": "scanner-primary", "fingerprint": "956c80c6ad9c5e66", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c867d07c45194f34", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-portal/js/portal.js:85"}, "properties": {"repobilityId": "15e8e618bc99ef39", "scanner": "scanner-primary", "fingerprint": "c867d07c45194f34", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e03ba1a646b6dd10", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-portal/js/admin.js:22"}, "properties": {"repobilityId": "31ad53a43b8a2353", "scanner": "scanner-primary", "fingerprint": "e03ba1a646b6dd10", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1662ae7a5bb4e048", "level": "note", "message": {"text": "33 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "90293c220e284644", "scanner": "scanner-primary", "fingerprint": "1662ae7a5bb4e048", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "b56c78bf3d623e85", "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": "cc9982cd7828d33c", "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": "f7062944f6f7b075", "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": "f431ac90683b5baa", "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": "d242901e94f7584d", "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": "f50de5269c9429a6", "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": "0c8fde6532f87411", "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": "7b18f2082e5b454c", "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": "22728aed7bbf6e7e", "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": "85121d0cdf289a9a", "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": "6684092f5961b51b", "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": "7eeca267b0622608", "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": "bb143c25b9cf7721", "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": "8a16853eb861202b", "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": "cc20b218801f0e7f", "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": "6f0cbe2bad3d4ee1", "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": "e585aaa78a88fb21", "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": "5702f5f90f1a3648", "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": "a85833148c3302b1", "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": "31c36bfcd85306c8", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-cad9289176197521", "level": "error", "message": {"text": "Flask mutation route `api_settings` without `@login_required` \u2014 brain/launcher.py:646"}, "properties": {"repobilityId": "93ff282f15d5d6c5", "scanner": "scanner-primary", "fingerprint": "cad9289176197521", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "brain/launcher.py"}, "region": {"startLine": 646}}}]}, {"ruleId": "scanner-7583250d8b26919e", "level": "error", "message": {"text": "Flask mutation route `api_push` without `@login_required` \u2014 brain/launcher.py:657"}, "properties": {"repobilityId": "b4a86fd04da2c0d3", "scanner": "scanner-primary", "fingerprint": "7583250d8b26919e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "brain/launcher.py"}, "region": {"startLine": 657}}}]}, {"ruleId": "scanner-0e32932f662ab7a0", "level": "error", "message": {"text": "Flask mutation route `api_initiate` without `@login_required` \u2014 brain/launcher.py:685"}, "properties": {"repobilityId": "a59b09f4b4b4e59a", "scanner": "scanner-primary", "fingerprint": "0e32932f662ab7a0", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "brain/launcher.py"}, "region": {"startLine": 685}}}]}, {"ruleId": "scanner-52fa44005b6ece23", "level": "error", "message": {"text": "Flask mutation route `start_session` without `@login_required` \u2014 brain/technician_web.py:261"}, "properties": {"repobilityId": "e2eb7e6f817edfef", "scanner": "scanner-primary", "fingerprint": "52fa44005b6ece23", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "brain/technician_web.py"}, "region": {"startLine": 261}}}]}, {"ruleId": "scanner-f5b4a24d07f87bcd", "level": "error", "message": {"text": "Flask mutation route `respond` without `@login_required` \u2014 brain/technician_web.py:270"}, "properties": {"repobilityId": "6d2e94a33d426ec5", "scanner": "scanner-primary", "fingerprint": "f5b4a24d07f87bcd", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "brain/technician_web.py"}, "region": {"startLine": 270}}}]}, {"ruleId": "scanner-5bb24e267d94959a", "level": "error", "message": {"text": "Flask mutation route `finish_session` without `@login_required` \u2014 brain/technician_web.py:281"}, "properties": {"repobilityId": "b79ff991cfa990e2", "scanner": "scanner-primary", "fingerprint": "5bb24e267d94959a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "brain/technician_web.py"}, "region": {"startLine": 281}}}]}, {"ruleId": "scanner-175c7947c681b839", "level": "error", "message": {"text": "Flask mutation route `apply_changes` without `@login_required` \u2014 brain/technician_web.py:303"}, "properties": {"repobilityId": "8dbc6dcb68d96ccc", "scanner": "scanner-primary", "fingerprint": "175c7947c681b839", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "brain/technician_web.py"}, "region": {"startLine": 303}}}]}, {"ruleId": "scanner-63da891c38a4ee68", "level": "error", "message": {"text": "Flask mutation route `sms_webhook` without `@login_required` \u2014 brain/technician_sms.py:225"}, "properties": {"repobilityId": "e408ca7dc7f26555", "scanner": "scanner-primary", "fingerprint": "63da891c38a4ee68", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "brain/technician_sms.py"}, "region": {"startLine": 225}}}]}, {"ruleId": "scanner-99f632a3c167556b", "level": "error", "message": {"text": "Flask mutation route `whatsapp_webhook` without `@login_required` \u2014 brain/technician_sms.py:240"}, "properties": {"repobilityId": "56136c35b4996fe8", "scanner": "scanner-primary", "fingerprint": "99f632a3c167556b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "brain/technician_sms.py"}, "region": {"startLine": 240}}}]}, {"ruleId": "scanner-be3f4aae41c90efb", "level": "error", "message": {"text": "Dangling fetch: GET /api/portal/pools (web-portal/js/portal.js:184)"}, "properties": {"repobilityId": "12e270b35c098d80", "scanner": "scanner-primary", "fingerprint": "be3f4aae41c90efb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-079850c80cc62a7c", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/accounts (web-portal/js/admin.js:221)"}, "properties": {"repobilityId": "1b257b17a62ae0ec", "scanner": "scanner-primary", "fingerprint": "079850c80cc62a7c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ad753fc4e3803df1", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/pools (web-portal/js/admin.js:292)"}, "properties": {"repobilityId": "e7fc8d434e956352", "scanner": "scanner-primary", "fingerprint": "ad753fc4e3803df1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-31400245f65232f2", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/users (web-portal/js/admin.js:327)"}, "properties": {"repobilityId": "7531baa11f353eae", "scanner": "scanner-primary", "fingerprint": "31400245f65232f2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1a6d91f2236825bf", "level": "note", "message": {"text": "Unused endpoint: ANY /"}, "properties": {"repobilityId": "e77562ae3aa23e54", "scanner": "scanner-primary", "fingerprint": "1a6d91f2236825bf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d25275a307dd9d7e", "level": "note", "message": {"text": "Unused endpoint: ANY /api/questions"}, "properties": {"repobilityId": "b44f62a0054f934c", "scanner": "scanner-primary", "fingerprint": "d25275a307dd9d7e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c6aedc5902ae2a7b", "level": "note", "message": {"text": "Unused endpoint: ANY /api/answer"}, "properties": {"repobilityId": "91855b71714feb8d", "scanner": "scanner-primary", "fingerprint": "c6aedc5902ae2a7b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-94cf8ac3c15e385d", "level": "note", "message": {"text": "Unused endpoint: ANY /api/suggestions"}, "properties": {"repobilityId": "24ea7186d8257695", "scanner": "scanner-primary", "fingerprint": "94cf8ac3c15e385d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ef6ac3856a926303", "level": "note", "message": {"text": "Unused endpoint: ANY /api/suggestion/<int:suggestion_id>/read"}, "properties": {"repobilityId": "76b2944012e8cda5", "scanner": "scanner-primary", "fingerprint": "ef6ac3856a926303", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a9b3675fb0d4e78", "level": "note", "message": {"text": "Unused endpoint: ANY /api/suggestion/<int:suggestion_id>/action"}, "properties": {"repobilityId": "f5e6fa246540a9e4", "scanner": "scanner-primary", "fingerprint": "7a9b3675fb0d4e78", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d378219dfb1107c3", "level": "note", "message": {"text": "Unused endpoint: ANY /api/ask-me"}, "properties": {"repobilityId": "c63389134e5cf0c3", "scanner": "scanner-primary", "fingerprint": "d378219dfb1107c3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ec3442aa0b6ba39d", "level": "note", "message": {"text": "Unused endpoint: ANY /api/stats"}, "properties": {"repobilityId": "5480aa8da77ade7e", "scanner": "scanner-primary", "fingerprint": "ec3442aa0b6ba39d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e1ed71a0cbdc0baf", "level": "note", "message": {"text": "Unused endpoint: ANY /hotspot-detect.html"}, "properties": {"repobilityId": "f72c880c9f0a6985", "scanner": "scanner-primary", "fingerprint": "e1ed71a0cbdc0baf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c27a320d71dc671b", "level": "note", "message": {"text": "Unused endpoint: ANY /library/test/success.html"}, "properties": {"repobilityId": "d1d601fe1e0352e6", "scanner": "scanner-primary", "fingerprint": "c27a320d71dc671b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3938916e419a6288", "level": "note", "message": {"text": "Unused endpoint: ANY /generate_204"}, "properties": {"repobilityId": "a0212031bde002c1", "scanner": "scanner-primary", "fingerprint": "3938916e419a6288", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-665321754fa6c7c9", "level": "note", "message": {"text": "Unused endpoint: ANY /gen_204"}, "properties": {"repobilityId": "ed4b4c25c0d26b86", "scanner": "scanner-primary", "fingerprint": "665321754fa6c7c9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ffd113257a60f7e1", "level": "note", "message": {"text": "Unused endpoint: ANY /connectivitycheck.gstatic.com"}, "properties": {"repobilityId": "476cf8fabca20635", "scanner": "scanner-primary", "fingerprint": "ffd113257a60f7e1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-533c5ba7c225e237", "level": "note", "message": {"text": "Unused endpoint: ANY /success.txt"}, "properties": {"repobilityId": "c103841d8c6170c6", "scanner": "scanner-primary", "fingerprint": "533c5ba7c225e237", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-78ae901d6447c721", "level": "note", "message": {"text": "Unused endpoint: ANY /canonical.html"}, "properties": {"repobilityId": "ceffaf75b1c36b24", "scanner": "scanner-primary", "fingerprint": "78ae901d6447c721", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2ee9aa9110562a1c", "level": "note", "message": {"text": "Unused endpoint: ANY /ncsi.txt"}, "properties": {"repobilityId": "1b93bff21510c0c8", "scanner": "scanner-primary", "fingerprint": "2ee9aa9110562a1c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8ece8c987ff9c424", "level": "note", "message": {"text": "Unused endpoint: ANY /api/health"}, "properties": {"repobilityId": "e5718471ac3dc66e", "scanner": "scanner-primary", "fingerprint": "8ece8c987ff9c424", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d87d1b555a41341a", "level": "note", "message": {"text": "Unused endpoint: ANY /api/ping"}, "properties": {"repobilityId": "53098e156017ed01", "scanner": "scanner-primary", "fingerprint": "d87d1b555a41341a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cef85d74321f8d23", "level": "note", "message": {"text": "Unused endpoint: GET /<pool>"}, "properties": {"repobilityId": "b98f2e01068e54b6", "scanner": "scanner-primary", "fingerprint": "cef85d74321f8d23", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d1d75a1138964439", "level": "note", "message": {"text": "Unused endpoint: GET /api/<pool>"}, "properties": {"repobilityId": "b5537c4bc639920f", "scanner": "scanner-primary", "fingerprint": "d1d75a1138964439", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2e5aabe12b61af72", "level": "note", "message": {"text": "Unused endpoint: GET /api/<pool>/controller-states"}, "properties": {"repobilityId": "0f0f71a534bc70c3", "scanner": "scanner-primary", "fingerprint": "2e5aabe12b61af72", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-eeb3d5890bfa4277", "level": "note", "message": {"text": "Unused endpoint: GET /api/<pool>/states"}, "properties": {"repobilityId": "a19a5508f8cca749", "scanner": "scanner-primary", "fingerprint": "eeb3d5890bfa4277", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-404e8721d02e48ce", "level": "note", "message": {"text": "Unused endpoint: GET /<pool>/history"}, "properties": {"repobilityId": "6c1f4d85857441a9", "scanner": "scanner-primary", "fingerprint": "404e8721d02e48ce", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f98a967888e658b8", "level": "note", "message": {"text": "Unused endpoint: POST /acknowledge/<int:alarm_id>"}, "properties": {"repobilityId": "77ddf0c2bf1c229d", "scanner": "scanner-primary", "fingerprint": "f98a967888e658b8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-98a7ee3c9be7c4db", "level": "note", "message": {"text": "Unused endpoint: POST /<pool>/sync"}, "properties": {"repobilityId": "5b5c2054a388bed5", "scanner": "scanner-primary", "fingerprint": "98a7ee3c9be7c4db", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-44d648b4a5bba022", "level": "note", "message": {"text": "Unused endpoint: GET /<pool>/export"}, "properties": {"repobilityId": "2ebc08f9d3b78492", "scanner": "scanner-primary", "fingerprint": "44d648b4a5bba022", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d51b194a95fa8fbd", "level": "note", "message": {"text": "Unused endpoint: ANY /api/<pool>/<metric>/data"}, "properties": {"repobilityId": "728e3a048b3147f4", "scanner": "scanner-primary", "fingerprint": "d51b194a95fa8fbd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-afe1d2b968d293bb", "level": "note", "message": {"text": "Unused endpoint: ANY /<pool>/<metric>"}, "properties": {"repobilityId": "bad861b7196ef086", "scanner": "scanner-primary", "fingerprint": "afe1d2b968d293bb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9bc89dc39169ae5f", "level": "note", "message": {"text": "Unused endpoint: ANY /api/<pool>/trends/data"}, "properties": {"repobilityId": "9d7287a6ee79589f", "scanner": "scanner-primary", "fingerprint": "9bc89dc39169ae5f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-848cf0c2042e1ca5", "level": "note", "message": {"text": "Unused endpoint: ANY /<pool>/trends"}, "properties": {"repobilityId": "4fa17fbbe64a7287", "scanner": "scanner-primary", "fingerprint": "848cf0c2042e1ca5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3de800d2ede5d76e", "level": "note", "message": {"text": "Unused endpoint: ANY /<pool>/lsi"}, "properties": {"repobilityId": "a3db61830a948f57", "scanner": "scanner-primary", "fingerprint": "3de800d2ede5d76e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7d78baeac93db0f5", "level": "note", "message": {"text": "Unused endpoint: ANY /ip_view"}, "properties": {"repobilityId": "547c058257885856", "scanner": "scanner-primary", "fingerprint": "7d78baeac93db0f5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8082a73471c12ab9", "level": "note", "message": {"text": "Unused endpoint: ANY /ip_proxy"}, "properties": {"repobilityId": "cdfa431a42304743", "scanner": "scanner-primary", "fingerprint": "8082a73471c12ab9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9d5009ebe5309323", "level": "note", "message": {"text": "Unused endpoint: ANY /pool/<pool>"}, "properties": {"repobilityId": "9338292e7802f8f9", "scanner": "scanner-primary", "fingerprint": "9d5009ebe5309323", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c8895667bd0d82d1", "level": "note", "message": {"text": "Unused endpoint: ANY /pool/<pool>/maintenance"}, "properties": {"repobilityId": "9f0d4e4cc2366273", "scanner": "scanner-primary", "fingerprint": "c8895667bd0d82d1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f98b7cfdb2b8a3ce", "level": "note", "message": {"text": "Unused endpoint: ANY /pool/<pool>/maintenance/logs"}, "properties": {"repobilityId": "a4d2f9314651d876", "scanner": "scanner-primary", "fingerprint": "f98b7cfdb2b8a3ce", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7cc81dbd0f76f055", "level": "note", "message": {"text": "Unused endpoint: ANY /pool/<pool>/lsi/autofill"}, "properties": {"repobilityId": "9f3da43fd9103aa5", "scanner": "scanner-primary", "fingerprint": "7cc81dbd0f76f055", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3f15153a9bac1f96", "level": "note", "message": {"text": "Unused endpoint: ANY /pool/<pool>/lsi/history"}, "properties": {"repobilityId": "bc8f17e5db85a0be", "scanner": "scanner-primary", "fingerprint": "3f15153a9bac1f96", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-730243f5702f0b8a", "level": "note", "message": {"text": "Unused endpoint: ANY /settings"}, "properties": {"repobilityId": "8f4c0e496f4aed3a", "scanner": "scanner-primary", "fingerprint": "730243f5702f0b8a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7875e0cd18e3595e", "level": "note", "message": {"text": "Unused endpoint: ANY /qr"}, "properties": {"repobilityId": "3d902e4ff671d0d1", "scanner": "scanner-primary", "fingerprint": "7875e0cd18e3595e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cc13121b336b41af", "level": "note", "message": {"text": "Unused endpoint: ANY /connect"}, "properties": {"repobilityId": "384e7b65a1d7786f", "scanner": "scanner-primary", "fingerprint": "cc13121b336b41af", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9b6c35c8f546b846", "level": "note", "message": {"text": "Unused endpoint: ANY /qr/page"}, "properties": {"repobilityId": "47e6007acdc769ab", "scanner": "scanner-primary", "fingerprint": "9b6c35c8f546b846", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d6b170c1d7ce65fb", "level": "note", "message": {"text": "Unused endpoint: ANY /settings/wifi/scan"}, "properties": {"repobilityId": "c321b65b6dbc1bea", "scanner": "scanner-primary", "fingerprint": "d6b170c1d7ce65fb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9920b054e8c4a493", "level": "note", "message": {"text": "Unused endpoint: ANY /settings/wifi"}, "properties": {"repobilityId": "1f817abf6a43f556", "scanner": "scanner-primary", "fingerprint": "9920b054e8c4a493", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ae24ab024b7f9e7c", "level": "note", "message": {"text": "Unused endpoint: ANY /settings/wifi/disconnect"}, "properties": {"repobilityId": "3843fe8bf693b6d2", "scanner": "scanner-primary", "fingerprint": "ae24ab024b7f9e7c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-18437d3ab3c11278", "level": "note", "message": {"text": "Unused endpoint: ANY /settings/ethernet"}, "properties": {"repobilityId": "3eb97a91f8773b5a", "scanner": "scanner-primary", "fingerprint": "18437d3ab3c11278", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-211cc62be0a2adf3", "level": "note", "message": {"text": "Unused endpoint: ANY /settings/wifi/ip"}, "properties": {"repobilityId": "39bd9e1ec1d9fad2", "scanner": "scanner-primary", "fingerprint": "211cc62be0a2adf3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f069ca41b7dc4d6a", "level": "note", "message": {"text": "Unused endpoint: ANY /settings/network/reset"}, "properties": {"repobilityId": "176bf670e991343a", "scanner": "scanner-primary", "fingerprint": "f069ca41b7dc4d6a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d32fa92596767616", "level": "note", "message": {"text": "Unused endpoint: ANY /settings/network/diagnostics"}, "properties": {"repobilityId": "02a9a2e4977a2158", "scanner": "scanner-primary", "fingerprint": "d32fa92596767616", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8e29637c20833895", "level": "note", "message": {"text": "Unused endpoint: ANY /settings/reboot"}, "properties": {"repobilityId": "d975c2fa48dab411", "scanner": "scanner-primary", "fingerprint": "8e29637c20833895", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}