{"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-b34bf690553ce7ce", "name": "Possibly dead Python function: token_updated_callback", "shortDescription": {"text": "Possibly dead Python function: token_updated_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-6696254eae7fd20d", "name": "Possibly dead Python function: post_interim", "shortDescription": {"text": "Possibly dead Python function: post_interim"}, "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-5b8019502810394e", "name": "Possibly dead Python function: post_busy", "shortDescription": {"text": "Possibly dead Python function: post_busy"}, "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-2a62fe395fdbac73", "name": "Possibly dead Python function: executor_wrapper", "shortDescription": {"text": "Possibly dead Python function: executor_wrapper"}, "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-defd76cea2372b81", "name": "Possibly dead Python function: add_subscription", "shortDescription": {"text": "Possibly dead Python function: add_subscription"}, "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-f1158bbac7c9bde5", "name": "Possibly dead Python function: cancel_subscription", "shortDescription": {"text": "Possibly dead Python function: cancel_subscription"}, "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-ad9bbf50c89a7d35", "name": "Possibly dead Python function: dismiss_recurring_alert", "shortDescription": {"text": "Possibly dead Python function: dismiss_recurring_alert"}, "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-c2945c6edd98eb23", "name": "Possibly dead Python function: accept_price_change", "shortDescription": {"text": "Possibly dead Python function: accept_price_change"}, "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-59ecf4251ef5049e", "name": "Possibly dead Python function: list_subscriptions", "shortDescription": {"text": "Possibly dead Python function: list_subscriptions"}, "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-3e0120b52d0a3769", "name": "Possibly dead Python function: month_range", "shortDescription": {"text": "Possibly dead Python function: month_range"}, "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-e67ff00b00fbd466", "name": "Possibly dead Python function: public_rpc", "shortDescription": {"text": "Possibly dead Python function: public_rpc"}, "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-09a168142a54098f", "name": "Possibly dead Python function: finance_count", "shortDescription": {"text": "Possibly dead Python function: finance_count"}, "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-d573ea371148c277", "name": "Possibly dead Python function: public_count", "shortDescription": {"text": "Possibly dead Python function: public_count"}, "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-12270e5e16613ec6", "name": "Possibly dead Python function: incremental_seed_import", "shortDescription": {"text": "Possibly dead Python function: incremental_seed_import"}, "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-bd5fc32af5604c49", "name": "Possibly dead Python function: balance_monitor", "shortDescription": {"text": "Possibly dead Python function: balance_monitor"}, "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-2490de802627b423", "name": "Possibly dead Python function: register_health_check", "shortDescription": {"text": "Possibly dead Python function: register_health_check"}, "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-acb338c30e35c5f0", "name": "Possibly dead Python function: health_check_job", "shortDescription": {"text": "Possibly dead Python function: health_check_job"}, "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-d978ad747fea0082", "name": "Possibly dead Python function: youtube_feed", "shortDescription": {"text": "Possibly dead Python function: youtube_feed"}, "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-03d479c0539f3706", "name": "Possibly dead Python function: school_pickup_report", "shortDescription": {"text": "Possibly dead Python function: school_pickup_report"}, "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-656c8d36080118ef", "name": "Stray `console.log` in TS/JS \u2014 tests/test_healthera.js:68", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/test_healthera.js:68"}, "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-9b3b78fcea36019e", "name": "Stray `console.log` in TS/JS \u2014 tests/test_amazon_flow.js:40", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/test_amazon_flow.js:40"}, "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-2537ad7cc9633931", "name": "Stray `console.log` in TS/JS \u2014 scripts/check_memory_queue.js:7", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check_memory_queue.js:7"}, "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-466aeb215484b17d", "name": "Stray `console.log` in TS/JS \u2014 peter_dashboard/static/js/app.js:239", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 peter_dashboard/static/js/app.js:239"}, "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-0f1e17c23278a8bb", "name": "Insecure pattern 'eval_used' in openapi.json:1", "shortDescription": {"text": "Insecure pattern 'eval_used' in openapi.json:1"}, "fullDescription": {"text": "Found a known-risky pattern (eval_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6d705928403a5091", "name": "Insecure pattern 'subprocess_shell_true' in hadley_api/japan_train_status.py:35", "shortDescription": {"text": "Insecure pattern 'subprocess_shell_true' in hadley_api/japan_train_status.py:35"}, "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-8d07778cdfeb78ab", "name": "Insecure pattern 'eval_used' in hadley_api/main.py:5176", "shortDescription": {"text": "Insecure pattern 'eval_used' in hadley_api/main.py:5176"}, "fullDescription": {"text": "Found a known-risky pattern (eval_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f27ade689904e7c2", "name": "Insecure pattern 'direct_innerhtml_assignment' in hadley_api/main.py:8317", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in hadley_api/main.py:8317"}, "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-ccae3d159b062157", "name": "Insecure pattern 'subprocess_shell_true' in hadley_api/claude_routes.py:180", "shortDescription": {"text": "Insecure pattern 'subprocess_shell_true' in hadley_api/claude_routes.py:180"}, "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-d9919040b97d8669", "name": "Insecure pattern 'direct_innerhtml_assignment' in peter_dashboard/app.py:4925", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in peter_dashboard/app.py:4925"}, "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-33f095088cb3f84c", "name": "Insecure pattern 'direct_innerhtml_assignment' in peter_dashboard/static/js/app.js:385", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in peter_dashboard/static/js/app.js:385"}, "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-f8b00dbdc0ab3962", "name": "Insecure pattern 'insert_adjacent_html' in peter_dashboard/static/js/app.js:4096", "shortDescription": {"text": "Insecure pattern 'insert_adjacent_html' in peter_dashboard/static/js/app.js:4096"}, "fullDescription": {"text": "Found a known-risky pattern (insert_adjacent_html). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5c4dfa5c63025a9b", "name": "Insecure pattern 'direct_innerhtml_assignment' in peter_dashboard/static/js/mind-map.js:120", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in peter_dashboard/static/js/mind-map.js:120"}, "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-5f33f29bd420035a", "name": "Insecure pattern 'direct_innerhtml_assignment' in peter_dashboard/static/js/api-explorer.js:48", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in peter_dashboard/static/js/api-explorer.js:48"}, "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-e7b1386511b80ff1", "name": "Insecure pattern 'subprocess_shell_true' in domains/second_brain/audit_report.py:691", "shortDescription": {"text": "Insecure pattern 'subprocess_shell_true' in domains/second_brain/audit_report.py:691"}, "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-e03d7632d990a76c", "name": "Possible secret in domains/peterbot/wsl_config/skills/security-monitor/SKILL.md", "shortDescription": {"text": "Possible secret in domains/peterbot/wsl_config/skills/security-monitor/SKILL.md"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-0e6bce19ff808b7b", "name": "Very large file: bot.py (1648 lines)", "shortDescription": {"text": "Very large file: bot.py (1648 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-f837e282de110bae", "name": "Very large file: compile_tabelog.py (1156 lines)", "shortDescription": {"text": "Very large file: compile_tabelog.py (1156 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-5349b7f5add11d23", "name": "Very large file: hadley_api/japan_routes.py (1243 lines)", "shortDescription": {"text": "Very large file: hadley_api/japan_routes.py (1243 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-0763d3486f032b7d", "name": "Very large file: hadley_api/main.py (9978 lines)", "shortDescription": {"text": "Very large file: hadley_api/main.py (9978 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-42a45a3f8cb13d05", "name": "Very large file: peter_dashboard/app.py (7434 lines)", "shortDescription": {"text": "Very large file: peter_dashboard/app.py (7434 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-5c9cc6df03012e8e", "name": "Very large file: peter_dashboard/static/js/app.js (9996 lines)", "shortDescription": {"text": "Very large file: peter_dashboard/static/js/app.js (9996 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-efa54c2853b16bfe", "name": "Very large file: domains/second_brain/seed/adapters/travel.py (1292 lines)", "shortDescription": {"text": "Very large file: domains/second_brain/seed/adapters/travel.py (1292 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-63911d2b5511a7fb", "name": "Very large file: domains/peterbot/data_fetchers.py (4758 lines)", "shortDescription": {"text": "Very large file: domains/peterbot/data_fetchers.py (4758 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-96dfea8495942dcb", "name": "Very large file: domains/peterbot/scheduler.py (1835 lines)", "shortDescription": {"text": "Very large file: domains/peterbot/scheduler.py (1835 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-ea3b5e389d8c9c0f", "name": "Low test-to-source ratio", "shortDescription": {"text": "Low test-to-source ratio"}, "fullDescription": {"text": "60 tests / 343 src (ratio 0.17)."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "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-798a206b5051c364", "name": "Node manifest has dependencies but no lockfile: jobs-channel-sonnet/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: jobs-channel-sonnet/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-00cdfbdf830cee7a", "name": "Node manifest has dependencies but no lockfile: extract-channel/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: extract-channel/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "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 973 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 55 placeholder/mock markers across 15 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci, lockfile. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "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, ci, lockfile. 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-bea357a6497a2d5d", "name": "Agent authority lacks a verifier contract: CLAUDE.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: 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-3cacef8804faf717", "name": "Agent authority lacks a verifier contract: docs/phase8b/phase8b/skills/weather/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: docs/phase8b/phase8b/skills/weather/SKILL.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-f08cac888ab9b527", "name": "Agent authority lacks a verifier contract: docs/phase8b/phase8b/skills/traffic-check/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: docs/phase8b/phase8b/skills/traffic-check/SKILL.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-dd81437035e2f9da", "name": "Agent authority lacks a verifier contract: docs/phase8b/phase8b/skills/weather-forecast/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: docs/phase8b/phase8b/skills/weather-forecast/SKILL.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-73129968fa47be85", "name": "Agent authority lacks a verifier contract: docs/phase8b/phase8b/skills/ev-charging/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: docs/phase8b/phase8b/skills/ev-charging/SKILL.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-5c42b1fc117061cb", "name": "Agent authority lacks a verifier contract: docs/phase8b/phase8b/skills/smart-home/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: docs/phase8b/phase8b/skills/smart-home/SKILL.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-b6f07777c1a88df7", "name": "Agent authority lacks a verifier contract: docs/phase8a/skills/schedule-today/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: docs/phase8a/skills/schedule-today/SKILL.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-a75a9239a7cbdea0", "name": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/book-recommender/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/book-recommender/SKILL.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-adc0a7e0a72e38c5", "name": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/tutor-email-parser/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/tutor-email-parser/SKILL.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-3faaf72f890b0cc8", "name": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/heartbeat/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/heartbeat/SKILL.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-8541ced2a95c90a9", "name": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/morning-briefing/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/morning-briefing/SKILL.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-7f92b82b50ab73b0", "name": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/fitness-dashboard/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/fitness-dashboard/SKILL.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-1aa9c557f5ed88b7", "name": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/meal-plan-generator/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/meal-plan-generator/SKILL.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-92ff367cabf63f12", "name": "Agent instruction/config may expose a secret: domains/peterbot/wsl_config/skills/healthera-prescriptions/SKILL.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: domains/peterbot/wsl_config/skills/healthera-prescriptions/SKILL.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-6836e4a9617724f1", "name": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/cost-digest/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/cost-digest/SKILL.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-2aa3e054bd10fdd6", "name": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/school-pickup/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/school-pickup/SKILL.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-48880fb853d365c1", "name": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/schedule-today/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/schedule-today/SKILL.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-65ab30782c7fb7d8", "name": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/life-admin-dashboard/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/life-admin-dashboard/SKILL.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-c4fc0c35e95adf85", "name": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/fitness-program-start/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/fitness-program-start/SKILL.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-0ba105252a2aac4b", "name": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/daily-thoughts/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/daily-thoughts/SKILL.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-76fdf03aa00a5a0b", "name": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/school-run/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/school-run/SKILL.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-4f7d84821eb148af", "name": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/hb-add-inventory/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/hb-add-inventory/SKILL.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-1b3dac3f7ff8c204", "name": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/ev-charging/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/ev-charging/SKILL.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-d579bb927e0e1db6", "name": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/amazon-purchases/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/amazon-purchases/SKILL.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-4e534eca7d4d1733", "name": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/property-valuation/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/property-valuation/SKILL.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-42b8b196ae285b2f", "name": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/directions/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/directions/SKILL.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-69878b693f7d60c6", "name": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/instagram-processing/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/instagram-processing/SKILL.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-75a85b634bb5f580", "name": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/pocket-money-weekly/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/pocket-money-weekly/SKILL.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-c9985a31631ba148", "name": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/drive-search/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/drive-search/SKILL.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-fda42c143a001022", "name": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/flight-prices/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/flight-prices/SKILL.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-b6e07116a3b44117", "name": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/daily-batch/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/daily-batch/SKILL.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-8219fe8ccc6ffbcd", "name": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/chrome-cdp/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/chrome-cdp/SKILL.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-3ba860b19ffc1c1a", "name": "Agent authority lacks a verifier contract: .claude/commands/verify-done.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/commands/verify-done.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-1cbb14d6fcc93619", "name": "Agent authority lacks a verifier contract: .claude/commands/code-review.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/commands/code-review.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-ee4d30373adf4be5", "name": "Agent authority lacks a verifier contract: .claude/commands/build-feature.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/commands/build-feature.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-a7454fcd4ba7e2da", "name": "Agent authority lacks a verifier contract: .claude/commands/tech-debt.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/commands/tech-debt.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-b089b2bf6e68e37f", "name": "Legacy-named symbol `router_v2` in bot.py:45", "shortDescription": {"text": "Legacy-named symbol `router_v2` in bot.py:45"}, "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-21d55a57177a074b", "name": "Commented-code block (8 lines) in bot.py:93", "shortDescription": {"text": "Commented-code block (8 lines) in bot.py:93"}, "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-633ae2886b1721cf", "name": "Network/subprocess call without timeout or try/except \u2014 start_single.py:74", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 start_single.py:74"}, "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-8f4f78d39c1efe4f", "name": "Blocking `time.sleep(...)` inside `async def _keepa_get` \u2014 mcp_servers/keepa_mcp.py:82", "shortDescription": {"text": "Blocking `time.sleep(...)` inside `async def _keepa_get` \u2014 mcp_servers/keepa_mcp.py:82"}, "fullDescription": {"text": "Sync I/O inside an async function blocks the event loop. While `time.sleep(...)` is running, *all* other coroutines on this loop are paused \u2014 silent throughput collapse under concurrency. Use the async equivalent (`httpx.AsyncClient`, `asyncio.sleep`, `aiofiles`) or wrap with `await asyncio.to_thread(...)`."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c58a821cc4106e79", "name": "Commented-code block (5 lines) in jobs/incremental_seed.py:22", "shortDescription": {"text": "Commented-code block (5 lines) in jobs/incremental_seed.py:22"}, "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-9a683e576d4ba3c5", "name": "Commented-code block (6 lines) in jobs/hb_crons.py:37", "shortDescription": {"text": "Commented-code block (6 lines) in jobs/hb_crons.py:37"}, "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-7110e7c7520a9fee", "name": "Legacy-named symbol `router_v2` in peter-channel/src/index.ts:454", "shortDescription": {"text": "Legacy-named symbol `router_v2` in peter-channel/src/index.ts:454"}, "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-0244a62b58bcc1b4", "name": "Commented-code block (7 lines) in peter-channel/src/index.ts:296", "shortDescription": {"text": "Commented-code block (7 lines) in peter-channel/src/index.ts:296"}, "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-9eb8e448e3ac8056", "name": "`fetch()` without try/.catch or AbortSignal \u2014 peter-channel/src/index.ts:166", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 peter-channel/src/index.ts:166"}, "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-e37e9f9ea2db89cd", "name": "Legacy-named symbol `router_v2` in whatsapp-channel/src/index.ts:330", "shortDescription": {"text": "Legacy-named symbol `router_v2` in whatsapp-channel/src/index.ts:330"}, "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-9626cb2af5255fa5", "name": "Legacy-named symbol `drive_copy` in hadley_api/main.py:4384", "shortDescription": {"text": "Legacy-named symbol `drive_copy` in hadley_api/main.py:4384"}, "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-53aca9c59c7445d4", "name": "Commented-code block (15 lines) in hadley_api/claude_routes.py:49", "shortDescription": {"text": "Commented-code block (15 lines) in hadley_api/claude_routes.py:49"}, "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-13e8f059f5875cc7", "name": "Legacy-named symbol `router_v2` in hadley_api/cost_routes.py:1", "shortDescription": {"text": "Legacy-named symbol `router_v2` in hadley_api/cost_routes.py:1"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c6afcf8b9bdb293e", "name": "Network/subprocess call without timeout or try/except \u2014 hadley_api/voice_engine.py:52", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 hadley_api/voice_engine.py:52"}, "fullDescription": {"text": "`urllib.request.urlretrieve(...)` 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-f667e3f6e04f6a39", "name": "Legacy-named symbol `router_v2` in hadley_api/peter_routes/cost_log.py:3", "shortDescription": {"text": "Legacy-named symbol `router_v2` in hadley_api/peter_routes/cost_log.py:3"}, "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-32dd132499121eaa", "name": "Legacy-named symbol `router_v2` in hadley_api/peter_routes/attachment_download.py:4", "shortDescription": {"text": "Legacy-named symbol `router_v2` in hadley_api/peter_routes/attachment_download.py:4"}, "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-da09297fec6b7247", "name": "Legacy-named symbol `router_v2` in hadley_api/peter_routes/build_context.py:5", "shortDescription": {"text": "Legacy-named symbol `router_v2` in hadley_api/peter_routes/build_context.py:5"}, "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-7784f2e6f9733347", "name": "Network/subprocess call without timeout or try/except \u2014 peter_dashboard/service_manager.py:488", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 peter_dashboard/service_manager.py:488"}, "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-3d4b3c00c41bf2d7", "name": "Legacy-named symbol `router_v2` in peter_dashboard/app.py:104", "shortDescription": {"text": "Legacy-named symbol `router_v2` in peter_dashboard/app.py:104"}, "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-4743a0a32b5d60d4", "name": "Blocking `time.sleep(...)` inside `async def restart_service_endpoint` \u2014 peter_dashboard/app.py:1067", "shortDescription": {"text": "Blocking `time.sleep(...)` inside `async def restart_service_endpoint` \u2014 peter_dashboard/app.py:1067"}, "fullDescription": {"text": "Sync I/O inside an async function blocks the event loop. While `time.sleep(...)` is running, *all* other coroutines on this loop are paused \u2014 silent throughput collapse under concurrency. Use the async equivalent (`httpx.AsyncClient`, `asyncio.sleep`, `aiofiles`) or wrap with `await asyncio.to_thread(...)`."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "high", "confidence": 1.0}}, {"id": "scanner-03876e100adadf67", "name": "`fetch()` without try/.catch or AbortSignal \u2014 peter_dashboard/static/js/app.js:6257", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 peter_dashboard/static/js/app.js:6257"}, "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-797d3d57708b3a98", "name": "Commented-code block (5 lines) in domains/fitness/programme_start.py:137", "shortDescription": {"text": "Commented-code block (5 lines) in domains/fitness/programme_start.py:137"}, "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-a7a56f5234cf5f45", "name": "Commented-code block (5 lines) in domains/fitness/service.py:406", "shortDescription": {"text": "Commented-code block (5 lines) in domains/fitness/service.py:406"}, "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-6090d99248ab2437", "name": "Network/subprocess call without timeout or try/except \u2014 domains/prolific/chrome.py:3", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 domains/prolific/chrome.py:3"}, "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-fffba9e348c83c5b", "name": "Commented-code block (6 lines) in domains/accountability/auto_sources.py:297", "shortDescription": {"text": "Commented-code block (6 lines) in domains/accountability/auto_sources.py:297"}, "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-90bee83123b2da90", "name": "Commented-code block (5 lines) in domains/second_brain/seed/adapters/claude_code_history.py:96", "shortDescription": {"text": "Commented-code block (5 lines) in domains/second_brain/seed/adapters/claude_code_history.py:96"}, "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-8dc7d8117f04dc5f", "name": "Legacy-named symbol `router_v2` in domains/second_brain/seed/adapters/channel_conversations.py:4", "shortDescription": {"text": "Legacy-named symbol `router_v2` in domains/second_brain/seed/adapters/channel_conversations.py:4"}, "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-22baab3a4938e07d", "name": "Commented-code block (5 lines) in domains/second_brain/seed/adapters/scrapers/gousto.py:310", "shortDescription": {"text": "Commented-code block (5 lines) in domains/second_brain/seed/adapters/scrapers/gousto.py:310"}, "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-e8740e9fe937a08c", "name": "Legacy-named symbol `router_v2` in domains/peterbot/memory.py:5", "shortDescription": {"text": "Legacy-named symbol `router_v2` in domains/peterbot/memory.py:5"}, "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-69d4f4f780ae0e51", "name": "Commented-code block (5 lines) in domains/peterbot/memory.py:20", "shortDescription": {"text": "Commented-code block (5 lines) in domains/peterbot/memory.py:20"}, "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-32ba34ba1ca2d00c", "name": "Legacy-named symbol `router_v2` in domains/peterbot/fallback_stats.py:1", "shortDescription": {"text": "Legacy-named symbol `router_v2` in domains/peterbot/fallback_stats.py:1"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-57b4aa6c5c557ca7", "name": "Legacy-named symbol `router_v2` in domains/peterbot/__init__.py:4", "shortDescription": {"text": "Legacy-named symbol `router_v2` in domains/peterbot/__init__.py:4"}, "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-8034fa0148c11a0b", "name": "Legacy-named symbol `router_v2` in domains/peterbot/config.py:106", "shortDescription": {"text": "Legacy-named symbol `router_v2` in domains/peterbot/config.py:106"}, "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-591c4c7b3f34b489", "name": "Legacy-named symbol `router_v2` in domains/peterbot/costs.py:6", "shortDescription": {"text": "Legacy-named symbol `router_v2` in domains/peterbot/costs.py:6"}, "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-7bf15d5acbf8eaeb", "name": "Legacy-named symbol `router_v2` in domains/peterbot/data_fetchers.py:4015", "shortDescription": {"text": "Legacy-named symbol `router_v2` in domains/peterbot/data_fetchers.py:4015"}, "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-2309386cd0478c6c", "name": "Legacy-named symbol `pr_old` in domains/peterbot/morning_quality_report.py:149", "shortDescription": {"text": "Legacy-named symbol `pr_old` in domains/peterbot/morning_quality_report.py:149"}, "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-9170c4dacfb2f5a2", "name": "Blocking `httpx.get(...)` inside `async def check_and_send_alerts` \u2014 domains/peterbot/japan_alerts.py:309", "shortDescription": {"text": "Blocking `httpx.get(...)` inside `async def check_and_send_alerts` \u2014 domains/peterbot/japan_alerts.py:309"}, "fullDescription": {"text": "Sync I/O inside an async function blocks the event loop. While `httpx.get(...)` is running, *all* other coroutines on this loop are paused \u2014 silent throughput collapse under concurrency. Use the async equivalent (`httpx.AsyncClient`, `asyncio.sleep`, `aiofiles`) or wrap with `await asyncio.to_thread(...)`."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ed8489f662df4310", "name": "Blocking `httpx.get(...)` inside `async def check_and_send_alerts` \u2014 domains/peterbot/japan_alerts.py:494", "shortDescription": {"text": "Blocking `httpx.get(...)` inside `async def check_and_send_alerts` \u2014 domains/peterbot/japan_alerts.py:494"}, "fullDescription": {"text": "Sync I/O inside an async function blocks the event loop. While `httpx.get(...)` is running, *all* other coroutines on this loop are paused \u2014 silent throughput collapse under concurrency. Use the async equivalent (`httpx.AsyncClient`, `asyncio.sleep`, `aiofiles`) or wrap with `await asyncio.to_thread(...)`."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e9b6bf3e00a764ec", "name": "Blocking `httpx.get(...)` inside `async def check_and_send_alerts` \u2014 domains/peterbot/japan_alerts.py:503", "shortDescription": {"text": "Blocking `httpx.get(...)` inside `async def check_and_send_alerts` \u2014 domains/peterbot/japan_alerts.py:503"}, "fullDescription": {"text": "Sync I/O inside an async function blocks the event loop. While `httpx.get(...)` is running, *all* other coroutines on this loop are paused \u2014 silent throughput collapse under concurrency. Use the async equivalent (`httpx.AsyncClient`, `asyncio.sleep`, `aiofiles`) or wrap with `await asyncio.to_thread(...)`."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "high", "confidence": 1.0}}, {"id": "scanner-71e7d6c000970c09", "name": "Blocking `httpx.get(...)` inside `async def check_and_send_alerts` \u2014 domains/peterbot/japan_alerts.py:512", "shortDescription": {"text": "Blocking `httpx.get(...)` inside `async def check_and_send_alerts` \u2014 domains/peterbot/japan_alerts.py:512"}, "fullDescription": {"text": "Sync I/O inside an async function blocks the event loop. While `httpx.get(...)` is running, *all* other coroutines on this loop are paused \u2014 silent throughput collapse under concurrency. Use the async equivalent (`httpx.AsyncClient`, `asyncio.sleep`, `aiofiles`) or wrap with `await asyncio.to_thread(...)`."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4b5e874a1d151cd9", "name": "Legacy-named symbol `_send_to_claude_code_v2` in domains/peterbot/scheduler.py:823", "shortDescription": {"text": "Legacy-named symbol `_send_to_claude_code_v2` in domains/peterbot/scheduler.py:823"}, "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-b085673a95a80c26", "name": "Commented-code block (6 lines) in domains/peterbot/scheduler.py:802", "shortDescription": {"text": "Commented-code block (6 lines) in domains/peterbot/scheduler.py:802"}, "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-fd9305f14c0a306a", "name": "Legacy-named symbol `router_v2` in domains/peterbot/kimi_provider.py:27", "shortDescription": {"text": "Legacy-named symbol `router_v2` in domains/peterbot/kimi_provider.py:27"}, "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-d12c50d330a0793c", "name": "Commented-code block (5 lines) in domains/peterbot/skill_manifest.py:151", "shortDescription": {"text": "Commented-code block (5 lines) in domains/peterbot/skill_manifest.py:151"}, "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-0e7982a149415c3b", "name": "Network/subprocess call without timeout or try/except \u2014 domains/peterbot/wsl_config/sync.py:82", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 domains/peterbot/wsl_config/sync.py:82"}, "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-6499222c0dfc35cd", "name": "Legacy-named symbol `Router_v2` in domains/peterbot/response/sanitiser.py:3", "shortDescription": {"text": "Legacy-named symbol `Router_v2` in domains/peterbot/response/sanitiser.py:3"}, "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-1684ece58300bdc1", "name": "Legacy-named symbol `router_v2` in domains/peterbot/reminders/executor.py:90", "shortDescription": {"text": "Legacy-named symbol `router_v2` in domains/peterbot/reminders/executor.py:90"}, "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-96ea9862fd1368f3", "name": "Commented-code block (5 lines) in domains/energy/telemetry.py:49", "shortDescription": {"text": "Commented-code block (5 lines) in domains/energy/telemetry.py:49"}, "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-f4c0858eb380d006", "name": "Commented-code block (5 lines) in domains/energy/octopus_sync.py:433", "shortDescription": {"text": "Commented-code block (5 lines) in domains/energy/octopus_sync.py:433"}, "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-5e98d838c530654f", "name": "Network/subprocess call without timeout or try/except \u2014 domains/claude_code/tools.py:49", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 domains/claude_code/tools.py:49"}, "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-a0b23e01683e0b09", "name": "99 env vars used in code but missing from .env.example", "shortDescription": {"text": "99 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `AI_USAGE_SERVICE_KEY`, `ANTHROPIC_ADMIN_KEY`, `APPDATA`, `AUDIBLE_AUTH_FILE`, `AUDIBLE_MCP_DIR`, `BACKFILL_DAYS`, `CHRIS_WHATSAPP_INSTANCE`, `CLAUDE_MEM_DB` + 91 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:\nmcp_servers/financial_data_mcp.py:manage_subscription_add, mcp_servers/financial_data/subscriptions.py:add_subscription\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-be46ea126aa5d8dc", "name": "Near-duplicate function bodies in 3 places", "shortDescription": {"text": "Near-duplicate function bodies in 3 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nhadley_api/main.py:extract_text, hadley_api/main.py:extract_text, hadley_api/main.py:extract_text\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-da559b004672576f", "name": "FastAPI POST `check_purchase_allowed` without auth dependency \u2014 hadley_api/browser_routes.py:183", "shortDescription": {"text": "FastAPI POST `check_purchase_allowed` without auth dependency \u2014 hadley_api/browser_routes.py:183"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-213a82ed8a859289", "name": "FastAPI POST `start_browser_session` without auth dependency \u2014 hadley_api/browser_routes.py:201", "shortDescription": {"text": "FastAPI POST `start_browser_session` without auth dependency \u2014 hadley_api/browser_routes.py:201"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-79300a24d9d49acb", "name": "FastAPI POST `end_browser_session` without auth dependency \u2014 hadley_api/browser_routes.py:257", "shortDescription": {"text": "FastAPI POST `end_browser_session` without auth dependency \u2014 hadley_api/browser_routes.py:257"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a0268277f25f9893", "name": "FastAPI POST `execute_action` without auth dependency \u2014 hadley_api/browser_routes.py:314", "shortDescription": {"text": "FastAPI POST `execute_action` without auth dependency \u2014 hadley_api/browser_routes.py:314"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-94ad0ab460c19302", "name": "FastAPI POST `whatsapp_webhook` without auth dependency \u2014 hadley_api/whatsapp_webhook.py:402", "shortDescription": {"text": "FastAPI POST `whatsapp_webhook` without auth dependency \u2014 hadley_api/whatsapp_webhook.py:402"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e693d3ad68ad6f06", "name": "FastAPI POST `whatsapp_webhook` without auth dependency \u2014 hadley_api/whatsapp_webhook.py:403", "shortDescription": {"text": "FastAPI POST `whatsapp_webhook` without auth dependency \u2014 hadley_api/whatsapp_webhook.py:403"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c2ee2b1dc6709cac", "name": "FastAPI POST `voice_listen` without auth dependency \u2014 hadley_api/voice_routes.py:87", "shortDescription": {"text": "FastAPI POST `voice_listen` without auth dependency \u2014 hadley_api/voice_routes.py:87"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-37cbca6c6ba57045", "name": "FastAPI POST `voice_speak` without auth dependency \u2014 hadley_api/voice_routes.py:108", "shortDescription": {"text": "FastAPI POST `voice_speak` without auth dependency \u2014 hadley_api/voice_routes.py:108"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0a6c60d7ce3ae533", "name": "FastAPI POST `voice_converse` without auth dependency \u2014 hadley_api/voice_routes.py:129", "shortDescription": {"text": "FastAPI POST `voice_converse` without auth dependency \u2014 hadley_api/voice_routes.py:129"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e8e8efaeae671cd4", "name": "FastAPI POST `save_card` without auth dependency \u2014 hadley_api/vault_routes.py:92", "shortDescription": {"text": "FastAPI POST `save_card` without auth dependency \u2014 hadley_api/vault_routes.py:92"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-993ecfd30fa6b2d8", "name": "FastAPI DELETE `delete_card` without auth dependency \u2014 hadley_api/vault_routes.py:167", "shortDescription": {"text": "FastAPI DELETE `delete_card` without auth dependency \u2014 hadley_api/vault_routes.py:167"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-08ed5e8c6debc9f8", "name": "FastAPI POST `create_category` without auth dependency \u2014 hadley_api/task_routes.py:238", "shortDescription": {"text": "FastAPI POST `create_category` without auth dependency \u2014 hadley_api/task_routes.py:238"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e283e22b6313ec6b", "name": "FastAPI PUT `update_category` without auth dependency \u2014 hadley_api/task_routes.py:280", "shortDescription": {"text": "FastAPI PUT `update_category` without auth dependency \u2014 hadley_api/task_routes.py:280"}, "fullDescription": {"text": "`@router.put` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-48f02f3b363d45f8", "name": "FastAPI DELETE `delete_category` without auth dependency \u2014 hadley_api/task_routes.py:315", "shortDescription": {"text": "FastAPI DELETE `delete_category` without auth dependency \u2014 hadley_api/task_routes.py:315"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a878c2b39971f8c2", "name": "FastAPI POST `create_task` without auth dependency \u2014 hadley_api/task_routes.py:582", "shortDescription": {"text": "FastAPI POST `create_task` without auth dependency \u2014 hadley_api/task_routes.py:582"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2f48e29e128fe991", "name": "FastAPI PUT `update_task` without auth dependency \u2014 hadley_api/task_routes.py:654", "shortDescription": {"text": "FastAPI PUT `update_task` without auth dependency \u2014 hadley_api/task_routes.py:654"}, "fullDescription": {"text": "`@router.put` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9f473dbccaf0b02b", "name": "FastAPI DELETE `delete_task` without auth dependency \u2014 hadley_api/task_routes.py:706", "shortDescription": {"text": "FastAPI DELETE `delete_task` without auth dependency \u2014 hadley_api/task_routes.py:706"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-63985f3f56c2456a", "name": "FastAPI POST `change_task_status` without auth dependency \u2014 hadley_api/task_routes.py:725", "shortDescription": {"text": "FastAPI POST `change_task_status` without auth dependency \u2014 hadley_api/task_routes.py:725"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0ff8dadd674942db", "name": "FastAPI POST `schedule_heartbeat` without auth dependency \u2014 hadley_api/task_routes.py:793", "shortDescription": {"text": "FastAPI POST `schedule_heartbeat` without auth dependency \u2014 hadley_api/task_routes.py:793"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-69fd089413e75627", "name": "FastAPI POST `add_comment` without auth dependency \u2014 hadley_api/task_routes.py:868", "shortDescription": {"text": "FastAPI POST `add_comment` without auth dependency \u2014 hadley_api/task_routes.py:868"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bd6b95fabd9f4578", "name": "FastAPI PUT `update_task_categories` without auth dependency \u2014 hadley_api/task_routes.py:931", "shortDescription": {"text": "FastAPI PUT `update_task_categories` without auth dependency \u2014 hadley_api/task_routes.py:931"}, "fullDescription": {"text": "`@router.put` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4b7e73f3b164ef2d", "name": "FastAPI POST `reorder_task` without auth dependency \u2014 hadley_api/task_routes.py:968", "shortDescription": {"text": "FastAPI POST `reorder_task` without auth dependency \u2014 hadley_api/task_routes.py:968"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-38a5a5974d469d02", "name": "FastAPI POST `bulk_reorder_tasks` without auth dependency \u2014 hadley_api/task_routes.py:988", "shortDescription": {"text": "FastAPI POST `bulk_reorder_tasks` without auth dependency \u2014 hadley_api/task_routes.py:988"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2fe5fc27e79cc364", "name": "FastAPI PUT `update_day_plan` without auth dependency \u2014 hadley_api/japan_routes.py:135", "shortDescription": {"text": "FastAPI PUT `update_day_plan` without auth dependency \u2014 hadley_api/japan_routes.py:135"}, "fullDescription": {"text": "`@router.put` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b03543f991a4b17a", "name": "FastAPI POST `send_digest` without auth dependency \u2014 hadley_api/japan_routes.py:583", "shortDescription": {"text": "FastAPI POST `send_digest` without auth dependency \u2014 hadley_api/japan_routes.py:583"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4f90e62bef93456e", "name": "FastAPI POST `set_sim_date` without auth dependency \u2014 hadley_api/japan_routes.py:692", "shortDescription": {"text": "FastAPI POST `set_sim_date` without auth dependency \u2014 hadley_api/japan_routes.py:692"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d4de58e39c7e25ff", "name": "FastAPI POST `photobook_upload` without auth dependency \u2014 hadley_api/japan_routes.py:785", "shortDescription": {"text": "FastAPI POST `photobook_upload` without auth dependency \u2014 hadley_api/japan_routes.py:785"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-432d51d66f232e08", "name": "FastAPI POST `photobook_highlight` without auth dependency \u2014 hadley_api/japan_routes.py:861", "shortDescription": {"text": "FastAPI POST `photobook_highlight` without auth dependency \u2014 hadley_api/japan_routes.py:861"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-576190b3b074fae6", "name": "FastAPI POST `photobook_diary` without auth dependency \u2014 hadley_api/japan_routes.py:899", "shortDescription": {"text": "FastAPI POST `photobook_diary` without auth dependency \u2014 hadley_api/japan_routes.py:899"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3e1612102ab72731", "name": "FastAPI POST `set_sim_time` without auth dependency \u2014 hadley_api/japan_routes.py:983", "shortDescription": {"text": "FastAPI POST `set_sim_time` without auth dependency \u2014 hadley_api/japan_routes.py:983"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fcff37f675a45c76", "name": "FastAPI POST `test_alerts` without auth dependency \u2014 hadley_api/japan_routes.py:995", "shortDescription": {"text": "FastAPI POST `test_alerts` without auth dependency \u2014 hadley_api/japan_routes.py:995"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-60ce85f1899796ab", "name": "FastAPI POST `send_alerts_now` without auth dependency \u2014 hadley_api/japan_routes.py:1043", "shortDescription": {"text": "FastAPI POST `send_alerts_now` without auth dependency \u2014 hadley_api/japan_routes.py:1043"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8be58837e4d1c968", "name": "FastAPI POST `add_expense` without auth dependency \u2014 hadley_api/japan_routes.py:1055", "shortDescription": {"text": "FastAPI POST `add_expense` without auth dependency \u2014 hadley_api/japan_routes.py:1055"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7bf25a634bcc3e97", "name": "FastAPI POST `play` without auth dependency \u2014 hadley_api/spotify_routes.py:66", "shortDescription": {"text": "FastAPI POST `play` without auth dependency \u2014 hadley_api/spotify_routes.py:66"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-473365e5364292c6", "name": "FastAPI POST `play_uri` without auth dependency \u2014 hadley_api/spotify_routes.py:88", "shortDescription": {"text": "FastAPI POST `play_uri` without auth dependency \u2014 hadley_api/spotify_routes.py:88"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c9363824df5a65cd", "name": "FastAPI POST `queue` without auth dependency \u2014 hadley_api/spotify_routes.py:97", "shortDescription": {"text": "FastAPI POST `queue` without auth dependency \u2014 hadley_api/spotify_routes.py:97"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9067f0e668b719d5", "name": "FastAPI POST `pause` without auth dependency \u2014 hadley_api/spotify_routes.py:111", "shortDescription": {"text": "FastAPI POST `pause` without auth dependency \u2014 hadley_api/spotify_routes.py:111"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-36e7da66e8fa7817", "name": "FastAPI POST `resume` without auth dependency \u2014 hadley_api/spotify_routes.py:120", "shortDescription": {"text": "FastAPI POST `resume` without auth dependency \u2014 hadley_api/spotify_routes.py:120"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-42249c80908d753d", "name": "FastAPI POST `skip` without auth dependency \u2014 hadley_api/spotify_routes.py:129", "shortDescription": {"text": "FastAPI POST `skip` without auth dependency \u2014 hadley_api/spotify_routes.py:129"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-573225957a1dce81", "name": "FastAPI POST `previous` without auth dependency \u2014 hadley_api/spotify_routes.py:138", "shortDescription": {"text": "FastAPI POST `previous` without auth dependency \u2014 hadley_api/spotify_routes.py:138"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1ee869ac2dfabc22", "name": "FastAPI POST `set_volume` without auth dependency \u2014 hadley_api/spotify_routes.py:147", "shortDescription": {"text": "FastAPI POST `set_volume` without auth dependency \u2014 hadley_api/spotify_routes.py:147"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-96ff244a657f95d8", "name": "FastAPI POST `seek` without auth dependency \u2014 hadley_api/spotify_routes.py:156", "shortDescription": {"text": "FastAPI POST `seek` without auth dependency \u2014 hadley_api/spotify_routes.py:156"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-66c3c17816c46d92", "name": "FastAPI POST `set_shuffle` without auth dependency \u2014 hadley_api/spotify_routes.py:165", "shortDescription": {"text": "FastAPI POST `set_shuffle` without auth dependency \u2014 hadley_api/spotify_routes.py:165"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9833693fc719df1d", "name": "FastAPI POST `set_repeat` without auth dependency \u2014 hadley_api/spotify_routes.py:174", "shortDescription": {"text": "FastAPI POST `set_repeat` without auth dependency \u2014 hadley_api/spotify_routes.py:174"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-34bab5d9519e5ca0", "name": "FastAPI POST `transfer` without auth dependency \u2014 hadley_api/spotify_routes.py:192", "shortDescription": {"text": "FastAPI POST `transfer` without auth dependency \u2014 hadley_api/spotify_routes.py:192"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f6e27418f19790d6", "name": "FastAPI POST `play_similar` without auth dependency \u2014 hadley_api/spotify_routes.py:220", "shortDescription": {"text": "FastAPI POST `play_similar` without auth dependency \u2014 hadley_api/spotify_routes.py:220"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d2468fb2f39098e9", "name": "FastAPI POST `play_playlist` without auth dependency \u2014 hadley_api/spotify_routes.py:262", "shortDescription": {"text": "FastAPI POST `play_playlist` without auth dependency \u2014 hadley_api/spotify_routes.py:262"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bbdbeb1f4b466016", "name": "FastAPI POST `claude_extract` without auth dependency \u2014 hadley_api/claude_routes.py:119", "shortDescription": {"text": "FastAPI POST `claude_extract` without auth dependency \u2014 hadley_api/claude_routes.py:119"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0bac623ef4139a8d", "name": "FastAPI POST `add_spellings` without auth dependency \u2014 hadley_api/spelling_routes.py:40", "shortDescription": {"text": "FastAPI POST `add_spellings` without auth dependency \u2014 hadley_api/spelling_routes.py:40"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-cb5eaf5c91bf5b55", "name": "FastAPI POST `add_sentences` without auth dependency \u2014 hadley_api/spelling_routes.py:128", "shortDescription": {"text": "FastAPI POST `add_sentences` without auth dependency \u2014 hadley_api/spelling_routes.py:128"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-af10da3ae031b285", "name": "FastAPI POST `refresh_cache` without auth dependency \u2014 hadley_api/brain_routes.py:259", "shortDescription": {"text": "FastAPI POST `refresh_cache` without auth dependency \u2014 hadley_api/brain_routes.py:259"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-80e44daff8724705", "name": "FastAPI POST `upsert_subscription` without auth dependency \u2014 peter_dashboard/api/subscriptions.py:414", "shortDescription": {"text": "FastAPI POST `upsert_subscription` without auth dependency \u2014 peter_dashboard/api/subscriptions.py:414"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c605902992d65211", "name": "FastAPI PUT `update_subscription` without auth dependency \u2014 peter_dashboard/api/subscriptions.py:432", "shortDescription": {"text": "FastAPI PUT `update_subscription` without auth dependency \u2014 peter_dashboard/api/subscriptions.py:432"}, "fullDescription": {"text": "`@router.put` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-87908e602c1d9b40", "name": "FastAPI DELETE `delete_subscription` without auth dependency \u2014 peter_dashboard/api/subscriptions.py:454", "shortDescription": {"text": "FastAPI DELETE `delete_subscription` without auth dependency \u2014 peter_dashboard/api/subscriptions.py:454"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bee30c100e747b6a", "name": "FastAPI POST `trigger_job_run` without auth dependency \u2014 peter_dashboard/api/jobs.py:805", "shortDescription": {"text": "FastAPI POST `trigger_job_run` without auth dependency \u2014 peter_dashboard/api/jobs.py:805"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ebc968c06ee417bd", "name": "Dangling fetch: GET /api/hadley/proxy/openapi.json (peter_dashboard/static/js/api-explorer.js:157)", "shortDescription": {"text": "Dangling fetch: GET /api/hadley/proxy/openapi.json (peter_dashboard/static/js/api-explorer.js:157)"}, "fullDescription": {"text": "`peter_dashboard/static/js/api-explorer.js:157` calls `GET /api/hadley/proxy/openapi.json` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/hadley/proxy/openapi.json`\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-6ad2194d377bd37e", "name": "Unused endpoint: GET /domains", "shortDescription": {"text": "Unused endpoint: GET /domains"}, "fullDescription": {"text": "`hadley_api/browser_routes.py` declares `GET /domains` 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-62c85412bbbdb876", "name": "Unused endpoint: GET /limits", "shortDescription": {"text": "Unused endpoint: GET /limits"}, "fullDescription": {"text": "`hadley_api/browser_routes.py` declares `GET /limits` 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-42ca0c6db165fd6b", "name": "Unused endpoint: POST /limits/check", "shortDescription": {"text": "Unused endpoint: POST /limits/check"}, "fullDescription": {"text": "`hadley_api/browser_routes.py` declares `POST /limits/check` 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-eb43e0fa0411bf19", "name": "Unused endpoint: POST /session/start", "shortDescription": {"text": "Unused endpoint: POST /session/start"}, "fullDescription": {"text": "`hadley_api/browser_routes.py` declares `POST /session/start` 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-08869e94d02e3c11", "name": "Unused endpoint: GET /session/{session_id}", "shortDescription": {"text": "Unused endpoint: GET /session/{session_id}"}, "fullDescription": {"text": "`hadley_api/browser_routes.py` declares `GET /session/{session_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-7804d7cabba5dd85", "name": "Unused endpoint: POST /session/end", "shortDescription": {"text": "Unused endpoint: POST /session/end"}, "fullDescription": {"text": "`hadley_api/browser_routes.py` declares `POST /session/end` 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-4069bb9c1c1e4187", "name": "Unused endpoint: GET /screenshot", "shortDescription": {"text": "Unused endpoint: GET /screenshot"}, "fullDescription": {"text": "`hadley_api/browser_routes.py` declares `GET /screenshot` 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-ec54a1440964e5b8", "name": "Unused endpoint: POST /action", "shortDescription": {"text": "Unused endpoint: POST /action"}, "fullDescription": {"text": "`hadley_api/browser_routes.py` declares `POST /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-8689973a0617995f", "name": "Unused endpoint: GET /text", "shortDescription": {"text": "Unused endpoint: GET /text"}, "fullDescription": {"text": "`hadley_api/browser_routes.py` declares `GET /text` 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-19d931c8ba696e45", "name": "Unused endpoint: GET /fetch", "shortDescription": {"text": "Unused endpoint: GET /fetch"}, "fullDescription": {"text": "`hadley_api/browser_routes.py` declares `GET /fetch` 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-af75cdebd6061f00", "name": "Unused endpoint: GET /routes", "shortDescription": {"text": "Unused endpoint: GET /routes"}, "fullDescription": {"text": "`hadley_api/flight_routes.py` declares `GET /routes` 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-e2631495c43f2a81", "name": "Unused endpoint: GET /prices", "shortDescription": {"text": "Unused endpoint: GET /prices"}, "fullDescription": {"text": "`hadley_api/flight_routes.py` declares `GET /prices` 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-afc064028ae39ea9", "name": "Unused endpoint: GET /history", "shortDescription": {"text": "Unused endpoint: GET /history"}, "fullDescription": {"text": "`hadley_api/flight_routes.py` declares `GET /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-d0f253034e0113c2", "name": "Unused endpoint: GET /deals", "shortDescription": {"text": "Unused endpoint: GET /deals"}, "fullDescription": {"text": "`hadley_api/flight_routes.py` declares `GET /deals` 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-e1b7bee247ffc801", "name": "Unused endpoint: GET /summary", "shortDescription": {"text": "Unused endpoint: GET /summary"}, "fullDescription": {"text": "`hadley_api/flight_routes.py` declares `GET /summary` 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-034336dc074efeb4", "name": "Unused endpoint: POST /routes", "shortDescription": {"text": "Unused endpoint: POST /routes"}, "fullDescription": {"text": "`hadley_api/flight_routes.py` declares `POST /routes` 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-d2ae8e419af36116", "name": "Unused endpoint: DELETE /routes/{route_id}", "shortDescription": {"text": "Unused endpoint: DELETE /routes/{route_id}"}, "fullDescription": {"text": "`hadley_api/flight_routes.py` declares `DELETE /routes/{route_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-f05c8bc0bf742f38", "name": "Unused endpoint: POST /check-now", "shortDescription": {"text": "Unused endpoint: POST /check-now"}, "fullDescription": {"text": "`hadley_api/flight_routes.py` declares `POST /check-now` 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-cac559a1e936b87b", "name": "Unused endpoint: POST /scan-month", "shortDescription": {"text": "Unused endpoint: POST /scan-month"}, "fullDescription": {"text": "`hadley_api/flight_routes.py` declares `POST /scan-month` 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-0a46446ecf5abb68", "name": "Unused endpoint: GET /recipients", "shortDescription": {"text": "Unused endpoint: GET /recipients"}, "fullDescription": {"text": "`hadley_api/whatsapp_webhook.py` declares `GET /recipients` 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-1444c8b81047800f", "name": "Unused endpoint: POST /recipients/groups", "shortDescription": {"text": "Unused endpoint: POST /recipients/groups"}, "fullDescription": {"text": "`hadley_api/whatsapp_webhook.py` declares `POST /recipients/groups` 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-8ba2c0b66cd2e859", "name": "Unused endpoint: DELETE /recipients/groups/{name}", "shortDescription": {"text": "Unused endpoint: DELETE /recipients/groups/{name}"}, "fullDescription": {"text": "`hadley_api/whatsapp_webhook.py` declares `DELETE /recipients/groups/{name}` 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-2f222a275ed687b3", "name": "Unused endpoint: POST /send", "shortDescription": {"text": "Unused endpoint: POST /send"}, "fullDescription": {"text": "`hadley_api/whatsapp_webhook.py` declares `POST /send` 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-ac4bde15380ba034", "name": "Unused endpoint: POST /send-voice", "shortDescription": {"text": "Unused endpoint: POST /send-voice"}, "fullDescription": {"text": "`hadley_api/whatsapp_webhook.py` declares `POST /send-voice` 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-0ae38010c60493f1", "name": "Unused endpoint: POST /webhook", "shortDescription": {"text": "Unused endpoint: POST /webhook"}, "fullDescription": {"text": "`hadley_api/whatsapp_webhook.py` declares `POST /webhook` 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-deabe8398cd1084a", "name": "Unused endpoint: POST /webhook/{event_type:path}", "shortDescription": {"text": "Unused endpoint: POST /webhook/{event_type:path}"}, "fullDescription": {"text": "`hadley_api/whatsapp_webhook.py` declares `POST /webhook/{event_type:path}` 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-50207204ed781305", "name": "Unused endpoint: GET /goals", "shortDescription": {"text": "Unused endpoint: GET /goals"}, "fullDescription": {"text": "`hadley_api/accountability_routes.py` declares `GET /goals` 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-827392c0226680bd", "name": "Unused endpoint: POST /goals", "shortDescription": {"text": "Unused endpoint: POST /goals"}, "fullDescription": {"text": "`hadley_api/accountability_routes.py` declares `POST /goals` 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-14524f93aef43d33", "name": "Unused endpoint: GET /goals/{goal_id}", "shortDescription": {"text": "Unused endpoint: GET /goals/{goal_id}"}, "fullDescription": {"text": "`hadley_api/accountability_routes.py` declares `GET /goals/{goal_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-bdd5c4430ca79530", "name": "Unused endpoint: PATCH /goals/{goal_id}", "shortDescription": {"text": "Unused endpoint: PATCH /goals/{goal_id}"}, "fullDescription": {"text": "`hadley_api/accountability_routes.py` declares `PATCH /goals/{goal_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-8ff63a67ae08f4e2", "name": "Unused endpoint: DELETE /goals/{goal_id}", "shortDescription": {"text": "Unused endpoint: DELETE /goals/{goal_id}"}, "fullDescription": {"text": "`hadley_api/accountability_routes.py` declares `DELETE /goals/{goal_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-4540d80a9cc83adc", "name": "Unused endpoint: POST /goals/{goal_id}/milestones", "shortDescription": {"text": "Unused endpoint: POST /goals/{goal_id}/milestones"}, "fullDescription": {"text": "`hadley_api/accountability_routes.py` declares `POST /goals/{goal_id}/milestones` 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-089ba8c4e9d5cd39", "name": "Unused endpoint: GET /goals/{goal_id}/milestones", "shortDescription": {"text": "Unused endpoint: GET /goals/{goal_id}/milestones"}, "fullDescription": {"text": "`hadley_api/accountability_routes.py` declares `GET /goals/{goal_id}/milestones` 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-03ce9a5f5134a68b", "name": "Unused endpoint: POST /goals/{goal_id}/progress", "shortDescription": {"text": "Unused endpoint: POST /goals/{goal_id}/progress"}, "fullDescription": {"text": "`hadley_api/accountability_routes.py` declares `POST /goals/{goal_id}/progress` 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-829e8bc9bbd4a911", "name": "Unused endpoint: GET /goals/{goal_id}/progress", "shortDescription": {"text": "Unused endpoint: GET /goals/{goal_id}/progress"}, "fullDescription": {"text": "`hadley_api/accountability_routes.py` declares `GET /goals/{goal_id}/progress` 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-621f858deaa3be43", "name": "Unused endpoint: GET /report", "shortDescription": {"text": "Unused endpoint: GET /report"}, "fullDescription": {"text": "`hadley_api/accountability_routes.py` declares `GET /report` 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-85be8dcaa08e6d0b", "name": "Unused endpoint: POST /auto-update", "shortDescription": {"text": "Unused endpoint: POST /auto-update"}, "fullDescription": {"text": "`hadley_api/accountability_routes.py` declares `POST /auto-update` 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-b8e741c1a92b87e8", "name": "Unused endpoint: POST /mood", "shortDescription": {"text": "Unused endpoint: POST /mood"}, "fullDescription": {"text": "`hadley_api/accountability_routes.py` declares `POST /mood` 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-99239cff157ecfa0", "name": "Unused endpoint: GET /mood", "shortDescription": {"text": "Unused endpoint: GET /mood"}, "fullDescription": {"text": "`hadley_api/accountability_routes.py` declares `GET /mood` 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-72837ac2b53622f3", "name": "Unused endpoint: GET /mood/history", "shortDescription": {"text": "Unused endpoint: GET /mood/history"}, "fullDescription": {"text": "`hadley_api/accountability_routes.py` declares `GET /mood/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-0d2a6c406cc1e0b0", "name": "Unused endpoint: POST /journal", "shortDescription": {"text": "Unused endpoint: POST /journal"}, "fullDescription": {"text": "`hadley_api/accountability_routes.py` declares `POST /journal` 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-4d0b75c541565cd9", "name": "Unused endpoint: GET /journal", "shortDescription": {"text": "Unused endpoint: GET /journal"}, "fullDescription": {"text": "`hadley_api/accountability_routes.py` declares `GET /journal` 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-3735198b0dd64e7a", "name": "Unused endpoint: GET /journal/history", "shortDescription": {"text": "Unused endpoint: GET /journal/history"}, "fullDescription": {"text": "`hadley_api/accountability_routes.py` declares `GET /journal/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-3e770ff69e3f2bdb", "name": "Unused endpoint: GET /habit", "shortDescription": {"text": "Unused endpoint: GET /habit"}, "fullDescription": {"text": "`hadley_api/accountability_routes.py` declares `GET /habit` 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-c0b57bca914c98c9", "name": "Unused endpoint: POST /habit", "shortDescription": {"text": "Unused endpoint: POST /habit"}, "fullDescription": {"text": "`hadley_api/accountability_routes.py` declares `POST /habit` 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-d634056604698bd7", "name": "Unused endpoint: GET /collections", "shortDescription": {"text": "Unused endpoint: GET /collections"}, "fullDescription": {"text": "`hadley_api/vinted_routes.py` declares `GET /collections` 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-9be43ec2e8c55a86", "name": "Unused endpoint: GET /programme", "shortDescription": {"text": "Unused endpoint: GET /programme"}, "fullDescription": {"text": "`hadley_api/fitness_routes.py` declares `GET /programme` 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-b9c041dc087ff77f", "name": "Unused endpoint: GET /today", "shortDescription": {"text": "Unused endpoint: GET /today"}, "fullDescription": {"text": "`hadley_api/fitness_routes.py` declares `GET /today` 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-d504b80adc9409ec", "name": "Unused endpoint: GET /dashboard", "shortDescription": {"text": "Unused endpoint: GET /dashboard"}, "fullDescription": {"text": "`hadley_api/fitness_routes.py` declares `GET /dashboard` 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-5e4cbdc24bbe3cc1", "name": "Unused endpoint: GET /weekly-review", "shortDescription": {"text": "Unused endpoint: GET /weekly-review"}, "fullDescription": {"text": "`hadley_api/fitness_routes.py` declares `GET /weekly-review` 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/24956"}, "properties": {"repository": "chrishadley1983/discord-messenger", "repoUrl": "https://github.com/chrishadley1983/discord-messenger", "branch": "main"}, "results": [{"ruleId": "scanner-b34bf690553ce7ce", "level": "note", "message": {"text": "Possibly dead Python function: token_updated_callback"}, "properties": {"repobilityId": "5210580afa3d0045", "scanner": "scanner-primary", "fingerprint": "b34bf690553ce7ce", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "setup_ring_auth.py:17"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6696254eae7fd20d", "level": "note", "message": {"text": "Possibly dead Python function: post_interim"}, "properties": {"repobilityId": "c2b741c39d5ea668", "scanner": "scanner-primary", "fingerprint": "6696254eae7fd20d", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "bot.py:1019"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5b8019502810394e", "level": "note", "message": {"text": "Possibly dead Python function: post_busy"}, "properties": {"repobilityId": "f0b2b894e1d0e8af", "scanner": "scanner-primary", "fingerprint": "5b8019502810394e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "bot.py:1049"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2a62fe395fdbac73", "level": "note", "message": {"text": "Possibly dead Python function: executor_wrapper"}, "properties": {"repobilityId": "f8a8009c4584edc0", "scanner": "scanner-primary", "fingerprint": "2a62fe395fdbac73", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "bot.py:1295"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-defd76cea2372b81", "level": "note", "message": {"text": "Possibly dead Python function: add_subscription"}, "properties": {"repobilityId": "c4d6ce212b5710af", "scanner": "scanner-primary", "fingerprint": "defd76cea2372b81", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "mcp_servers/financial_data/subscriptions.py:37"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f1158bbac7c9bde5", "level": "note", "message": {"text": "Possibly dead Python function: cancel_subscription"}, "properties": {"repobilityId": "5ddfe4b330acc49e", "scanner": "scanner-primary", "fingerprint": "f1158bbac7c9bde5", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "mcp_servers/financial_data/subscriptions.py:140"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ad9bbf50c89a7d35", "level": "note", "message": {"text": "Possibly dead Python function: dismiss_recurring_alert"}, "properties": {"repobilityId": "17077989c7389442", "scanner": "scanner-primary", "fingerprint": "ad9bbf50c89a7d35", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "mcp_servers/financial_data/subscriptions.py:148"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c2945c6edd98eb23", "level": "note", "message": {"text": "Possibly dead Python function: accept_price_change"}, "properties": {"repobilityId": "a86bee94777c0430", "scanner": "scanner-primary", "fingerprint": "c2945c6edd98eb23", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "mcp_servers/financial_data/subscriptions.py:176"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-59ecf4251ef5049e", "level": "note", "message": {"text": "Possibly dead Python function: list_subscriptions"}, "properties": {"repobilityId": "5dbe7696f62105a2", "scanner": "scanner-primary", "fingerprint": "59ecf4251ef5049e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "mcp_servers/financial_data/subscriptions.py:184"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3e0120b52d0a3769", "level": "note", "message": {"text": "Possibly dead Python function: month_range"}, "properties": {"repobilityId": "102b47b393206bec", "scanner": "scanner-primary", "fingerprint": "3e0120b52d0a3769", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "mcp_servers/financial_data/config.py:94"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e67ff00b00fbd466", "level": "note", "message": {"text": "Possibly dead Python function: public_rpc"}, "properties": {"repobilityId": "0a4f1481ebcc186f", "scanner": "scanner-primary", "fingerprint": "e67ff00b00fbd466", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "mcp_servers/financial_data/supabase_client.py:77"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-09a168142a54098f", "level": "note", "message": {"text": "Possibly dead Python function: finance_count"}, "properties": {"repobilityId": "2fce4ccfdb2acb6b", "scanner": "scanner-primary", "fingerprint": "09a168142a54098f", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "mcp_servers/financial_data/supabase_client.py:86"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d573ea371148c277", "level": "note", "message": {"text": "Possibly dead Python function: public_count"}, "properties": {"repobilityId": "cac6941537ce4d1c", "scanner": "scanner-primary", "fingerprint": "d573ea371148c277", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "mcp_servers/financial_data/supabase_client.py:92"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-12270e5e16613ec6", "level": "note", "message": {"text": "Possibly dead Python function: incremental_seed_import"}, "properties": {"repobilityId": "2d29589d455fc187", "scanner": "scanner-primary", "fingerprint": "12270e5e16613ec6", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "jobs/incremental_seed.py:280"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bd5fc32af5604c49", "level": "note", "message": {"text": "Possibly dead Python function: balance_monitor"}, "properties": {"repobilityId": "03d8c1ff22ddc72f", "scanner": "scanner-primary", "fingerprint": "bd5fc32af5604c49", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "jobs/balance_monitor.py:408"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2490de802627b423", "level": "note", "message": {"text": "Possibly dead Python function: register_health_check"}, "properties": {"repobilityId": "95947c5396466731", "scanner": "scanner-primary", "fingerprint": "2490de802627b423", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "jobs/claude_code_health.py:389"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-acb338c30e35c5f0", "level": "note", "message": {"text": "Possibly dead Python function: health_check_job"}, "properties": {"repobilityId": "deaad6d7563cdce7", "scanner": "scanner-primary", "fingerprint": "acb338c30e35c5f0", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "jobs/claude_code_health.py:396"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d978ad747fea0082", "level": "note", "message": {"text": "Possibly dead Python function: youtube_feed"}, "properties": {"repobilityId": "33929406d09c0b52", "scanner": "scanner-primary", "fingerprint": "d978ad747fea0082", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "jobs/youtube_feed.py:322"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-03d479c0539f3706", "level": "note", "message": {"text": "Possibly dead Python function: school_pickup_report"}, "properties": {"repobilityId": "be6c574ea73fd043", "scanner": "scanner-primary", "fingerprint": "03d479c0539f3706", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "jobs/school_run.py:508"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-656c8d36080118ef", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/test_healthera.js:68"}, "properties": {"repobilityId": "d5e03e3700170edf", "scanner": "scanner-primary", "fingerprint": "656c8d36080118ef", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9b3b78fcea36019e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/test_amazon_flow.js:40"}, "properties": {"repobilityId": "6402a79fac8d0e28", "scanner": "scanner-primary", "fingerprint": "9b3b78fcea36019e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2537ad7cc9633931", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check_memory_queue.js:7"}, "properties": {"repobilityId": "be5e3965f9d32592", "scanner": "scanner-primary", "fingerprint": "2537ad7cc9633931", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-466aeb215484b17d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 peter_dashboard/static/js/app.js:239"}, "properties": {"repobilityId": "434ceb142a825ddc", "scanner": "scanner-primary", "fingerprint": "466aeb215484b17d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0f1e17c23278a8bb", "level": "error", "message": {"text": "Insecure pattern 'eval_used' in openapi.json:1"}, "properties": {"repobilityId": "3038618e6be67dd7", "scanner": "scanner-primary", "fingerprint": "0f1e17c23278a8bb", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "eval_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "openapi.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6d705928403a5091", "level": "error", "message": {"text": "Insecure pattern 'subprocess_shell_true' in hadley_api/japan_train_status.py:35"}, "properties": {"repobilityId": "56716b9810074b8c", "scanner": "scanner-primary", "fingerprint": "6d705928403a5091", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "subprocess_shell_true"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/japan_train_status.py"}, "region": {"startLine": 35}}}]}, {"ruleId": "scanner-8d07778cdfeb78ab", "level": "error", "message": {"text": "Insecure pattern 'eval_used' in hadley_api/main.py:5176"}, "properties": {"repobilityId": "2c15caf2a4912f63", "scanner": "scanner-primary", "fingerprint": "8d07778cdfeb78ab", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "eval_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/main.py"}, "region": {"startLine": 5176}}}]}, {"ruleId": "scanner-f27ade689904e7c2", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in hadley_api/main.py:8317"}, "properties": {"repobilityId": "9618808780019725", "scanner": "scanner-primary", "fingerprint": "f27ade689904e7c2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/main.py"}, "region": {"startLine": 8317}}}]}, {"ruleId": "scanner-ccae3d159b062157", "level": "error", "message": {"text": "Insecure pattern 'subprocess_shell_true' in hadley_api/claude_routes.py:180"}, "properties": {"repobilityId": "90ee04114d5d6256", "scanner": "scanner-primary", "fingerprint": "ccae3d159b062157", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "subprocess_shell_true"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/claude_routes.py"}, "region": {"startLine": 180}}}]}, {"ruleId": "scanner-d9919040b97d8669", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in peter_dashboard/app.py:4925"}, "properties": {"repobilityId": "edbb1323c50d7e3f", "scanner": "scanner-primary", "fingerprint": "d9919040b97d8669", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "peter_dashboard/app.py"}, "region": {"startLine": 4925}}}]}, {"ruleId": "scanner-33f095088cb3f84c", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in peter_dashboard/static/js/app.js:385"}, "properties": {"repobilityId": "6b4ab27e1ec66afd", "scanner": "scanner-primary", "fingerprint": "33f095088cb3f84c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "peter_dashboard/static/js/app.js"}, "region": {"startLine": 385}}}]}, {"ruleId": "scanner-f8b00dbdc0ab3962", "level": "warning", "message": {"text": "Insecure pattern 'insert_adjacent_html' in peter_dashboard/static/js/app.js:4096"}, "properties": {"repobilityId": "234082ca71f1d5e8", "scanner": "scanner-primary", "fingerprint": "f8b00dbdc0ab3962", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "insert_adjacent_html"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "peter_dashboard/static/js/app.js"}, "region": {"startLine": 4096}}}]}, {"ruleId": "scanner-5c4dfa5c63025a9b", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in peter_dashboard/static/js/mind-map.js:120"}, "properties": {"repobilityId": "750381aa84ec3646", "scanner": "scanner-primary", "fingerprint": "5c4dfa5c63025a9b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "peter_dashboard/static/js/mind-map.js"}, "region": {"startLine": 120}}}]}, {"ruleId": "scanner-5f33f29bd420035a", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in peter_dashboard/static/js/api-explorer.js:48"}, "properties": {"repobilityId": "1c8512fc54a8160b", "scanner": "scanner-primary", "fingerprint": "5f33f29bd420035a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "peter_dashboard/static/js/api-explorer.js"}, "region": {"startLine": 48}}}]}, {"ruleId": "scanner-e7b1386511b80ff1", "level": "error", "message": {"text": "Insecure pattern 'subprocess_shell_true' in domains/second_brain/audit_report.py:691"}, "properties": {"repobilityId": "c42fb2d3ccf0118e", "scanner": "scanner-primary", "fingerprint": "e7b1386511b80ff1", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "subprocess_shell_true"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "domains/second_brain/audit_report.py"}, "region": {"startLine": 691}}}]}, {"ruleId": "scanner-e03d7632d990a76c", "level": "error", "message": {"text": "Possible secret in domains/peterbot/wsl_config/skills/security-monitor/SKILL.md"}, "properties": {"repobilityId": "89ae0841747fe412", "scanner": "scanner-primary", "fingerprint": "e03d7632d990a76c", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "domains/peterbot/wsl_config/skills/security-monitor/SKILL.md"}, "region": {"startLine": 202}}}]}, {"ruleId": "scanner-0e6bce19ff808b7b", "level": "note", "message": {"text": "Very large file: bot.py (1648 lines)"}, "properties": {"repobilityId": "543715c7b1916e3d", "scanner": "scanner-primary", "fingerprint": "0e6bce19ff808b7b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f837e282de110bae", "level": "note", "message": {"text": "Very large file: compile_tabelog.py (1156 lines)"}, "properties": {"repobilityId": "7a0ee29c8b735776", "scanner": "scanner-primary", "fingerprint": "f837e282de110bae", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-5349b7f5add11d23", "level": "note", "message": {"text": "Very large file: hadley_api/japan_routes.py (1243 lines)"}, "properties": {"repobilityId": "15d13a6f9f38fc97", "scanner": "scanner-primary", "fingerprint": "5349b7f5add11d23", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-0763d3486f032b7d", "level": "note", "message": {"text": "Very large file: hadley_api/main.py (9978 lines)"}, "properties": {"repobilityId": "f36542a90a6d82c7", "scanner": "scanner-primary", "fingerprint": "0763d3486f032b7d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-42a45a3f8cb13d05", "level": "note", "message": {"text": "Very large file: peter_dashboard/app.py (7434 lines)"}, "properties": {"repobilityId": "99ad4df3f08b8989", "scanner": "scanner-primary", "fingerprint": "42a45a3f8cb13d05", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-5c9cc6df03012e8e", "level": "note", "message": {"text": "Very large file: peter_dashboard/static/js/app.js (9996 lines)"}, "properties": {"repobilityId": "f91b8ed8d1445c7d", "scanner": "scanner-primary", "fingerprint": "5c9cc6df03012e8e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-efa54c2853b16bfe", "level": "note", "message": {"text": "Very large file: domains/second_brain/seed/adapters/travel.py (1292 lines)"}, "properties": {"repobilityId": "0374457fbc037a9f", "scanner": "scanner-primary", "fingerprint": "efa54c2853b16bfe", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-63911d2b5511a7fb", "level": "note", "message": {"text": "Very large file: domains/peterbot/data_fetchers.py (4758 lines)"}, "properties": {"repobilityId": "7029ab2f0a2027f3", "scanner": "scanner-primary", "fingerprint": "63911d2b5511a7fb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-96dfea8495942dcb", "level": "note", "message": {"text": "Very large file: domains/peterbot/scheduler.py (1835 lines)"}, "properties": {"repobilityId": "d310a436c257154b", "scanner": "scanner-primary", "fingerprint": "96dfea8495942dcb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ea3b5e389d8c9c0f", "level": "note", "message": {"text": "Low test-to-source ratio"}, "properties": {"repobilityId": "ef7b2552cc00a375", "scanner": "scanner-primary", "fingerprint": "ea3b5e389d8c9c0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["tests"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "9c4e9b34ebf03bf0", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-798a206b5051c364", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: jobs-channel-sonnet/package.json"}, "properties": {"repobilityId": "a8b4662b0ca1b004", "scanner": "scanner-primary", "fingerprint": "798a206b5051c364", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "jobs-channel-sonnet/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-00cdfbdf830cee7a", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: extract-channel/package.json"}, "properties": {"repobilityId": "0e549fa251c51c6c", "scanner": "scanner-primary", "fingerprint": "00cdfbdf830cee7a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "extract-channel/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "554a212e4485076c", "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": "68842a5d7af69274", "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": "cb5de1af1952c06f", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "290ba6d833350aba", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "19d94a80434c2a12", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-bea357a6497a2d5d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: CLAUDE.md"}, "properties": {"repobilityId": "aae72df3934829ac", "scanner": "scanner-primary", "fingerprint": "bea357a6497a2d5d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "CLAUDE.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3cacef8804faf717", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: docs/phase8b/phase8b/skills/weather/SKILL.md"}, "properties": {"repobilityId": "a9f4d26189875491", "scanner": "scanner-primary", "fingerprint": "3cacef8804faf717", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/phase8b/phase8b/skills/weather/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f08cac888ab9b527", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: docs/phase8b/phase8b/skills/traffic-check/SKILL.md"}, "properties": {"repobilityId": "3e18cf18af0aefe9", "scanner": "scanner-primary", "fingerprint": "f08cac888ab9b527", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/phase8b/phase8b/skills/traffic-check/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-dd81437035e2f9da", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: docs/phase8b/phase8b/skills/weather-forecast/SKILL.md"}, "properties": {"repobilityId": "494a64c3a88a546d", "scanner": "scanner-primary", "fingerprint": "dd81437035e2f9da", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/phase8b/phase8b/skills/weather-forecast/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-73129968fa47be85", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: docs/phase8b/phase8b/skills/ev-charging/SKILL.md"}, "properties": {"repobilityId": "51a992e61413ba99", "scanner": "scanner-primary", "fingerprint": "73129968fa47be85", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/phase8b/phase8b/skills/ev-charging/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5c42b1fc117061cb", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: docs/phase8b/phase8b/skills/smart-home/SKILL.md"}, "properties": {"repobilityId": "57db736323cfd4cb", "scanner": "scanner-primary", "fingerprint": "5c42b1fc117061cb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/phase8b/phase8b/skills/smart-home/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b6f07777c1a88df7", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: docs/phase8a/skills/schedule-today/SKILL.md"}, "properties": {"repobilityId": "b0aeb723c7b010b3", "scanner": "scanner-primary", "fingerprint": "b6f07777c1a88df7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/phase8a/skills/schedule-today/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a75a9239a7cbdea0", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/book-recommender/SKILL.md"}, "properties": {"repobilityId": "1ac9a2d79f622311", "scanner": "scanner-primary", "fingerprint": "a75a9239a7cbdea0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "domains/peterbot/wsl_config/skills/book-recommender/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-adc0a7e0a72e38c5", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/tutor-email-parser/SKILL.md"}, "properties": {"repobilityId": "6b64a8a1879c51ac", "scanner": "scanner-primary", "fingerprint": "adc0a7e0a72e38c5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "domains/peterbot/wsl_config/skills/tutor-email-parser/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3faaf72f890b0cc8", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/heartbeat/SKILL.md"}, "properties": {"repobilityId": "a45de6c63c51b9e0", "scanner": "scanner-primary", "fingerprint": "3faaf72f890b0cc8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "domains/peterbot/wsl_config/skills/heartbeat/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8541ced2a95c90a9", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/morning-briefing/SKILL.md"}, "properties": {"repobilityId": "b5b31baee019f4e5", "scanner": "scanner-primary", "fingerprint": "8541ced2a95c90a9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "domains/peterbot/wsl_config/skills/morning-briefing/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7f92b82b50ab73b0", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/fitness-dashboard/SKILL.md"}, "properties": {"repobilityId": "7c6e2bf7cabcab2d", "scanner": "scanner-primary", "fingerprint": "7f92b82b50ab73b0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "domains/peterbot/wsl_config/skills/fitness-dashboard/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1aa9c557f5ed88b7", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/meal-plan-generator/SKILL.md"}, "properties": {"repobilityId": "6b6d9113a29355d5", "scanner": "scanner-primary", "fingerprint": "1aa9c557f5ed88b7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "domains/peterbot/wsl_config/skills/meal-plan-generator/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-92ff367cabf63f12", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: domains/peterbot/wsl_config/skills/healthera-prescriptions/SKILL.md"}, "properties": {"repobilityId": "2a8b85748bf3df6f", "scanner": "scanner-primary", "fingerprint": "92ff367cabf63f12", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "domains/peterbot/wsl_config/skills/healthera-prescriptions/SKILL.md"}, "region": {"startLine": 134}}}]}, {"ruleId": "scanner-6836e4a9617724f1", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/cost-digest/SKILL.md"}, "properties": {"repobilityId": "a8a9c9cf8d918556", "scanner": "scanner-primary", "fingerprint": "6836e4a9617724f1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "domains/peterbot/wsl_config/skills/cost-digest/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2aa3e054bd10fdd6", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/school-pickup/SKILL.md"}, "properties": {"repobilityId": "9e52425e95349bde", "scanner": "scanner-primary", "fingerprint": "2aa3e054bd10fdd6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "domains/peterbot/wsl_config/skills/school-pickup/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-48880fb853d365c1", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/schedule-today/SKILL.md"}, "properties": {"repobilityId": "39507efbe15cb904", "scanner": "scanner-primary", "fingerprint": "48880fb853d365c1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "domains/peterbot/wsl_config/skills/schedule-today/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-65ab30782c7fb7d8", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/life-admin-dashboard/SKILL.md"}, "properties": {"repobilityId": "d530f7f94bd685e5", "scanner": "scanner-primary", "fingerprint": "65ab30782c7fb7d8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "domains/peterbot/wsl_config/skills/life-admin-dashboard/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c4fc0c35e95adf85", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/fitness-program-start/SKILL.md"}, "properties": {"repobilityId": "f6a871bd82177141", "scanner": "scanner-primary", "fingerprint": "c4fc0c35e95adf85", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "domains/peterbot/wsl_config/skills/fitness-program-start/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0ba105252a2aac4b", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/daily-thoughts/SKILL.md"}, "properties": {"repobilityId": "11cddd7a2c6d239c", "scanner": "scanner-primary", "fingerprint": "0ba105252a2aac4b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "domains/peterbot/wsl_config/skills/daily-thoughts/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-76fdf03aa00a5a0b", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/school-run/SKILL.md"}, "properties": {"repobilityId": "308a41d4763d7751", "scanner": "scanner-primary", "fingerprint": "76fdf03aa00a5a0b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "domains/peterbot/wsl_config/skills/school-run/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4f7d84821eb148af", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/hb-add-inventory/SKILL.md"}, "properties": {"repobilityId": "e745de25bf0491c2", "scanner": "scanner-primary", "fingerprint": "4f7d84821eb148af", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "domains/peterbot/wsl_config/skills/hb-add-inventory/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1b3dac3f7ff8c204", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/ev-charging/SKILL.md"}, "properties": {"repobilityId": "caab24f2fb7adfa8", "scanner": "scanner-primary", "fingerprint": "1b3dac3f7ff8c204", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "domains/peterbot/wsl_config/skills/ev-charging/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d579bb927e0e1db6", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/amazon-purchases/SKILL.md"}, "properties": {"repobilityId": "af01a370ca7b0f86", "scanner": "scanner-primary", "fingerprint": "d579bb927e0e1db6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "domains/peterbot/wsl_config/skills/amazon-purchases/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4e534eca7d4d1733", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/property-valuation/SKILL.md"}, "properties": {"repobilityId": "ce27834b8fbb07d0", "scanner": "scanner-primary", "fingerprint": "4e534eca7d4d1733", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "domains/peterbot/wsl_config/skills/property-valuation/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-42b8b196ae285b2f", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/directions/SKILL.md"}, "properties": {"repobilityId": "6ac1aa1f3f913c31", "scanner": "scanner-primary", "fingerprint": "42b8b196ae285b2f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "domains/peterbot/wsl_config/skills/directions/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-69878b693f7d60c6", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/instagram-processing/SKILL.md"}, "properties": {"repobilityId": "8ee7be68cf40debb", "scanner": "scanner-primary", "fingerprint": "69878b693f7d60c6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "domains/peterbot/wsl_config/skills/instagram-processing/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-75a85b634bb5f580", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/pocket-money-weekly/SKILL.md"}, "properties": {"repobilityId": "41539d85a05958b0", "scanner": "scanner-primary", "fingerprint": "75a85b634bb5f580", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "domains/peterbot/wsl_config/skills/pocket-money-weekly/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c9985a31631ba148", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/drive-search/SKILL.md"}, "properties": {"repobilityId": "3a5c12e8ea2ed344", "scanner": "scanner-primary", "fingerprint": "c9985a31631ba148", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "domains/peterbot/wsl_config/skills/drive-search/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-fda42c143a001022", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/flight-prices/SKILL.md"}, "properties": {"repobilityId": "4b0127839dc34605", "scanner": "scanner-primary", "fingerprint": "fda42c143a001022", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "domains/peterbot/wsl_config/skills/flight-prices/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b6e07116a3b44117", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/daily-batch/SKILL.md"}, "properties": {"repobilityId": "42fb6b905221f3cd", "scanner": "scanner-primary", "fingerprint": "b6e07116a3b44117", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "domains/peterbot/wsl_config/skills/daily-batch/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8219fe8ccc6ffbcd", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: domains/peterbot/wsl_config/skills/chrome-cdp/SKILL.md"}, "properties": {"repobilityId": "53580f0ecee5aff7", "scanner": "scanner-primary", "fingerprint": "8219fe8ccc6ffbcd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "domains/peterbot/wsl_config/skills/chrome-cdp/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ba860b19ffc1c1a", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/commands/verify-done.md"}, "properties": {"repobilityId": "80e115cd45da41b2", "scanner": "scanner-primary", "fingerprint": "3ba860b19ffc1c1a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/commands/verify-done.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1cbb14d6fcc93619", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/commands/code-review.md"}, "properties": {"repobilityId": "3c7300b89f4b896d", "scanner": "scanner-primary", "fingerprint": "1cbb14d6fcc93619", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/commands/code-review.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ee4d30373adf4be5", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/commands/build-feature.md"}, "properties": {"repobilityId": "046e14f4901eb434", "scanner": "scanner-primary", "fingerprint": "ee4d30373adf4be5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/commands/build-feature.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a7454fcd4ba7e2da", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/commands/tech-debt.md"}, "properties": {"repobilityId": "8c747cae6c8ca0e8", "scanner": "scanner-primary", "fingerprint": "a7454fcd4ba7e2da", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/commands/tech-debt.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b089b2bf6e68e37f", "level": "note", "message": {"text": "Legacy-named symbol `router_v2` in bot.py:45"}, "properties": {"repobilityId": "7249c10e2a15dcbf", "scanner": "scanner-primary", "fingerprint": "b089b2bf6e68e37f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-21d55a57177a074b", "level": "none", "message": {"text": "Commented-code block (8 lines) in bot.py:93"}, "properties": {"repobilityId": "2560e6aa72488c13", "scanner": "scanner-primary", "fingerprint": "21d55a57177a074b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-633ae2886b1721cf", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 start_single.py:74"}, "properties": {"repobilityId": "e2fd7d8e5c74c38f", "scanner": "scanner-primary", "fingerprint": "633ae2886b1721cf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8f4f78d39c1efe4f", "level": "error", "message": {"text": "Blocking `time.sleep(...)` inside `async def _keepa_get` \u2014 mcp_servers/keepa_mcp.py:82"}, "properties": {"repobilityId": "745b77f1f37e1bec", "scanner": "scanner-primary", "fingerprint": "8f4f78d39c1efe4f", "layer": "quality", "severity": "high", "confidence": 1.0, "tags": ["integrity", "sync-io-in-async", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "mcp_servers/keepa_mcp.py"}, "region": {"startLine": 82}}}]}, {"ruleId": "scanner-c58a821cc4106e79", "level": "none", "message": {"text": "Commented-code block (5 lines) in jobs/incremental_seed.py:22"}, "properties": {"repobilityId": "05ef07c5885ba24c", "scanner": "scanner-primary", "fingerprint": "c58a821cc4106e79", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9a683e576d4ba3c5", "level": "none", "message": {"text": "Commented-code block (6 lines) in jobs/hb_crons.py:37"}, "properties": {"repobilityId": "12ac7eda817a4322", "scanner": "scanner-primary", "fingerprint": "9a683e576d4ba3c5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7110e7c7520a9fee", "level": "note", "message": {"text": "Legacy-named symbol `router_v2` in peter-channel/src/index.ts:454"}, "properties": {"repobilityId": "f7d8ce39c850e677", "scanner": "scanner-primary", "fingerprint": "7110e7c7520a9fee", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-0244a62b58bcc1b4", "level": "none", "message": {"text": "Commented-code block (7 lines) in peter-channel/src/index.ts:296"}, "properties": {"repobilityId": "7eb80b34d5a91e6f", "scanner": "scanner-primary", "fingerprint": "0244a62b58bcc1b4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9eb8e448e3ac8056", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 peter-channel/src/index.ts:166"}, "properties": {"repobilityId": "ef85ad7b7fd0df70", "scanner": "scanner-primary", "fingerprint": "9eb8e448e3ac8056", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e37e9f9ea2db89cd", "level": "note", "message": {"text": "Legacy-named symbol `router_v2` in whatsapp-channel/src/index.ts:330"}, "properties": {"repobilityId": "3b96cb6220ab4bca", "scanner": "scanner-primary", "fingerprint": "e37e9f9ea2db89cd", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-9626cb2af5255fa5", "level": "note", "message": {"text": "Legacy-named symbol `drive_copy` in hadley_api/main.py:4384"}, "properties": {"repobilityId": "53b853af533dc43b", "scanner": "scanner-primary", "fingerprint": "9626cb2af5255fa5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-53aca9c59c7445d4", "level": "none", "message": {"text": "Commented-code block (15 lines) in hadley_api/claude_routes.py:49"}, "properties": {"repobilityId": "321e676806eb910f", "scanner": "scanner-primary", "fingerprint": "53aca9c59c7445d4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-13e8f059f5875cc7", "level": "note", "message": {"text": "Legacy-named symbol `router_v2` in hadley_api/cost_routes.py:1"}, "properties": {"repobilityId": "51808407b9b006b1", "scanner": "scanner-primary", "fingerprint": "13e8f059f5875cc7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-c6afcf8b9bdb293e", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 hadley_api/voice_engine.py:52"}, "properties": {"repobilityId": "034071dce50c9305", "scanner": "scanner-primary", "fingerprint": "c6afcf8b9bdb293e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f667e3f6e04f6a39", "level": "note", "message": {"text": "Legacy-named symbol `router_v2` in hadley_api/peter_routes/cost_log.py:3"}, "properties": {"repobilityId": "51ef054984345263", "scanner": "scanner-primary", "fingerprint": "f667e3f6e04f6a39", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-32dd132499121eaa", "level": "note", "message": {"text": "Legacy-named symbol `router_v2` in hadley_api/peter_routes/attachment_download.py:4"}, "properties": {"repobilityId": "b3add729386915e6", "scanner": "scanner-primary", "fingerprint": "32dd132499121eaa", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-da09297fec6b7247", "level": "note", "message": {"text": "Legacy-named symbol `router_v2` in hadley_api/peter_routes/build_context.py:5"}, "properties": {"repobilityId": "07cf0f00f5f55ff6", "scanner": "scanner-primary", "fingerprint": "da09297fec6b7247", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-7784f2e6f9733347", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 peter_dashboard/service_manager.py:488"}, "properties": {"repobilityId": "2b93959b724aa88b", "scanner": "scanner-primary", "fingerprint": "7784f2e6f9733347", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3d4b3c00c41bf2d7", "level": "note", "message": {"text": "Legacy-named symbol `router_v2` in peter_dashboard/app.py:104"}, "properties": {"repobilityId": "fbe1584449e3ceea", "scanner": "scanner-primary", "fingerprint": "3d4b3c00c41bf2d7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-4743a0a32b5d60d4", "level": "error", "message": {"text": "Blocking `time.sleep(...)` inside `async def restart_service_endpoint` \u2014 peter_dashboard/app.py:1067"}, "properties": {"repobilityId": "b7513ec634857fe7", "scanner": "scanner-primary", "fingerprint": "4743a0a32b5d60d4", "layer": "quality", "severity": "high", "confidence": 1.0, "tags": ["integrity", "sync-io-in-async", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "peter_dashboard/app.py"}, "region": {"startLine": 1067}}}]}, {"ruleId": "scanner-03876e100adadf67", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 peter_dashboard/static/js/app.js:6257"}, "properties": {"repobilityId": "9c0143a6f7c27252", "scanner": "scanner-primary", "fingerprint": "03876e100adadf67", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-797d3d57708b3a98", "level": "none", "message": {"text": "Commented-code block (5 lines) in domains/fitness/programme_start.py:137"}, "properties": {"repobilityId": "08486ba81b5fc200", "scanner": "scanner-primary", "fingerprint": "797d3d57708b3a98", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a7a56f5234cf5f45", "level": "none", "message": {"text": "Commented-code block (5 lines) in domains/fitness/service.py:406"}, "properties": {"repobilityId": "a7a2d2100b8681d3", "scanner": "scanner-primary", "fingerprint": "a7a56f5234cf5f45", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6090d99248ab2437", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 domains/prolific/chrome.py:3"}, "properties": {"repobilityId": "082c002086b2db32", "scanner": "scanner-primary", "fingerprint": "6090d99248ab2437", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fffba9e348c83c5b", "level": "none", "message": {"text": "Commented-code block (6 lines) in domains/accountability/auto_sources.py:297"}, "properties": {"repobilityId": "5a32fc76e9a817bf", "scanner": "scanner-primary", "fingerprint": "fffba9e348c83c5b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-90bee83123b2da90", "level": "none", "message": {"text": "Commented-code block (5 lines) in domains/second_brain/seed/adapters/claude_code_history.py:96"}, "properties": {"repobilityId": "10a655bbe418014a", "scanner": "scanner-primary", "fingerprint": "90bee83123b2da90", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8dc7d8117f04dc5f", "level": "note", "message": {"text": "Legacy-named symbol `router_v2` in domains/second_brain/seed/adapters/channel_conversations.py:4"}, "properties": {"repobilityId": "aff19a824e552035", "scanner": "scanner-primary", "fingerprint": "8dc7d8117f04dc5f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-22baab3a4938e07d", "level": "none", "message": {"text": "Commented-code block (5 lines) in domains/second_brain/seed/adapters/scrapers/gousto.py:310"}, "properties": {"repobilityId": "1ddf75a8664dcb01", "scanner": "scanner-primary", "fingerprint": "22baab3a4938e07d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e8740e9fe937a08c", "level": "note", "message": {"text": "Legacy-named symbol `router_v2` in domains/peterbot/memory.py:5"}, "properties": {"repobilityId": "d1d067d94b17cef5", "scanner": "scanner-primary", "fingerprint": "e8740e9fe937a08c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-69d4f4f780ae0e51", "level": "none", "message": {"text": "Commented-code block (5 lines) in domains/peterbot/memory.py:20"}, "properties": {"repobilityId": "33e58a6d277bba84", "scanner": "scanner-primary", "fingerprint": "69d4f4f780ae0e51", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-32ba34ba1ca2d00c", "level": "note", "message": {"text": "Legacy-named symbol `router_v2` in domains/peterbot/fallback_stats.py:1"}, "properties": {"repobilityId": "bb600c12914cad84", "scanner": "scanner-primary", "fingerprint": "32ba34ba1ca2d00c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-57b4aa6c5c557ca7", "level": "note", "message": {"text": "Legacy-named symbol `router_v2` in domains/peterbot/__init__.py:4"}, "properties": {"repobilityId": "3809087bd99d25d4", "scanner": "scanner-primary", "fingerprint": "57b4aa6c5c557ca7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-8034fa0148c11a0b", "level": "note", "message": {"text": "Legacy-named symbol `router_v2` in domains/peterbot/config.py:106"}, "properties": {"repobilityId": "60244966e1d47016", "scanner": "scanner-primary", "fingerprint": "8034fa0148c11a0b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-591c4c7b3f34b489", "level": "note", "message": {"text": "Legacy-named symbol `router_v2` in domains/peterbot/costs.py:6"}, "properties": {"repobilityId": "2055e6737b9c3397", "scanner": "scanner-primary", "fingerprint": "591c4c7b3f34b489", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-7bf15d5acbf8eaeb", "level": "note", "message": {"text": "Legacy-named symbol `router_v2` in domains/peterbot/data_fetchers.py:4015"}, "properties": {"repobilityId": "2981d595b85da503", "scanner": "scanner-primary", "fingerprint": "7bf15d5acbf8eaeb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-2309386cd0478c6c", "level": "note", "message": {"text": "Legacy-named symbol `pr_old` in domains/peterbot/morning_quality_report.py:149"}, "properties": {"repobilityId": "1de709c22cafa46b", "scanner": "scanner-primary", "fingerprint": "2309386cd0478c6c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-9170c4dacfb2f5a2", "level": "error", "message": {"text": "Blocking `httpx.get(...)` inside `async def check_and_send_alerts` \u2014 domains/peterbot/japan_alerts.py:309"}, "properties": {"repobilityId": "0ef8692aee7c0f79", "scanner": "scanner-primary", "fingerprint": "9170c4dacfb2f5a2", "layer": "quality", "severity": "high", "confidence": 1.0, "tags": ["integrity", "sync-io-in-async", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "domains/peterbot/japan_alerts.py"}, "region": {"startLine": 309}}}]}, {"ruleId": "scanner-ed8489f662df4310", "level": "error", "message": {"text": "Blocking `httpx.get(...)` inside `async def check_and_send_alerts` \u2014 domains/peterbot/japan_alerts.py:494"}, "properties": {"repobilityId": "12d99c6d739cd6b3", "scanner": "scanner-primary", "fingerprint": "ed8489f662df4310", "layer": "quality", "severity": "high", "confidence": 1.0, "tags": ["integrity", "sync-io-in-async", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "domains/peterbot/japan_alerts.py"}, "region": {"startLine": 494}}}]}, {"ruleId": "scanner-e9b6bf3e00a764ec", "level": "error", "message": {"text": "Blocking `httpx.get(...)` inside `async def check_and_send_alerts` \u2014 domains/peterbot/japan_alerts.py:503"}, "properties": {"repobilityId": "9ae444d2b9fe20c8", "scanner": "scanner-primary", "fingerprint": "e9b6bf3e00a764ec", "layer": "quality", "severity": "high", "confidence": 1.0, "tags": ["integrity", "sync-io-in-async", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "domains/peterbot/japan_alerts.py"}, "region": {"startLine": 503}}}]}, {"ruleId": "scanner-71e7d6c000970c09", "level": "error", "message": {"text": "Blocking `httpx.get(...)` inside `async def check_and_send_alerts` \u2014 domains/peterbot/japan_alerts.py:512"}, "properties": {"repobilityId": "8a41a854cf3e80d4", "scanner": "scanner-primary", "fingerprint": "71e7d6c000970c09", "layer": "quality", "severity": "high", "confidence": 1.0, "tags": ["integrity", "sync-io-in-async", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "domains/peterbot/japan_alerts.py"}, "region": {"startLine": 512}}}]}, {"ruleId": "scanner-4b5e874a1d151cd9", "level": "note", "message": {"text": "Legacy-named symbol `_send_to_claude_code_v2` in domains/peterbot/scheduler.py:823"}, "properties": {"repobilityId": "13ecb96065d3b613", "scanner": "scanner-primary", "fingerprint": "4b5e874a1d151cd9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b085673a95a80c26", "level": "none", "message": {"text": "Commented-code block (6 lines) in domains/peterbot/scheduler.py:802"}, "properties": {"repobilityId": "b3038eab9e67d4c7", "scanner": "scanner-primary", "fingerprint": "b085673a95a80c26", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fd9305f14c0a306a", "level": "note", "message": {"text": "Legacy-named symbol `router_v2` in domains/peterbot/kimi_provider.py:27"}, "properties": {"repobilityId": "ba5ae41a511370fb", "scanner": "scanner-primary", "fingerprint": "fd9305f14c0a306a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d12c50d330a0793c", "level": "none", "message": {"text": "Commented-code block (5 lines) in domains/peterbot/skill_manifest.py:151"}, "properties": {"repobilityId": "353190214df77d17", "scanner": "scanner-primary", "fingerprint": "d12c50d330a0793c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0e7982a149415c3b", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 domains/peterbot/wsl_config/sync.py:82"}, "properties": {"repobilityId": "01b9eb865bc1e56b", "scanner": "scanner-primary", "fingerprint": "0e7982a149415c3b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6499222c0dfc35cd", "level": "note", "message": {"text": "Legacy-named symbol `Router_v2` in domains/peterbot/response/sanitiser.py:3"}, "properties": {"repobilityId": "6d57694542aae34d", "scanner": "scanner-primary", "fingerprint": "6499222c0dfc35cd", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-1684ece58300bdc1", "level": "note", "message": {"text": "Legacy-named symbol `router_v2` in domains/peterbot/reminders/executor.py:90"}, "properties": {"repobilityId": "b2e598744e388eb1", "scanner": "scanner-primary", "fingerprint": "1684ece58300bdc1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-96ea9862fd1368f3", "level": "none", "message": {"text": "Commented-code block (5 lines) in domains/energy/telemetry.py:49"}, "properties": {"repobilityId": "f149709a28abaa64", "scanner": "scanner-primary", "fingerprint": "96ea9862fd1368f3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f4c0858eb380d006", "level": "none", "message": {"text": "Commented-code block (5 lines) in domains/energy/octopus_sync.py:433"}, "properties": {"repobilityId": "3b7f78876724de16", "scanner": "scanner-primary", "fingerprint": "f4c0858eb380d006", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5e98d838c530654f", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 domains/claude_code/tools.py:49"}, "properties": {"repobilityId": "988e7e19495b5255", "scanner": "scanner-primary", "fingerprint": "5e98d838c530654f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a0b23e01683e0b09", "level": "note", "message": {"text": "99 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "0232a8319d7ea77c", "scanner": "scanner-primary", "fingerprint": "a0b23e01683e0b09", "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": "828d0c18b747d0cc", "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": "adedab4cd7584846", "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": "c1d4bf7c96dd9626", "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": "8657a79856c49df0", "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": "8b94d3bd07d8ca03", "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": "dac25ed4fd8e16ec", "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": "b3eaf18f306fda37", "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": "d2842577f679bb08", "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": "e1131e53e1309add", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "09a6adc103b772cf", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "7161a6c8eaa1900f", "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": "2882ecba8c79ad4f", "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": "b7d5d276347f9cff", "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": "da744f5b2e1bfcc5", "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": "bb1946a490c2b67b", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "514330bde56ef02e", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "4af3de5715645ea6", "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": "df58e4fd7d9a96ee", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "0fe6edecddb73278", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "b54f87ce31daa14c", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-da559b004672576f", "level": "error", "message": {"text": "FastAPI POST `check_purchase_allowed` without auth dependency \u2014 hadley_api/browser_routes.py:183"}, "properties": {"repobilityId": "63819f4fd2b37eb0", "scanner": "scanner-primary", "fingerprint": "da559b004672576f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/browser_routes.py"}, "region": {"startLine": 183}}}]}, {"ruleId": "scanner-213a82ed8a859289", "level": "error", "message": {"text": "FastAPI POST `start_browser_session` without auth dependency \u2014 hadley_api/browser_routes.py:201"}, "properties": {"repobilityId": "ba97d35fe27ace0c", "scanner": "scanner-primary", "fingerprint": "213a82ed8a859289", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/browser_routes.py"}, "region": {"startLine": 201}}}]}, {"ruleId": "scanner-79300a24d9d49acb", "level": "error", "message": {"text": "FastAPI POST `end_browser_session` without auth dependency \u2014 hadley_api/browser_routes.py:257"}, "properties": {"repobilityId": "b028ea9e81bbeba6", "scanner": "scanner-primary", "fingerprint": "79300a24d9d49acb", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/browser_routes.py"}, "region": {"startLine": 257}}}]}, {"ruleId": "scanner-a0268277f25f9893", "level": "error", "message": {"text": "FastAPI POST `execute_action` without auth dependency \u2014 hadley_api/browser_routes.py:314"}, "properties": {"repobilityId": "cdd032a513f40ba6", "scanner": "scanner-primary", "fingerprint": "a0268277f25f9893", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/browser_routes.py"}, "region": {"startLine": 314}}}]}, {"ruleId": "scanner-94ad0ab460c19302", "level": "error", "message": {"text": "FastAPI POST `whatsapp_webhook` without auth dependency \u2014 hadley_api/whatsapp_webhook.py:402"}, "properties": {"repobilityId": "5c8e1454f23ad7fd", "scanner": "scanner-primary", "fingerprint": "94ad0ab460c19302", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/whatsapp_webhook.py"}, "region": {"startLine": 402}}}]}, {"ruleId": "scanner-e693d3ad68ad6f06", "level": "error", "message": {"text": "FastAPI POST `whatsapp_webhook` without auth dependency \u2014 hadley_api/whatsapp_webhook.py:403"}, "properties": {"repobilityId": "0f3f1007e5b7a075", "scanner": "scanner-primary", "fingerprint": "e693d3ad68ad6f06", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/whatsapp_webhook.py"}, "region": {"startLine": 403}}}]}, {"ruleId": "scanner-c2ee2b1dc6709cac", "level": "error", "message": {"text": "FastAPI POST `voice_listen` without auth dependency \u2014 hadley_api/voice_routes.py:87"}, "properties": {"repobilityId": "de45515464958421", "scanner": "scanner-primary", "fingerprint": "c2ee2b1dc6709cac", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/voice_routes.py"}, "region": {"startLine": 87}}}]}, {"ruleId": "scanner-37cbca6c6ba57045", "level": "error", "message": {"text": "FastAPI POST `voice_speak` without auth dependency \u2014 hadley_api/voice_routes.py:108"}, "properties": {"repobilityId": "b17337766fe6df1f", "scanner": "scanner-primary", "fingerprint": "37cbca6c6ba57045", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/voice_routes.py"}, "region": {"startLine": 108}}}]}, {"ruleId": "scanner-0a6c60d7ce3ae533", "level": "error", "message": {"text": "FastAPI POST `voice_converse` without auth dependency \u2014 hadley_api/voice_routes.py:129"}, "properties": {"repobilityId": "2dbc6d3877f2eab0", "scanner": "scanner-primary", "fingerprint": "0a6c60d7ce3ae533", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/voice_routes.py"}, "region": {"startLine": 129}}}]}, {"ruleId": "scanner-e8e8efaeae671cd4", "level": "error", "message": {"text": "FastAPI POST `save_card` without auth dependency \u2014 hadley_api/vault_routes.py:92"}, "properties": {"repobilityId": "204ac8a9d64fac32", "scanner": "scanner-primary", "fingerprint": "e8e8efaeae671cd4", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/vault_routes.py"}, "region": {"startLine": 92}}}]}, {"ruleId": "scanner-993ecfd30fa6b2d8", "level": "error", "message": {"text": "FastAPI DELETE `delete_card` without auth dependency \u2014 hadley_api/vault_routes.py:167"}, "properties": {"repobilityId": "103578ed14f2a8e3", "scanner": "scanner-primary", "fingerprint": "993ecfd30fa6b2d8", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/vault_routes.py"}, "region": {"startLine": 167}}}]}, {"ruleId": "scanner-08ed5e8c6debc9f8", "level": "error", "message": {"text": "FastAPI POST `create_category` without auth dependency \u2014 hadley_api/task_routes.py:238"}, "properties": {"repobilityId": "c6e8e9bc4557d647", "scanner": "scanner-primary", "fingerprint": "08ed5e8c6debc9f8", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/task_routes.py"}, "region": {"startLine": 238}}}]}, {"ruleId": "scanner-e283e22b6313ec6b", "level": "error", "message": {"text": "FastAPI PUT `update_category` without auth dependency \u2014 hadley_api/task_routes.py:280"}, "properties": {"repobilityId": "a43ede2a337c0d66", "scanner": "scanner-primary", "fingerprint": "e283e22b6313ec6b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/task_routes.py"}, "region": {"startLine": 280}}}]}, {"ruleId": "scanner-48f02f3b363d45f8", "level": "error", "message": {"text": "FastAPI DELETE `delete_category` without auth dependency \u2014 hadley_api/task_routes.py:315"}, "properties": {"repobilityId": "06bf677e30f74035", "scanner": "scanner-primary", "fingerprint": "48f02f3b363d45f8", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/task_routes.py"}, "region": {"startLine": 315}}}]}, {"ruleId": "scanner-a878c2b39971f8c2", "level": "error", "message": {"text": "FastAPI POST `create_task` without auth dependency \u2014 hadley_api/task_routes.py:582"}, "properties": {"repobilityId": "9c604f94e34537c2", "scanner": "scanner-primary", "fingerprint": "a878c2b39971f8c2", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/task_routes.py"}, "region": {"startLine": 582}}}]}, {"ruleId": "scanner-2f48e29e128fe991", "level": "error", "message": {"text": "FastAPI PUT `update_task` without auth dependency \u2014 hadley_api/task_routes.py:654"}, "properties": {"repobilityId": "135e9630d9253806", "scanner": "scanner-primary", "fingerprint": "2f48e29e128fe991", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/task_routes.py"}, "region": {"startLine": 654}}}]}, {"ruleId": "scanner-9f473dbccaf0b02b", "level": "error", "message": {"text": "FastAPI DELETE `delete_task` without auth dependency \u2014 hadley_api/task_routes.py:706"}, "properties": {"repobilityId": "635cda62af850337", "scanner": "scanner-primary", "fingerprint": "9f473dbccaf0b02b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/task_routes.py"}, "region": {"startLine": 706}}}]}, {"ruleId": "scanner-63985f3f56c2456a", "level": "error", "message": {"text": "FastAPI POST `change_task_status` without auth dependency \u2014 hadley_api/task_routes.py:725"}, "properties": {"repobilityId": "b7b652eabaac5637", "scanner": "scanner-primary", "fingerprint": "63985f3f56c2456a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/task_routes.py"}, "region": {"startLine": 725}}}]}, {"ruleId": "scanner-0ff8dadd674942db", "level": "error", "message": {"text": "FastAPI POST `schedule_heartbeat` without auth dependency \u2014 hadley_api/task_routes.py:793"}, "properties": {"repobilityId": "d6e13b510a640ec6", "scanner": "scanner-primary", "fingerprint": "0ff8dadd674942db", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/task_routes.py"}, "region": {"startLine": 793}}}]}, {"ruleId": "scanner-69fd089413e75627", "level": "error", "message": {"text": "FastAPI POST `add_comment` without auth dependency \u2014 hadley_api/task_routes.py:868"}, "properties": {"repobilityId": "f300924494be93a5", "scanner": "scanner-primary", "fingerprint": "69fd089413e75627", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/task_routes.py"}, "region": {"startLine": 868}}}]}, {"ruleId": "scanner-bd6b95fabd9f4578", "level": "error", "message": {"text": "FastAPI PUT `update_task_categories` without auth dependency \u2014 hadley_api/task_routes.py:931"}, "properties": {"repobilityId": "b37eb4d7eaadb1ff", "scanner": "scanner-primary", "fingerprint": "bd6b95fabd9f4578", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/task_routes.py"}, "region": {"startLine": 931}}}]}, {"ruleId": "scanner-4b7e73f3b164ef2d", "level": "error", "message": {"text": "FastAPI POST `reorder_task` without auth dependency \u2014 hadley_api/task_routes.py:968"}, "properties": {"repobilityId": "eeb7cb277b14bca0", "scanner": "scanner-primary", "fingerprint": "4b7e73f3b164ef2d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/task_routes.py"}, "region": {"startLine": 968}}}]}, {"ruleId": "scanner-38a5a5974d469d02", "level": "error", "message": {"text": "FastAPI POST `bulk_reorder_tasks` without auth dependency \u2014 hadley_api/task_routes.py:988"}, "properties": {"repobilityId": "7a03defc2c1486dd", "scanner": "scanner-primary", "fingerprint": "38a5a5974d469d02", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/task_routes.py"}, "region": {"startLine": 988}}}]}, {"ruleId": "scanner-2fe5fc27e79cc364", "level": "error", "message": {"text": "FastAPI PUT `update_day_plan` without auth dependency \u2014 hadley_api/japan_routes.py:135"}, "properties": {"repobilityId": "fcbcbcc01838a695", "scanner": "scanner-primary", "fingerprint": "2fe5fc27e79cc364", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/japan_routes.py"}, "region": {"startLine": 135}}}]}, {"ruleId": "scanner-b03543f991a4b17a", "level": "error", "message": {"text": "FastAPI POST `send_digest` without auth dependency \u2014 hadley_api/japan_routes.py:583"}, "properties": {"repobilityId": "d91d026951cee33a", "scanner": "scanner-primary", "fingerprint": "b03543f991a4b17a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/japan_routes.py"}, "region": {"startLine": 583}}}]}, {"ruleId": "scanner-4f90e62bef93456e", "level": "error", "message": {"text": "FastAPI POST `set_sim_date` without auth dependency \u2014 hadley_api/japan_routes.py:692"}, "properties": {"repobilityId": "68501d08adac884f", "scanner": "scanner-primary", "fingerprint": "4f90e62bef93456e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/japan_routes.py"}, "region": {"startLine": 692}}}]}, {"ruleId": "scanner-d4de58e39c7e25ff", "level": "error", "message": {"text": "FastAPI POST `photobook_upload` without auth dependency \u2014 hadley_api/japan_routes.py:785"}, "properties": {"repobilityId": "e435f632904e3d98", "scanner": "scanner-primary", "fingerprint": "d4de58e39c7e25ff", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/japan_routes.py"}, "region": {"startLine": 785}}}]}, {"ruleId": "scanner-432d51d66f232e08", "level": "error", "message": {"text": "FastAPI POST `photobook_highlight` without auth dependency \u2014 hadley_api/japan_routes.py:861"}, "properties": {"repobilityId": "06b587ed6417bca8", "scanner": "scanner-primary", "fingerprint": "432d51d66f232e08", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/japan_routes.py"}, "region": {"startLine": 861}}}]}, {"ruleId": "scanner-576190b3b074fae6", "level": "error", "message": {"text": "FastAPI POST `photobook_diary` without auth dependency \u2014 hadley_api/japan_routes.py:899"}, "properties": {"repobilityId": "52cee37b22c305de", "scanner": "scanner-primary", "fingerprint": "576190b3b074fae6", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/japan_routes.py"}, "region": {"startLine": 899}}}]}, {"ruleId": "scanner-3e1612102ab72731", "level": "error", "message": {"text": "FastAPI POST `set_sim_time` without auth dependency \u2014 hadley_api/japan_routes.py:983"}, "properties": {"repobilityId": "007f4da4607b97b0", "scanner": "scanner-primary", "fingerprint": "3e1612102ab72731", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/japan_routes.py"}, "region": {"startLine": 983}}}]}, {"ruleId": "scanner-fcff37f675a45c76", "level": "error", "message": {"text": "FastAPI POST `test_alerts` without auth dependency \u2014 hadley_api/japan_routes.py:995"}, "properties": {"repobilityId": "20865d8e03822b9d", "scanner": "scanner-primary", "fingerprint": "fcff37f675a45c76", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/japan_routes.py"}, "region": {"startLine": 995}}}]}, {"ruleId": "scanner-60ce85f1899796ab", "level": "error", "message": {"text": "FastAPI POST `send_alerts_now` without auth dependency \u2014 hadley_api/japan_routes.py:1043"}, "properties": {"repobilityId": "7e0c17d2a3e1c482", "scanner": "scanner-primary", "fingerprint": "60ce85f1899796ab", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/japan_routes.py"}, "region": {"startLine": 1043}}}]}, {"ruleId": "scanner-8be58837e4d1c968", "level": "error", "message": {"text": "FastAPI POST `add_expense` without auth dependency \u2014 hadley_api/japan_routes.py:1055"}, "properties": {"repobilityId": "8fee14613c1c2e94", "scanner": "scanner-primary", "fingerprint": "8be58837e4d1c968", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/japan_routes.py"}, "region": {"startLine": 1055}}}]}, {"ruleId": "scanner-7bf25a634bcc3e97", "level": "error", "message": {"text": "FastAPI POST `play` without auth dependency \u2014 hadley_api/spotify_routes.py:66"}, "properties": {"repobilityId": "0f00657ee98c5652", "scanner": "scanner-primary", "fingerprint": "7bf25a634bcc3e97", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/spotify_routes.py"}, "region": {"startLine": 66}}}]}, {"ruleId": "scanner-473365e5364292c6", "level": "error", "message": {"text": "FastAPI POST `play_uri` without auth dependency \u2014 hadley_api/spotify_routes.py:88"}, "properties": {"repobilityId": "1035bc5cef85a27a", "scanner": "scanner-primary", "fingerprint": "473365e5364292c6", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/spotify_routes.py"}, "region": {"startLine": 88}}}]}, {"ruleId": "scanner-c9363824df5a65cd", "level": "error", "message": {"text": "FastAPI POST `queue` without auth dependency \u2014 hadley_api/spotify_routes.py:97"}, "properties": {"repobilityId": "74541c7543b91cd2", "scanner": "scanner-primary", "fingerprint": "c9363824df5a65cd", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/spotify_routes.py"}, "region": {"startLine": 97}}}]}, {"ruleId": "scanner-9067f0e668b719d5", "level": "error", "message": {"text": "FastAPI POST `pause` without auth dependency \u2014 hadley_api/spotify_routes.py:111"}, "properties": {"repobilityId": "6a6ab4f08382e307", "scanner": "scanner-primary", "fingerprint": "9067f0e668b719d5", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/spotify_routes.py"}, "region": {"startLine": 111}}}]}, {"ruleId": "scanner-36e7da66e8fa7817", "level": "error", "message": {"text": "FastAPI POST `resume` without auth dependency \u2014 hadley_api/spotify_routes.py:120"}, "properties": {"repobilityId": "ba25dbefc6a93bcf", "scanner": "scanner-primary", "fingerprint": "36e7da66e8fa7817", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/spotify_routes.py"}, "region": {"startLine": 120}}}]}, {"ruleId": "scanner-42249c80908d753d", "level": "error", "message": {"text": "FastAPI POST `skip` without auth dependency \u2014 hadley_api/spotify_routes.py:129"}, "properties": {"repobilityId": "1f8aaa8160fa4ca4", "scanner": "scanner-primary", "fingerprint": "42249c80908d753d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/spotify_routes.py"}, "region": {"startLine": 129}}}]}, {"ruleId": "scanner-573225957a1dce81", "level": "error", "message": {"text": "FastAPI POST `previous` without auth dependency \u2014 hadley_api/spotify_routes.py:138"}, "properties": {"repobilityId": "ac5898fae8444512", "scanner": "scanner-primary", "fingerprint": "573225957a1dce81", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/spotify_routes.py"}, "region": {"startLine": 138}}}]}, {"ruleId": "scanner-1ee869ac2dfabc22", "level": "error", "message": {"text": "FastAPI POST `set_volume` without auth dependency \u2014 hadley_api/spotify_routes.py:147"}, "properties": {"repobilityId": "bcabf1b58ceba632", "scanner": "scanner-primary", "fingerprint": "1ee869ac2dfabc22", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/spotify_routes.py"}, "region": {"startLine": 147}}}]}, {"ruleId": "scanner-96ff244a657f95d8", "level": "error", "message": {"text": "FastAPI POST `seek` without auth dependency \u2014 hadley_api/spotify_routes.py:156"}, "properties": {"repobilityId": "0a6354c45d49a212", "scanner": "scanner-primary", "fingerprint": "96ff244a657f95d8", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/spotify_routes.py"}, "region": {"startLine": 156}}}]}, {"ruleId": "scanner-66c3c17816c46d92", "level": "error", "message": {"text": "FastAPI POST `set_shuffle` without auth dependency \u2014 hadley_api/spotify_routes.py:165"}, "properties": {"repobilityId": "d3d836a2fe96beb1", "scanner": "scanner-primary", "fingerprint": "66c3c17816c46d92", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/spotify_routes.py"}, "region": {"startLine": 165}}}]}, {"ruleId": "scanner-9833693fc719df1d", "level": "error", "message": {"text": "FastAPI POST `set_repeat` without auth dependency \u2014 hadley_api/spotify_routes.py:174"}, "properties": {"repobilityId": "96c137afb110ce2c", "scanner": "scanner-primary", "fingerprint": "9833693fc719df1d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/spotify_routes.py"}, "region": {"startLine": 174}}}]}, {"ruleId": "scanner-34bab5d9519e5ca0", "level": "error", "message": {"text": "FastAPI POST `transfer` without auth dependency \u2014 hadley_api/spotify_routes.py:192"}, "properties": {"repobilityId": "d9480ee0cf401aef", "scanner": "scanner-primary", "fingerprint": "34bab5d9519e5ca0", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/spotify_routes.py"}, "region": {"startLine": 192}}}]}, {"ruleId": "scanner-f6e27418f19790d6", "level": "error", "message": {"text": "FastAPI POST `play_similar` without auth dependency \u2014 hadley_api/spotify_routes.py:220"}, "properties": {"repobilityId": "1ea824bf532e76c0", "scanner": "scanner-primary", "fingerprint": "f6e27418f19790d6", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/spotify_routes.py"}, "region": {"startLine": 220}}}]}, {"ruleId": "scanner-d2468fb2f39098e9", "level": "error", "message": {"text": "FastAPI POST `play_playlist` without auth dependency \u2014 hadley_api/spotify_routes.py:262"}, "properties": {"repobilityId": "f40da79419e3a2b5", "scanner": "scanner-primary", "fingerprint": "d2468fb2f39098e9", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/spotify_routes.py"}, "region": {"startLine": 262}}}]}, {"ruleId": "scanner-bbdbeb1f4b466016", "level": "error", "message": {"text": "FastAPI POST `claude_extract` without auth dependency \u2014 hadley_api/claude_routes.py:119"}, "properties": {"repobilityId": "126f27957c92343d", "scanner": "scanner-primary", "fingerprint": "bbdbeb1f4b466016", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/claude_routes.py"}, "region": {"startLine": 119}}}]}, {"ruleId": "scanner-0bac623ef4139a8d", "level": "error", "message": {"text": "FastAPI POST `add_spellings` without auth dependency \u2014 hadley_api/spelling_routes.py:40"}, "properties": {"repobilityId": "abf895c6d66c2104", "scanner": "scanner-primary", "fingerprint": "0bac623ef4139a8d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/spelling_routes.py"}, "region": {"startLine": 40}}}]}, {"ruleId": "scanner-cb5eaf5c91bf5b55", "level": "error", "message": {"text": "FastAPI POST `add_sentences` without auth dependency \u2014 hadley_api/spelling_routes.py:128"}, "properties": {"repobilityId": "9544664059d7ebfd", "scanner": "scanner-primary", "fingerprint": "cb5eaf5c91bf5b55", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/spelling_routes.py"}, "region": {"startLine": 128}}}]}, {"ruleId": "scanner-af10da3ae031b285", "level": "error", "message": {"text": "FastAPI POST `refresh_cache` without auth dependency \u2014 hadley_api/brain_routes.py:259"}, "properties": {"repobilityId": "9d931071c9afd4fc", "scanner": "scanner-primary", "fingerprint": "af10da3ae031b285", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hadley_api/brain_routes.py"}, "region": {"startLine": 259}}}]}, {"ruleId": "scanner-80e44daff8724705", "level": "error", "message": {"text": "FastAPI POST `upsert_subscription` without auth dependency \u2014 peter_dashboard/api/subscriptions.py:414"}, "properties": {"repobilityId": "c873382a048d04da", "scanner": "scanner-primary", "fingerprint": "80e44daff8724705", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "peter_dashboard/api/subscriptions.py"}, "region": {"startLine": 414}}}]}, {"ruleId": "scanner-c605902992d65211", "level": "error", "message": {"text": "FastAPI PUT `update_subscription` without auth dependency \u2014 peter_dashboard/api/subscriptions.py:432"}, "properties": {"repobilityId": "42dbadc60f6b16a3", "scanner": "scanner-primary", "fingerprint": "c605902992d65211", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "peter_dashboard/api/subscriptions.py"}, "region": {"startLine": 432}}}]}, {"ruleId": "scanner-87908e602c1d9b40", "level": "error", "message": {"text": "FastAPI DELETE `delete_subscription` without auth dependency \u2014 peter_dashboard/api/subscriptions.py:454"}, "properties": {"repobilityId": "d60009fc9a3db3ed", "scanner": "scanner-primary", "fingerprint": "87908e602c1d9b40", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "peter_dashboard/api/subscriptions.py"}, "region": {"startLine": 454}}}]}, {"ruleId": "scanner-bee30c100e747b6a", "level": "error", "message": {"text": "FastAPI POST `trigger_job_run` without auth dependency \u2014 peter_dashboard/api/jobs.py:805"}, "properties": {"repobilityId": "de74e222bc7fbdfe", "scanner": "scanner-primary", "fingerprint": "bee30c100e747b6a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "peter_dashboard/api/jobs.py"}, "region": {"startLine": 805}}}]}, {"ruleId": "scanner-ebc968c06ee417bd", "level": "error", "message": {"text": "Dangling fetch: GET /api/hadley/proxy/openapi.json (peter_dashboard/static/js/api-explorer.js:157)"}, "properties": {"repobilityId": "09065ed495eaec01", "scanner": "scanner-primary", "fingerprint": "ebc968c06ee417bd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6ad2194d377bd37e", "level": "note", "message": {"text": "Unused endpoint: GET /domains"}, "properties": {"repobilityId": "a9e55c40d16af369", "scanner": "scanner-primary", "fingerprint": "6ad2194d377bd37e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-62c85412bbbdb876", "level": "note", "message": {"text": "Unused endpoint: GET /limits"}, "properties": {"repobilityId": "def4ddd01e9d9bd7", "scanner": "scanner-primary", "fingerprint": "62c85412bbbdb876", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-42ca0c6db165fd6b", "level": "note", "message": {"text": "Unused endpoint: POST /limits/check"}, "properties": {"repobilityId": "d814998d397725dd", "scanner": "scanner-primary", "fingerprint": "42ca0c6db165fd6b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-eb43e0fa0411bf19", "level": "note", "message": {"text": "Unused endpoint: POST /session/start"}, "properties": {"repobilityId": "43567a16746a1e71", "scanner": "scanner-primary", "fingerprint": "eb43e0fa0411bf19", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-08869e94d02e3c11", "level": "note", "message": {"text": "Unused endpoint: GET /session/{session_id}"}, "properties": {"repobilityId": "66456c5c863efa68", "scanner": "scanner-primary", "fingerprint": "08869e94d02e3c11", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7804d7cabba5dd85", "level": "note", "message": {"text": "Unused endpoint: POST /session/end"}, "properties": {"repobilityId": "dae8e37471ff33a0", "scanner": "scanner-primary", "fingerprint": "7804d7cabba5dd85", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4069bb9c1c1e4187", "level": "note", "message": {"text": "Unused endpoint: GET /screenshot"}, "properties": {"repobilityId": "f25856027d364b9f", "scanner": "scanner-primary", "fingerprint": "4069bb9c1c1e4187", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ec54a1440964e5b8", "level": "note", "message": {"text": "Unused endpoint: POST /action"}, "properties": {"repobilityId": "03d1749f82634ba3", "scanner": "scanner-primary", "fingerprint": "ec54a1440964e5b8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8689973a0617995f", "level": "note", "message": {"text": "Unused endpoint: GET /text"}, "properties": {"repobilityId": "023abedce466a5bc", "scanner": "scanner-primary", "fingerprint": "8689973a0617995f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-19d931c8ba696e45", "level": "note", "message": {"text": "Unused endpoint: GET /fetch"}, "properties": {"repobilityId": "2dda59811216ae09", "scanner": "scanner-primary", "fingerprint": "19d931c8ba696e45", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-af75cdebd6061f00", "level": "note", "message": {"text": "Unused endpoint: GET /routes"}, "properties": {"repobilityId": "bfda8aef4c292f5e", "scanner": "scanner-primary", "fingerprint": "af75cdebd6061f00", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e2631495c43f2a81", "level": "note", "message": {"text": "Unused endpoint: GET /prices"}, "properties": {"repobilityId": "01fe258c4c70adfc", "scanner": "scanner-primary", "fingerprint": "e2631495c43f2a81", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-afc064028ae39ea9", "level": "note", "message": {"text": "Unused endpoint: GET /history"}, "properties": {"repobilityId": "0a45824fae5d9250", "scanner": "scanner-primary", "fingerprint": "afc064028ae39ea9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d0f253034e0113c2", "level": "note", "message": {"text": "Unused endpoint: GET /deals"}, "properties": {"repobilityId": "fc9af4a565354479", "scanner": "scanner-primary", "fingerprint": "d0f253034e0113c2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e1b7bee247ffc801", "level": "note", "message": {"text": "Unused endpoint: GET /summary"}, "properties": {"repobilityId": "9275a4df5df1cce3", "scanner": "scanner-primary", "fingerprint": "e1b7bee247ffc801", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-034336dc074efeb4", "level": "note", "message": {"text": "Unused endpoint: POST /routes"}, "properties": {"repobilityId": "f2b9e71317b94f69", "scanner": "scanner-primary", "fingerprint": "034336dc074efeb4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d2ae8e419af36116", "level": "note", "message": {"text": "Unused endpoint: DELETE /routes/{route_id}"}, "properties": {"repobilityId": "caadfdf2eb552e95", "scanner": "scanner-primary", "fingerprint": "d2ae8e419af36116", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f05c8bc0bf742f38", "level": "note", "message": {"text": "Unused endpoint: POST /check-now"}, "properties": {"repobilityId": "be06b63d259a6314", "scanner": "scanner-primary", "fingerprint": "f05c8bc0bf742f38", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cac559a1e936b87b", "level": "note", "message": {"text": "Unused endpoint: POST /scan-month"}, "properties": {"repobilityId": "b1913fd702cd11d8", "scanner": "scanner-primary", "fingerprint": "cac559a1e936b87b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0a46446ecf5abb68", "level": "note", "message": {"text": "Unused endpoint: GET /recipients"}, "properties": {"repobilityId": "7909ba04557f6847", "scanner": "scanner-primary", "fingerprint": "0a46446ecf5abb68", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1444c8b81047800f", "level": "note", "message": {"text": "Unused endpoint: POST /recipients/groups"}, "properties": {"repobilityId": "4adf6d39cd6d2a66", "scanner": "scanner-primary", "fingerprint": "1444c8b81047800f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8ba2c0b66cd2e859", "level": "note", "message": {"text": "Unused endpoint: DELETE /recipients/groups/{name}"}, "properties": {"repobilityId": "a2da6eb14687e5e4", "scanner": "scanner-primary", "fingerprint": "8ba2c0b66cd2e859", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2f222a275ed687b3", "level": "note", "message": {"text": "Unused endpoint: POST /send"}, "properties": {"repobilityId": "02e6fe2ee8bd98b0", "scanner": "scanner-primary", "fingerprint": "2f222a275ed687b3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ac4bde15380ba034", "level": "note", "message": {"text": "Unused endpoint: POST /send-voice"}, "properties": {"repobilityId": "3281c8734323f501", "scanner": "scanner-primary", "fingerprint": "ac4bde15380ba034", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0ae38010c60493f1", "level": "note", "message": {"text": "Unused endpoint: POST /webhook"}, "properties": {"repobilityId": "e79774109e3324c6", "scanner": "scanner-primary", "fingerprint": "0ae38010c60493f1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-deabe8398cd1084a", "level": "note", "message": {"text": "Unused endpoint: POST /webhook/{event_type:path}"}, "properties": {"repobilityId": "5585c7fe0183d420", "scanner": "scanner-primary", "fingerprint": "deabe8398cd1084a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-50207204ed781305", "level": "note", "message": {"text": "Unused endpoint: GET /goals"}, "properties": {"repobilityId": "07e1fe0792b37c12", "scanner": "scanner-primary", "fingerprint": "50207204ed781305", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-827392c0226680bd", "level": "note", "message": {"text": "Unused endpoint: POST /goals"}, "properties": {"repobilityId": "ae7c41aa68259758", "scanner": "scanner-primary", "fingerprint": "827392c0226680bd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-14524f93aef43d33", "level": "note", "message": {"text": "Unused endpoint: GET /goals/{goal_id}"}, "properties": {"repobilityId": "a3639e206cfe4877", "scanner": "scanner-primary", "fingerprint": "14524f93aef43d33", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bdd5c4430ca79530", "level": "note", "message": {"text": "Unused endpoint: PATCH /goals/{goal_id}"}, "properties": {"repobilityId": "64b8a783e05d2f22", "scanner": "scanner-primary", "fingerprint": "bdd5c4430ca79530", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8ff63a67ae08f4e2", "level": "note", "message": {"text": "Unused endpoint: DELETE /goals/{goal_id}"}, "properties": {"repobilityId": "c6a729400d07edf7", "scanner": "scanner-primary", "fingerprint": "8ff63a67ae08f4e2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4540d80a9cc83adc", "level": "note", "message": {"text": "Unused endpoint: POST /goals/{goal_id}/milestones"}, "properties": {"repobilityId": "4b1c268a5bf1dc73", "scanner": "scanner-primary", "fingerprint": "4540d80a9cc83adc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-089ba8c4e9d5cd39", "level": "note", "message": {"text": "Unused endpoint: GET /goals/{goal_id}/milestones"}, "properties": {"repobilityId": "797634cedeece076", "scanner": "scanner-primary", "fingerprint": "089ba8c4e9d5cd39", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-03ce9a5f5134a68b", "level": "note", "message": {"text": "Unused endpoint: POST /goals/{goal_id}/progress"}, "properties": {"repobilityId": "8ec6cc60eea0961f", "scanner": "scanner-primary", "fingerprint": "03ce9a5f5134a68b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-829e8bc9bbd4a911", "level": "note", "message": {"text": "Unused endpoint: GET /goals/{goal_id}/progress"}, "properties": {"repobilityId": "289888164304c292", "scanner": "scanner-primary", "fingerprint": "829e8bc9bbd4a911", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-621f858deaa3be43", "level": "note", "message": {"text": "Unused endpoint: GET /report"}, "properties": {"repobilityId": "b36f6e77299a69f9", "scanner": "scanner-primary", "fingerprint": "621f858deaa3be43", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-85be8dcaa08e6d0b", "level": "note", "message": {"text": "Unused endpoint: POST /auto-update"}, "properties": {"repobilityId": "362b3ec400c71402", "scanner": "scanner-primary", "fingerprint": "85be8dcaa08e6d0b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b8e741c1a92b87e8", "level": "note", "message": {"text": "Unused endpoint: POST /mood"}, "properties": {"repobilityId": "8e48431bc5343ce6", "scanner": "scanner-primary", "fingerprint": "b8e741c1a92b87e8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-99239cff157ecfa0", "level": "note", "message": {"text": "Unused endpoint: GET /mood"}, "properties": {"repobilityId": "b83e6a3b5aa54595", "scanner": "scanner-primary", "fingerprint": "99239cff157ecfa0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-72837ac2b53622f3", "level": "note", "message": {"text": "Unused endpoint: GET /mood/history"}, "properties": {"repobilityId": "153761aaf757ef20", "scanner": "scanner-primary", "fingerprint": "72837ac2b53622f3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0d2a6c406cc1e0b0", "level": "note", "message": {"text": "Unused endpoint: POST /journal"}, "properties": {"repobilityId": "b867c1f90d90f47a", "scanner": "scanner-primary", "fingerprint": "0d2a6c406cc1e0b0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4d0b75c541565cd9", "level": "note", "message": {"text": "Unused endpoint: GET /journal"}, "properties": {"repobilityId": "abae4284a9f1e6ed", "scanner": "scanner-primary", "fingerprint": "4d0b75c541565cd9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3735198b0dd64e7a", "level": "note", "message": {"text": "Unused endpoint: GET /journal/history"}, "properties": {"repobilityId": "fa36a1019659ad55", "scanner": "scanner-primary", "fingerprint": "3735198b0dd64e7a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3e770ff69e3f2bdb", "level": "note", "message": {"text": "Unused endpoint: GET /habit"}, "properties": {"repobilityId": "797e5d44e2899fbb", "scanner": "scanner-primary", "fingerprint": "3e770ff69e3f2bdb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c0b57bca914c98c9", "level": "note", "message": {"text": "Unused endpoint: POST /habit"}, "properties": {"repobilityId": "ddc2066e30dad69f", "scanner": "scanner-primary", "fingerprint": "c0b57bca914c98c9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d634056604698bd7", "level": "note", "message": {"text": "Unused endpoint: GET /collections"}, "properties": {"repobilityId": "62cf37e67560208a", "scanner": "scanner-primary", "fingerprint": "d634056604698bd7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9be43ec2e8c55a86", "level": "note", "message": {"text": "Unused endpoint: GET /programme"}, "properties": {"repobilityId": "f12e0dd786f405fe", "scanner": "scanner-primary", "fingerprint": "9be43ec2e8c55a86", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b9c041dc087ff77f", "level": "note", "message": {"text": "Unused endpoint: GET /today"}, "properties": {"repobilityId": "f671e9b4bda9ab50", "scanner": "scanner-primary", "fingerprint": "b9c041dc087ff77f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d504b80adc9409ec", "level": "note", "message": {"text": "Unused endpoint: GET /dashboard"}, "properties": {"repobilityId": "af6fa01007e316e7", "scanner": "scanner-primary", "fingerprint": "d504b80adc9409ec", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5e4cbdc24bbe3cc1", "level": "note", "message": {"text": "Unused endpoint: GET /weekly-review"}, "properties": {"repobilityId": "3e9892c832b84396", "scanner": "scanner-primary", "fingerprint": "5e4cbdc24bbe3cc1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}