{"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-5171a673140ab51c", "name": "Possibly dead Python function: require_paid_tier", "shortDescription": {"text": "Possibly dead Python function: require_paid_tier"}, "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-05d4d266bf548985", "name": "Possibly dead Python function: require_dev_tier", "shortDescription": {"text": "Possibly dead Python function: require_dev_tier"}, "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-59cf472b471f696a", "name": "Possibly dead Python function: require_bot_token", "shortDescription": {"text": "Possibly dead Python function: require_bot_token"}, "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-c1a3ca6ff4cc251f", "name": "Possibly dead Python function: fetch_roll_call", "shortDescription": {"text": "Possibly dead Python function: fetch_roll_call"}, "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-84d0d1616274b255", "name": "Possibly dead Python function: search_bills", "shortDescription": {"text": "Possibly dead Python function: search_bills"}, "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-14b06d1f208af645", "name": "Possibly dead Python function: handle_starttag", "shortDescription": {"text": "Possibly dead Python function: handle_starttag"}, "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-ba1debed578ab9b2", "name": "Possibly dead Python function: handle_endtag", "shortDescription": {"text": "Possibly dead Python function: handle_endtag"}, "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-40853f1af406b278", "name": "Possibly dead Python function: handle_data", "shortDescription": {"text": "Possibly dead Python function: handle_data"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fa23acfd155ae4d7", "name": "Possibly dead Python function: strip_title", "shortDescription": {"text": "Possibly dead Python function: strip_title"}, "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-2366b579cb559ac4", "name": "Possibly dead Python function: scrape_candidates", "shortDescription": {"text": "Possibly dead Python function: scrape_candidates"}, "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-8cfd4f6da87d4c68", "name": "Possibly dead Python function: process_one", "shortDescription": {"text": "Possibly dead Python function: process_one"}, "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-f67903b015eeaa28", "name": "Possibly dead Python function: regen", "shortDescription": {"text": "Possibly dead Python function: regen"}, "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-2a53acf85e67d7df", "name": "Possibly dead Python function: scrape_year_worker", "shortDescription": {"text": "Possibly dead Python function: scrape_year_worker"}, "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-e0dab6d7db4d2d14", "name": "Possibly dead Python function: search_batch", "shortDescription": {"text": "Possibly dead Python function: search_batch"}, "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-829dd2fca2b49ac1", "name": "Possibly dead Python function: process_one", "shortDescription": {"text": "Possibly dead Python function: process_one"}, "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-f96a016d4cca355e", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e64e0feb78821d4d", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bc3553e8ced55b35", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5e9374da553dd941", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-61c8c9930dac098e", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7175051e77e13ce6", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d4dc6c538ae12fa0", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa673d952a481ba8", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1ae8e50a2a4500cd", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3e7dffdc60260b08", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a55effc07f5d3ba9", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/app/[city]/insights/page.tsx:679", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/app/[city]/insights/page.tsx:679"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e080abdbc2dc02c7", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/app/[city]/insights/[year]/page.tsx:146", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/app/[city]/insights/[year]/page.tsx:146"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4c509bf610009da2", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/app/[city]/councilmembers/page.tsx:174", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/app/[city]/councilmembers/page.tsx:174"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-26f81a4a5b31533b", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/app/[city]/councilmembers/[id]/CouncilmemberDetailClient.t", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/app/[city]/councilmembers/[id]/CouncilmemberDetailClient.tsx:267"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-99d68ac9ef8c9011", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/app/[city]/legislation/page.tsx:368", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/app/[city]/legislation/page.tsx:368"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-69e7464f98f45ddf", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/app/[city]/legislation/[id]/BillDetailClient.tsx:136", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/app/[city]/legislation/[id]/BillDetailClient.tsx:136"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a05824988ca5c97f", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/app/admin/page.tsx:1341", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/app/admin/page.tsx:1341"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-63c8505b7e1769e7", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/Navbar.tsx:233", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/Navbar.tsx:233"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ae5ab6d020a4407f", "name": "Icon-only button without accessible name \u2014 frontend/components/insights/DrillDownPanel.tsx:88", "shortDescription": {"text": "Icon-only button without accessible name \u2014 frontend/components/insights/DrillDownPanel.tsx:88"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4d15e40af3812561", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/ui/multi-select.tsx:76", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/ui/multi-select.tsx:76"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d63da3583b14afc0", "name": "Dockerfile runs as root: Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-de3c1f217d72a063", "name": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a40ce73ac9f5c8fe", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/app/[city]/insights/[year]/page.tsx:146", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/app/[city]/insights/[year]/page.tsx:146"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e014add5b0a391cf", "name": "Insecure pattern 'local_storage_auth_token' in frontend/app/login/page.tsx:28", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/app/login/page.tsx:28"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c1b5cb0317e2c286", "name": "Insecure pattern 'local_storage_auth_token' in frontend/components/Navbar.tsx:78", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/components/Navbar.tsx:78"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d1eb01ba914f9a49", "name": "Very large file: app/api/legislation_routes.py (2816 lines)", "shortDescription": {"text": "Very large file: app/api/legislation_routes.py (2816 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-513a45fe24787596", "name": "Very large file: frontend/app/[city]/insights/page.tsx (1171 lines)", "shortDescription": {"text": "Very large file: frontend/app/[city]/insights/page.tsx (1171 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-2a9877fe7d13bb3b", "name": "Very large file: frontend/app/[city]/legislation/page.tsx (953 lines)", "shortDescription": {"text": "Very large file: frontend/app/[city]/legislation/page.tsx (953 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-119213d9c3233a4a", "name": "Very large file: frontend/app/[city]/legislation/[id]/BillDetailClient.tsx (1408 lines)", "shortDescription": {"text": "Very large file: frontend/app/[city]/legislation/[id]/BillDetailClient.tsx (1408 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-db1f2da52971491d", "name": "Very large file: frontend/app/admin/page.tsx (1906 lines)", "shortDescription": {"text": "Very large file: frontend/app/admin/page.tsx (1906 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "4 test file(s) for 143 source file(s) (ratio 0.03). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 138 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 27 placeholder/mock markers across 10 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-07c7d12a5d60a13a", "name": "Agent authority lacks a verifier contract: .claude/commands/fresh-start.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/commands/fresh-start.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-b95dc98fe5201d07", "name": "Agent authority lacks a verifier contract: .claude/commands/restart.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/commands/restart.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-f4874df4b0f18ce5", "name": "Agent authority lacks a verifier contract: .claude/commands/close.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/commands/close.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-28e785bac58756c8", "name": "Agent authority lacks a verifier contract: .claude/commands/publish.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/commands/publish.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-12bed5aac62a7906", "name": "Commented-code block (5 lines) in workers/bluesky_bot.py:38", "shortDescription": {"text": "Commented-code block (5 lines) in workers/bluesky_bot.py:38"}, "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-66b7e6fb420bbd3b", "name": "Blocking `urllib.request.urlopen(...)` inside `async def get_districts_geojson` \u2014 app/api/councilmember_routes.py:66", "shortDescription": {"text": "Blocking `urllib.request.urlopen(...)` inside `async def get_districts_geojson` \u2014 app/api/councilmember_routes.py:66"}, "fullDescription": {"text": "Sync I/O inside an async function blocks the event loop. While `urllib.request.urlopen(...)` 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-e406504afe9eb9b4", "name": "Legacy-named symbol `trigger_backup` in app/api/admin_routes.py:139", "shortDescription": {"text": "Legacy-named symbol `trigger_backup` in app/api/admin_routes.py:139"}, "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-df5119f7cac3828d", "name": "Commented-code block (5 lines) in app/models/database.py:92", "shortDescription": {"text": "Commented-code block (5 lines) in app/models/database.py:92"}, "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-b3c925948695d8c8", "name": "Commented-code block (5 lines) in app/services/legislation_service.py:507", "shortDescription": {"text": "Commented-code block (5 lines) in app/services/legislation_service.py:507"}, "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-e22d2c3d7beeb4b7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/app/[city]/councilmembers/page.tsx:92", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/app/[city]/councilmembers/page.tsx:92"}, "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-74b57cc9942faa78", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/app/[city]/legislation/[id]/BillDetailClient.tsx:258", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/app/[city]/legislation/[id]/BillDetailClient.tsx:258"}, "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-a683347f787431b1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/components/DistrictMap.tsx:92", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/components/DistrictMap.tsx:92"}, "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-ec32b7f54e2ec12b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/lib/api.ts:244", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/lib/api.ts:244"}, "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-030da566069872e9", "name": "15 env vars used in code but missing from .env.example", "shortDescription": {"text": "15 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `AI_BASE_URL`, `AI_MODEL`, `API_BASE`, `BOT_API_TOKEN`, `DB_PATH`, `NEXT_PUBLIC_BACKEND_URL`, `NEXT_PUBLIC_CITY_SLUG`, `NEXT_PUBLIC_POSTHOG_HOST` + 7 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-6297377883dd7783", "name": "Near-duplicate function bodies in 13 places", "shortDescription": {"text": "Near-duplicate function bodies in 13 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\napp/api/legislation_routes.py:generate_plain_titles, app/api/legislation_routes.py:gen, app/api/legislation_routes.py:gen, app/api/legislation_routes.py:gen\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-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:\napp/api/legislation_routes.py:generate_all_perspectives_bulk, app/api/legislation_routes.py:generate_all_perspectives\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:\napp/integrations/legistar_scraper.py:handle_data, app/integrations/legistar_scraper.py:handle_data, app/integrations/legistar_scraper.py:handle_data\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-49c98f7cedd9c977", "name": "Near-duplicate function bodies in 4 places", "shortDescription": {"text": "Near-duplicate function bodies in 4 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\napp/services/ai_provider.py:complete, app/services/ai_provider.py:complete, app/services/ai_provider.py:complete, app/services/ai_provider.py:complete\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-e3d170a5c7ce8a56", "name": "FastAPI POST `create_checkout` without auth dependency \u2014 app/api/donation_routes.py:34", "shortDescription": {"text": "FastAPI POST `create_checkout` without auth dependency \u2014 app/api/donation_routes.py:34"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-cd43328541931519", "name": "FastAPI POST `stripe_webhook` without auth dependency \u2014 app/api/donation_routes.py:94", "shortDescription": {"text": "FastAPI POST `stripe_webhook` without auth dependency \u2014 app/api/donation_routes.py:94"}, "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-ab6797f83f7d3376", "name": "FastAPI POST `dev_login` without auth dependency \u2014 app/api/auth_routes.py:172", "shortDescription": {"text": "FastAPI POST `dev_login` without auth dependency \u2014 app/api/auth_routes.py:172"}, "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-5423c4f1d0437d83", "name": "Dangling fetch: GET /data/legislative_history.json (frontend/app/[city]/insights/page.tsx:1041)", "shortDescription": {"text": "Dangling fetch: GET /data/legislative_history.json (frontend/app/[city]/insights/page.tsx:1041)"}, "fullDescription": {"text": "`frontend/app/[city]/insights/page.tsx:1041` calls `GET /data/legislative_history.json` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/data/legislative_history.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-924ff3fdeb5e9d89", "name": "Dangling fetch: GET /api/councilmembers/districts-geojson (frontend/app/[city]/councilmembers/page.tsx:92)", "shortDescription": {"text": "Dangling fetch: GET /api/councilmembers/districts-geojson (frontend/app/[city]/councilmembers/page.tsx:92)"}, "fullDescription": {"text": "`frontend/app/[city]/councilmembers/page.tsx:92` calls `GET /api/councilmembers/districts-geojson` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/councilmembers/districts-geojson`\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-ef1715b005e9ed0b", "name": "Dangling fetch: GET /api/councilmembers/districts-geojson (frontend/app/[city]/legislation/[id]/BillDetailClient.tsx:266", "shortDescription": {"text": "Dangling fetch: GET /api/councilmembers/districts-geojson (frontend/app/[city]/legislation/[id]/BillDetailClient.tsx:266)"}, "fullDescription": {"text": "`frontend/app/[city]/legislation/[id]/BillDetailClient.tsx:266` calls `GET /api/councilmembers/districts-geojson` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/councilmembers/districts-geojson`\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-2f72b3f51b82d63a", "name": "Dangling fetch: POST /api/auth/dev-login (frontend/app/login/page.tsx:25)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/dev-login (frontend/app/login/page.tsx:25)"}, "fullDescription": {"text": "`frontend/app/login/page.tsx:25` calls `POST /api/auth/dev-login` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/dev-login`\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-165d70d08d3de1d0", "name": "Dangling fetch: POST /api/auth/dev-login (frontend/components/Navbar.tsx:75)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/dev-login (frontend/components/Navbar.tsx:75)"}, "fullDescription": {"text": "`frontend/components/Navbar.tsx:75` calls `POST /api/auth/dev-login` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/dev-login`\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-04486f5971dad5c3", "name": "Dangling fetch: GET /api/legislation/export?${p.toString()} (frontend/lib/api.ts:244)", "shortDescription": {"text": "Dangling fetch: GET /api/legislation/export?${p.toString()} (frontend/lib/api.ts:244)"}, "fullDescription": {"text": "`frontend/lib/api.ts:244` calls `GET /api/legislation/export?${p.toString()}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/legislation/export`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`main.py` declares `GET /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8a13f5788b1cc6fe", "name": "Unused endpoint: GET /office-description", "shortDescription": {"text": "Unused endpoint: GET /office-description"}, "fullDescription": {"text": "`app/api/election_routes.py` declares `GET /office-description` 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-ab7ce0fa328c93ea", "name": "Unused endpoint: GET /candidates", "shortDescription": {"text": "Unused endpoint: GET /candidates"}, "fullDescription": {"text": "`app/api/election_routes.py` declares `GET /candidates` 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-6d74acd247cc9eb7", "name": "Unused endpoint: POST /candidates", "shortDescription": {"text": "Unused endpoint: POST /candidates"}, "fullDescription": {"text": "`app/api/election_routes.py` declares `POST /candidates` 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-58d764ef43abee15", "name": "Unused endpoint: PATCH /candidates/{candidate_id}", "shortDescription": {"text": "Unused endpoint: PATCH /candidates/{candidate_id}"}, "fullDescription": {"text": "`app/api/election_routes.py` declares `PATCH /candidates/{candidate_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-9bffb7ce0ca486d3", "name": "Unused endpoint: DELETE /candidates/{candidate_id}", "shortDescription": {"text": "Unused endpoint: DELETE /candidates/{candidate_id}"}, "fullDescription": {"text": "`app/api/election_routes.py` declares `DELETE /candidates/{candidate_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-70806e9ce848ad87", "name": "Unused endpoint: GET /predictions", "shortDescription": {"text": "Unused endpoint: GET /predictions"}, "fullDescription": {"text": "`app/api/election_routes.py` declares `GET /predictions` 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-7e0731b88b371366", "name": "Unused endpoint: POST /candidates/scrape", "shortDescription": {"text": "Unused endpoint: POST /candidates/scrape"}, "fullDescription": {"text": "`app/api/election_routes.py` declares `POST /candidates/scrape` 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-b0076bb59dca3103", "name": "Unused endpoint: DELETE /predictions", "shortDescription": {"text": "Unused endpoint: DELETE /predictions"}, "fullDescription": {"text": "`app/api/election_routes.py` declares `DELETE /predictions` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a6f48e60c30777ab", "name": "Unused endpoint: GET /config", "shortDescription": {"text": "Unused endpoint: GET /config"}, "fullDescription": {"text": "`app/api/donation_routes.py` declares `GET /config` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6385cd0e163a390f", "name": "Unused endpoint: POST /checkout", "shortDescription": {"text": "Unused endpoint: POST /checkout"}, "fullDescription": {"text": "`app/api/donation_routes.py` declares `POST /checkout` 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": "`app/api/donation_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-0ae38010c60493f1", "name": "Unused endpoint: POST /webhook", "shortDescription": {"text": "Unused endpoint: POST /webhook"}, "fullDescription": {"text": "`app/api/donation_routes.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-5df81936da990c64", "name": "Unused endpoint: GET /districts-geojson", "shortDescription": {"text": "Unused endpoint: GET /districts-geojson"}, "fullDescription": {"text": "`app/api/councilmember_routes.py` declares `GET /districts-geojson` 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-1b3864a65ef75a85", "name": "Unused endpoint: POST /backfill-emails", "shortDescription": {"text": "Unused endpoint: POST /backfill-emails"}, "fullDescription": {"text": "`app/api/councilmember_routes.py` declares `POST /backfill-emails` 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-ab8b3c68308c92da", "name": "Unused endpoint: POST /scrape", "shortDescription": {"text": "Unused endpoint: POST /scrape"}, "fullDescription": {"text": "`app/api/councilmember_routes.py` declares `POST /scrape` 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-c777779439f08b59", "name": "Unused endpoint: GET /{member_id}", "shortDescription": {"text": "Unused endpoint: GET /{member_id}"}, "fullDescription": {"text": "`app/api/councilmember_routes.py` declares `GET /{member_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-fba533be224fed7c", "name": "Unused endpoint: GET /{member_id}/legislative-profile", "shortDescription": {"text": "Unused endpoint: GET /{member_id}/legislative-profile"}, "fullDescription": {"text": "`app/api/councilmember_routes.py` declares `GET /{member_id}/legislative-profile` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c79feff2775334b7", "name": "Unused endpoint: GET /{member_id}/votes", "shortDescription": {"text": "Unused endpoint: GET /{member_id}/votes"}, "fullDescription": {"text": "`app/api/councilmember_routes.py` declares `GET /{member_id}/votes` 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-3d846e7f13e3a255", "name": "Unused endpoint: POST /{member_id}/vote", "shortDescription": {"text": "Unused endpoint: POST /{member_id}/vote"}, "fullDescription": {"text": "`app/api/councilmember_routes.py` declares `POST /{member_id}/vote` 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-8080eead19eee8a5", "name": "Unused endpoint: GET /{member_id}/vote-history", "shortDescription": {"text": "Unused endpoint: GET /{member_id}/vote-history"}, "fullDescription": {"text": "`app/api/councilmember_routes.py` declares `GET /{member_id}/vote-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-7ce17d6b092a81ca", "name": "Unused endpoint: POST /refresh", "shortDescription": {"text": "Unused endpoint: POST /refresh"}, "fullDescription": {"text": "`app/api/hearings_routes.py` declares `POST /refresh` 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-a04ab6ee7ac183fa", "name": "Unused endpoint: GET /stream/refresh", "shortDescription": {"text": "Unused endpoint: GET /stream/refresh"}, "fullDescription": {"text": "`app/api/hearings_routes.py` declares `GET /stream/refresh` 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-49a63852e7dabded", "name": "Unused endpoint: GET /upcoming", "shortDescription": {"text": "Unused endpoint: GET /upcoming"}, "fullDescription": {"text": "`app/api/hearings_routes.py` declares `GET /upcoming` 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-2433478424a76226", "name": "Unused endpoint: POST /ingest/federal", "shortDescription": {"text": "Unused endpoint: POST /ingest/federal"}, "fullDescription": {"text": "`app/api/legislation_routes.py` declares `POST /ingest/federal` 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-6235bebfe1b4fd9a", "name": "Unused endpoint: POST /ingest/state/{state}", "shortDescription": {"text": "Unused endpoint: POST /ingest/state/{state}"}, "fullDescription": {"text": "`app/api/legislation_routes.py` declares `POST /ingest/state/{state}` 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-4dafae593ed55854", "name": "Unused endpoint: POST /ingest/local/{city}", "shortDescription": {"text": "Unused endpoint: POST /ingest/local/{city}"}, "fullDescription": {"text": "`app/api/legislation_routes.py` declares `POST /ingest/local/{city}` 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-d682e1d215955e6a", "name": "Unused endpoint: GET /list", "shortDescription": {"text": "Unused endpoint: GET /list"}, "fullDescription": {"text": "`app/api/legislation_routes.py` declares `GET /list` 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-217b23a219c9f8d5", "name": "Unused endpoint: GET /tag-counts", "shortDescription": {"text": "Unused endpoint: GET /tag-counts"}, "fullDescription": {"text": "`app/api/legislation_routes.py` declares `GET /tag-counts` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8d11b1c17c1c58c6", "name": "Unused endpoint: GET /facets", "shortDescription": {"text": "Unused endpoint: GET /facets"}, "fullDescription": {"text": "`app/api/legislation_routes.py` declares `GET /facets` 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-f5e44059d74979c4", "name": "Unused endpoint: GET /year-counts", "shortDescription": {"text": "Unused endpoint: GET /year-counts"}, "fullDescription": {"text": "`app/api/legislation_routes.py` declares `GET /year-counts` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3bf54ddd990de3fe", "name": "Unused endpoint: GET /month-counts", "shortDescription": {"text": "Unused endpoint: GET /month-counts"}, "fullDescription": {"text": "`app/api/legislation_routes.py` declares `GET /month-counts` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5d6e2a62d2d0d400", "name": "Unused endpoint: GET /count", "shortDescription": {"text": "Unused endpoint: GET /count"}, "fullDescription": {"text": "`app/api/legislation_routes.py` declares `GET /count` 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-e686634beeea0bb8", "name": "Unused endpoint: GET /export", "shortDescription": {"text": "Unused endpoint: GET /export"}, "fullDescription": {"text": "`app/api/legislation_routes.py` declares `GET /export` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-63d6f80e05d5ba22", "name": "Unused endpoint: GET /sitemap-ids", "shortDescription": {"text": "Unused endpoint: GET /sitemap-ids"}, "fullDescription": {"text": "`app/api/legislation_routes.py` declares `GET /sitemap-ids` 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-d16e4fa529c520e9", "name": "Unused endpoint: GET /search", "shortDescription": {"text": "Unused endpoint: GET /search"}, "fullDescription": {"text": "`app/api/legislation_routes.py` declares `GET /search` 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-e2c335bcb2974c58", "name": "Unused endpoint: GET /spotlight", "shortDescription": {"text": "Unused endpoint: GET /spotlight"}, "fullDescription": {"text": "`app/api/legislation_routes.py` declares `GET /spotlight` 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-2a0baa3183ec2b4f", "name": "Unused endpoint: GET /pipeline-stats", "shortDescription": {"text": "Unused endpoint: GET /pipeline-stats"}, "fullDescription": {"text": "`app/api/legislation_routes.py` declares `GET /pipeline-stats` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5f78b4c8810bdb2f", "name": "Unused endpoint: POST /plain-titles", "shortDescription": {"text": "Unused endpoint: POST /plain-titles"}, "fullDescription": {"text": "`app/api/legislation_routes.py` declares `POST /plain-titles` 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-92b220feaa1cc169", "name": "Unused endpoint: POST /sync-statuses", "shortDescription": {"text": "Unused endpoint: POST /sync-statuses"}, "fullDescription": {"text": "`app/api/legislation_routes.py` declares `POST /sync-statuses` 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-f8e4a6a7a7168398", "name": "Unused endpoint: POST /tag-all", "shortDescription": {"text": "Unused endpoint: POST /tag-all"}, "fullDescription": {"text": "`app/api/legislation_routes.py` declares `POST /tag-all` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-85fad678eab4c6c2", "name": "Unused endpoint: POST /bluesky/record-post", "shortDescription": {"text": "Unused endpoint: POST /bluesky/record-post"}, "fullDescription": {"text": "`app/api/legislation_routes.py` declares `POST /bluesky/record-post` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-81990e6e6f78627f", "name": "Unused endpoint: GET /bluesky/posts-to-track", "shortDescription": {"text": "Unused endpoint: GET /bluesky/posts-to-track"}, "fullDescription": {"text": "`app/api/legislation_routes.py` declares `GET /bluesky/posts-to-track` 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-0068a1ca08195025", "name": "Unused endpoint: POST /bluesky/update-engagement", "shortDescription": {"text": "Unused endpoint: POST /bluesky/update-engagement"}, "fullDescription": {"text": "`app/api/legislation_routes.py` declares `POST /bluesky/update-engagement` 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-72af3d7dd49975ba", "name": "Unused endpoint: POST /generate-ledes", "shortDescription": {"text": "Unused endpoint: POST /generate-ledes"}, "fullDescription": {"text": "`app/api/legislation_routes.py` declares `POST /generate-ledes` 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-9457ceba7284efcd", "name": "Unused endpoint: POST /generate-headlines", "shortDescription": {"text": "Unused endpoint: POST /generate-headlines"}, "fullDescription": {"text": "`app/api/legislation_routes.py` declares `POST /generate-headlines` 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-e0824cc633bd24bf", "name": "Unused endpoint: POST /fetch-news-all", "shortDescription": {"text": "Unused endpoint: POST /fetch-news-all"}, "fullDescription": {"text": "`app/api/legislation_routes.py` declares `POST /fetch-news-all` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-950eb430009315f0", "name": "Unused endpoint: POST /analyze-all", "shortDescription": {"text": "Unused endpoint: POST /analyze-all"}, "fullDescription": {"text": "`app/api/legislation_routes.py` declares `POST /analyze-all` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7dffd55a19ce8b4d", "name": "Unused endpoint: POST /generate-all-perspectives", "shortDescription": {"text": "Unused endpoint: POST /generate-all-perspectives"}, "fullDescription": {"text": "`app/api/legislation_routes.py` declares `POST /generate-all-perspectives` 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-ba2a77daa036c569", "name": "Unused endpoint: POST /backfill-vote-records", "shortDescription": {"text": "Unused endpoint: POST /backfill-vote-records"}, "fullDescription": {"text": "`app/api/legislation_routes.py` declares `POST /backfill-vote-records` 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/24793"}, "properties": {"repository": "cainesventures/Common_Ground", "repoUrl": "https://github.com/cainesventures/Common_Ground", "branch": "main"}, "results": [{"ruleId": "scanner-5171a673140ab51c", "level": "note", "message": {"text": "Possibly dead Python function: require_paid_tier"}, "properties": {"repobilityId": "b92e7df93b3b8cdc", "scanner": "scanner-primary", "fingerprint": "5171a673140ab51c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/auth.py:75"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-05d4d266bf548985", "level": "note", "message": {"text": "Possibly dead Python function: require_dev_tier"}, "properties": {"repobilityId": "07c77151e94c306e", "scanner": "scanner-primary", "fingerprint": "05d4d266bf548985", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/auth.py:96"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-59cf472b471f696a", "level": "note", "message": {"text": "Possibly dead Python function: require_bot_token"}, "properties": {"repobilityId": "0389b0bc5c8442d4", "scanner": "scanner-primary", "fingerprint": "59cf472b471f696a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/auth.py:106"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c1a3ca6ff4cc251f", "level": "note", "message": {"text": "Possibly dead Python function: fetch_roll_call"}, "properties": {"repobilityId": "2c4d0442b7078b22", "scanner": "scanner-primary", "fingerprint": "c1a3ca6ff4cc251f", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/integrations/legistar.py:95"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-84d0d1616274b255", "level": "note", "message": {"text": "Possibly dead Python function: search_bills"}, "properties": {"repobilityId": "41bfa615c1f688ee", "scanner": "scanner-primary", "fingerprint": "84d0d1616274b255", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/integrations/congress_gov.py:97"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-14b06d1f208af645", "level": "note", "message": {"text": "Possibly dead Python function: handle_starttag"}, "properties": {"repobilityId": "3bf216d149959ebf", "scanner": "scanner-primary", "fingerprint": "14b06d1f208af645", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/integrations/legistar_scraper.py:563"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ba1debed578ab9b2", "level": "note", "message": {"text": "Possibly dead Python function: handle_endtag"}, "properties": {"repobilityId": "7eb6f3decafc1766", "scanner": "scanner-primary", "fingerprint": "ba1debed578ab9b2", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/integrations/legistar_scraper.py:167"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-40853f1af406b278", "level": "note", "message": {"text": "Possibly dead Python function: handle_data"}, "properties": {"repobilityId": "3a673a278f4fc1e6", "scanner": "scanner-primary", "fingerprint": "40853f1af406b278", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/integrations/legistar_scraper.py:611"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-fa23acfd155ae4d7", "level": "note", "message": {"text": "Possibly dead Python function: strip_title"}, "properties": {"repobilityId": "3a578362cbc4cf9d", "scanner": "scanner-primary", "fingerprint": "fa23acfd155ae4d7", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/services/name_matching.py:40"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2366b579cb559ac4", "level": "note", "message": {"text": "Possibly dead Python function: scrape_candidates"}, "properties": {"repobilityId": "99dbf7dbd13b099e", "scanner": "scanner-primary", "fingerprint": "2366b579cb559ac4", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/services/candidate_scraper.py:98"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8cfd4f6da87d4c68", "level": "note", "message": {"text": "Possibly dead Python function: process_one"}, "properties": {"repobilityId": "f20ef17c8037cd3c", "scanner": "scanner-primary", "fingerprint": "8cfd4f6da87d4c68", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/worker_core.py:142"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f67903b015eeaa28", "level": "note", "message": {"text": "Possibly dead Python function: regen"}, "properties": {"repobilityId": "ce8d6c59d865b969", "scanner": "scanner-primary", "fingerprint": "f67903b015eeaa28", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/fix_ledes.py:121"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2a53acf85e67d7df", "level": "note", "message": {"text": "Possibly dead Python function: scrape_year_worker"}, "properties": {"repobilityId": "e3015ac34e2124c0", "scanner": "scanner-primary", "fingerprint": "2a53acf85e67d7df", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/recover_missing_urls.py:141"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e0dab6d7db4d2d14", "level": "note", "message": {"text": "Possibly dead Python function: search_batch"}, "properties": {"repobilityId": "b6ccd5c650ede925", "scanner": "scanner-primary", "fingerprint": "e0dab6d7db4d2d14", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/recover_missing_urls.py:200"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-829dd2fca2b49ac1", "level": "note", "message": {"text": "Possibly dead Python function: process_one"}, "properties": {"repobilityId": "f20ef17c8037cd3c", "scanner": "scanner-primary", "fingerprint": "829dd2fca2b49ac1", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/worker.py:113"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f96a016d4cca355e", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "f96a016d4cca355e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "alembic/versions/b3c4d5e6f7a8_add_city_to_legislation.py:31"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e64e0feb78821d4d", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "e64e0feb78821d4d", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "alembic/versions/a1b2c3d4e5f6_add_hearing_columns.py:24"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bc3553e8ced55b35", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "bc3553e8ced55b35", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "alembic/versions/a2f8c3d91e04_subscription_tier_and_participant_settings.py:46"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5e9374da553dd941", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "5e9374da553dd941", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "alembic/versions/c5b1a7160033_initial_schema.py:168"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-61c8c9930dac098e", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "61c8c9930dac098e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "alembic/versions/cb9156b2305c_add_created_by_user_id_to_debates.py:51"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7175051e77e13ce6", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "7175051e77e13ce6", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "alembic/versions/d4e2f1a09b37_add_argument_variants.py:33"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d4dc6c538ae12fa0", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "d4dc6c538ae12fa0", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "alembic/versions/e7a3c9d02f81_add_sponsor_party_state.py:33"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-aa673d952a481ba8", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "aa673d952a481ba8", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "alembic/versions/e861ec7b1a2a_drop_debate_engine_tables.py:62"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1ae8e50a2a4500cd", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "1ae8e50a2a4500cd", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "alembic/versions/eb99427523d3_councilmember_extended_fields.py:30"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3e7dffdc60260b08", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "3e7dffdc60260b08", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "alembic/versions/55a36372d8b9_add_councilmember_votes_and_fix_indexes.py:57"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a55effc07f5d3ba9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/app/[city]/insights/page.tsx:679"}, "properties": {"repobilityId": "35468688e5924d10", "scanner": "scanner-primary", "fingerprint": "a55effc07f5d3ba9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e080abdbc2dc02c7", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/app/[city]/insights/[year]/page.tsx:146"}, "properties": {"repobilityId": "b15d75524cc85bf5", "scanner": "scanner-primary", "fingerprint": "e080abdbc2dc02c7", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-4c509bf610009da2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/app/[city]/councilmembers/page.tsx:174"}, "properties": {"repobilityId": "fae052b672dee031", "scanner": "scanner-primary", "fingerprint": "4c509bf610009da2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-26f81a4a5b31533b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/app/[city]/councilmembers/[id]/CouncilmemberDetailClient.tsx:267"}, "properties": {"repobilityId": "381c96ab5d4c195a", "scanner": "scanner-primary", "fingerprint": "26f81a4a5b31533b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-99d68ac9ef8c9011", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/app/[city]/legislation/page.tsx:368"}, "properties": {"repobilityId": "e97e81e7d24c700b", "scanner": "scanner-primary", "fingerprint": "99d68ac9ef8c9011", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-69e7464f98f45ddf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/app/[city]/legislation/[id]/BillDetailClient.tsx:136"}, "properties": {"repobilityId": "e9aae7bec362df96", "scanner": "scanner-primary", "fingerprint": "69e7464f98f45ddf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a05824988ca5c97f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/app/admin/page.tsx:1341"}, "properties": {"repobilityId": "306ab1518ad29c66", "scanner": "scanner-primary", "fingerprint": "a05824988ca5c97f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-63c8505b7e1769e7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/Navbar.tsx:233"}, "properties": {"repobilityId": "67dbf2863d1d1950", "scanner": "scanner-primary", "fingerprint": "63c8505b7e1769e7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ae5ab6d020a4407f", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 frontend/components/insights/DrillDownPanel.tsx:88"}, "properties": {"repobilityId": "51596dd78fd6d51e", "scanner": "scanner-primary", "fingerprint": "ae5ab6d020a4407f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-4d15e40af3812561", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/ui/multi-select.tsx:76"}, "properties": {"repobilityId": "378cb361848c811e", "scanner": "scanner-primary", "fingerprint": "4d15e40af3812561", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d63da3583b14afc0", "level": "warning", "message": {"text": "Dockerfile runs as root: Dockerfile"}, "properties": {"repobilityId": "a2ed1bd120e507db", "scanner": "scanner-primary", "fingerprint": "d63da3583b14afc0", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-de3c1f217d72a063", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim"}, "properties": {"repobilityId": "1de0ecd007803dbd", "scanner": "scanner-primary", "fingerprint": "de3c1f217d72a063", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a40ce73ac9f5c8fe", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/app/[city]/insights/[year]/page.tsx:146"}, "properties": {"repobilityId": "406b87c7524ac066", "scanner": "scanner-primary", "fingerprint": "a40ce73ac9f5c8fe", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/app/[city]/insights/[year]/page.tsx"}, "region": {"startLine": 146}}}]}, {"ruleId": "scanner-e014add5b0a391cf", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/app/login/page.tsx:28"}, "properties": {"repobilityId": "2ae6aafb92701684", "scanner": "scanner-primary", "fingerprint": "e014add5b0a391cf", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/app/login/page.tsx"}, "region": {"startLine": 28}}}]}, {"ruleId": "scanner-c1b5cb0317e2c286", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/components/Navbar.tsx:78"}, "properties": {"repobilityId": "98cf5c11e932b146", "scanner": "scanner-primary", "fingerprint": "c1b5cb0317e2c286", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/components/Navbar.tsx"}, "region": {"startLine": 78}}}]}, {"ruleId": "scanner-d1eb01ba914f9a49", "level": "note", "message": {"text": "Very large file: app/api/legislation_routes.py (2816 lines)"}, "properties": {"repobilityId": "b97b207198c4da3f", "scanner": "scanner-primary", "fingerprint": "d1eb01ba914f9a49", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-513a45fe24787596", "level": "note", "message": {"text": "Very large file: frontend/app/[city]/insights/page.tsx (1171 lines)"}, "properties": {"repobilityId": "a2e11b01f1d59435", "scanner": "scanner-primary", "fingerprint": "513a45fe24787596", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-2a9877fe7d13bb3b", "level": "note", "message": {"text": "Very large file: frontend/app/[city]/legislation/page.tsx (953 lines)"}, "properties": {"repobilityId": "31611f3f0d71b6da", "scanner": "scanner-primary", "fingerprint": "2a9877fe7d13bb3b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-119213d9c3233a4a", "level": "note", "message": {"text": "Very large file: frontend/app/[city]/legislation/[id]/BillDetailClient.tsx (1408 lines)"}, "properties": {"repobilityId": "548ab691077f836d", "scanner": "scanner-primary", "fingerprint": "119213d9c3233a4a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-db1f2da52971491d", "level": "note", "message": {"text": "Very large file: frontend/app/admin/page.tsx (1906 lines)"}, "properties": {"repobilityId": "7e55bc30e1c18467", "scanner": "scanner-primary", "fingerprint": "db1f2da52971491d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "acefb90b760f96fa", "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": "664081ea35cb00c3", "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": "d137f17b3a14fb9d", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-07c7d12a5d60a13a", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/commands/fresh-start.md"}, "properties": {"repobilityId": "82578661c8ecfb6a", "scanner": "scanner-primary", "fingerprint": "07c7d12a5d60a13a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/commands/fresh-start.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b95dc98fe5201d07", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/commands/restart.md"}, "properties": {"repobilityId": "0e07c4c4491f8f39", "scanner": "scanner-primary", "fingerprint": "b95dc98fe5201d07", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/commands/restart.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f4874df4b0f18ce5", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/commands/close.md"}, "properties": {"repobilityId": "dac3647503ed2f75", "scanner": "scanner-primary", "fingerprint": "f4874df4b0f18ce5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/commands/close.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-28e785bac58756c8", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/commands/publish.md"}, "properties": {"repobilityId": "57b784523147fc6b", "scanner": "scanner-primary", "fingerprint": "28e785bac58756c8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/commands/publish.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-12bed5aac62a7906", "level": "none", "message": {"text": "Commented-code block (5 lines) in workers/bluesky_bot.py:38"}, "properties": {"repobilityId": "5c85943ae16a1368", "scanner": "scanner-primary", "fingerprint": "12bed5aac62a7906", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-66b7e6fb420bbd3b", "level": "error", "message": {"text": "Blocking `urllib.request.urlopen(...)` inside `async def get_districts_geojson` \u2014 app/api/councilmember_routes.py:66"}, "properties": {"repobilityId": "b186bfd652725839", "scanner": "scanner-primary", "fingerprint": "66b7e6fb420bbd3b", "layer": "quality", "severity": "high", "confidence": 1.0, "tags": ["integrity", "sync-io-in-async", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/api/councilmember_routes.py"}, "region": {"startLine": 66}}}]}, {"ruleId": "scanner-e406504afe9eb9b4", "level": "note", "message": {"text": "Legacy-named symbol `trigger_backup` in app/api/admin_routes.py:139"}, "properties": {"repobilityId": "d744e31af4d57d28", "scanner": "scanner-primary", "fingerprint": "e406504afe9eb9b4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-df5119f7cac3828d", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/models/database.py:92"}, "properties": {"repobilityId": "9cd45badc30749d1", "scanner": "scanner-primary", "fingerprint": "df5119f7cac3828d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b3c925948695d8c8", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/services/legislation_service.py:507"}, "properties": {"repobilityId": "9867dc68d01a1af8", "scanner": "scanner-primary", "fingerprint": "b3c925948695d8c8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e22d2c3d7beeb4b7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/app/[city]/councilmembers/page.tsx:92"}, "properties": {"repobilityId": "5158b5b179ccb79f", "scanner": "scanner-primary", "fingerprint": "e22d2c3d7beeb4b7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-74b57cc9942faa78", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/app/[city]/legislation/[id]/BillDetailClient.tsx:258"}, "properties": {"repobilityId": "96e054d5d09ae50c", "scanner": "scanner-primary", "fingerprint": "74b57cc9942faa78", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a683347f787431b1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/components/DistrictMap.tsx:92"}, "properties": {"repobilityId": "892c21cf9dd6208b", "scanner": "scanner-primary", "fingerprint": "a683347f787431b1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ec32b7f54e2ec12b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/lib/api.ts:244"}, "properties": {"repobilityId": "08a70e53c6997dd7", "scanner": "scanner-primary", "fingerprint": "ec32b7f54e2ec12b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-030da566069872e9", "level": "note", "message": {"text": "15 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "0519c1c0e8c1f8e4", "scanner": "scanner-primary", "fingerprint": "030da566069872e9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-6297377883dd7783", "level": "note", "message": {"text": "Near-duplicate function bodies in 13 places"}, "properties": {"repobilityId": "64191cf603f5f98a", "scanner": "scanner-primary", "fingerprint": "6297377883dd7783", "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": "2dd6cc76c526f0a3", "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": "04efef6105458cb2", "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": "7ec498f484db065f", "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": "2d0718c4c4001dc8", "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": "e00bd99e4bef83df", "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": "50602f614ec0c134", "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": "192fdb416a5b7560", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "9589b41631525b02", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-e3d170a5c7ce8a56", "level": "error", "message": {"text": "FastAPI POST `create_checkout` without auth dependency \u2014 app/api/donation_routes.py:34"}, "properties": {"repobilityId": "23c718edada17ab8", "scanner": "scanner-primary", "fingerprint": "e3d170a5c7ce8a56", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/api/donation_routes.py"}, "region": {"startLine": 34}}}]}, {"ruleId": "scanner-cd43328541931519", "level": "error", "message": {"text": "FastAPI POST `stripe_webhook` without auth dependency \u2014 app/api/donation_routes.py:94"}, "properties": {"repobilityId": "503286908f7560cb", "scanner": "scanner-primary", "fingerprint": "cd43328541931519", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/api/donation_routes.py"}, "region": {"startLine": 94}}}]}, {"ruleId": "scanner-ab6797f83f7d3376", "level": "error", "message": {"text": "FastAPI POST `dev_login` without auth dependency \u2014 app/api/auth_routes.py:172"}, "properties": {"repobilityId": "88ed7240f8a351e1", "scanner": "scanner-primary", "fingerprint": "ab6797f83f7d3376", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/api/auth_routes.py"}, "region": {"startLine": 172}}}]}, {"ruleId": "scanner-5423c4f1d0437d83", "level": "error", "message": {"text": "Dangling fetch: GET /data/legislative_history.json (frontend/app/[city]/insights/page.tsx:1041)"}, "properties": {"repobilityId": "b21351f31f10a987", "scanner": "scanner-primary", "fingerprint": "5423c4f1d0437d83", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-924ff3fdeb5e9d89", "level": "error", "message": {"text": "Dangling fetch: GET /api/councilmembers/districts-geojson (frontend/app/[city]/councilmembers/page.tsx:92)"}, "properties": {"repobilityId": "e300e2607ea11cb4", "scanner": "scanner-primary", "fingerprint": "924ff3fdeb5e9d89", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ef1715b005e9ed0b", "level": "error", "message": {"text": "Dangling fetch: GET /api/councilmembers/districts-geojson (frontend/app/[city]/legislation/[id]/BillDetailClient.tsx:266)"}, "properties": {"repobilityId": "9b35e653461a3683", "scanner": "scanner-primary", "fingerprint": "ef1715b005e9ed0b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2f72b3f51b82d63a", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/dev-login (frontend/app/login/page.tsx:25)"}, "properties": {"repobilityId": "b06a18cd5f787fcf", "scanner": "scanner-primary", "fingerprint": "2f72b3f51b82d63a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-165d70d08d3de1d0", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/dev-login (frontend/components/Navbar.tsx:75)"}, "properties": {"repobilityId": "77f105dacb9b41ad", "scanner": "scanner-primary", "fingerprint": "165d70d08d3de1d0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-04486f5971dad5c3", "level": "error", "message": {"text": "Dangling fetch: GET /api/legislation/export?${p.toString()} (frontend/lib/api.ts:244)"}, "properties": {"repobilityId": "cbcf414f69ce1a49", "scanner": "scanner-primary", "fingerprint": "04486f5971dad5c3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "6b8de433dc23649f", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8a13f5788b1cc6fe", "level": "note", "message": {"text": "Unused endpoint: GET /office-description"}, "properties": {"repobilityId": "550c1c0eb88b741a", "scanner": "scanner-primary", "fingerprint": "8a13f5788b1cc6fe", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ab7ce0fa328c93ea", "level": "note", "message": {"text": "Unused endpoint: GET /candidates"}, "properties": {"repobilityId": "586d777935883fa3", "scanner": "scanner-primary", "fingerprint": "ab7ce0fa328c93ea", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6d74acd247cc9eb7", "level": "note", "message": {"text": "Unused endpoint: POST /candidates"}, "properties": {"repobilityId": "ecf905606f063c8a", "scanner": "scanner-primary", "fingerprint": "6d74acd247cc9eb7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-58d764ef43abee15", "level": "note", "message": {"text": "Unused endpoint: PATCH /candidates/{candidate_id}"}, "properties": {"repobilityId": "96fe7ba9e98df541", "scanner": "scanner-primary", "fingerprint": "58d764ef43abee15", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9bffb7ce0ca486d3", "level": "note", "message": {"text": "Unused endpoint: DELETE /candidates/{candidate_id}"}, "properties": {"repobilityId": "309035db4a6e84a4", "scanner": "scanner-primary", "fingerprint": "9bffb7ce0ca486d3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-70806e9ce848ad87", "level": "note", "message": {"text": "Unused endpoint: GET /predictions"}, "properties": {"repobilityId": "dfaa600ba771b24f", "scanner": "scanner-primary", "fingerprint": "70806e9ce848ad87", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7e0731b88b371366", "level": "note", "message": {"text": "Unused endpoint: POST /candidates/scrape"}, "properties": {"repobilityId": "605bd38e35627f7f", "scanner": "scanner-primary", "fingerprint": "7e0731b88b371366", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b0076bb59dca3103", "level": "note", "message": {"text": "Unused endpoint: DELETE /predictions"}, "properties": {"repobilityId": "4dc2c092cc0127c2", "scanner": "scanner-primary", "fingerprint": "b0076bb59dca3103", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a6f48e60c30777ab", "level": "note", "message": {"text": "Unused endpoint: GET /config"}, "properties": {"repobilityId": "6a4ee44c16567496", "scanner": "scanner-primary", "fingerprint": "a6f48e60c30777ab", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6385cd0e163a390f", "level": "note", "message": {"text": "Unused endpoint: POST /checkout"}, "properties": {"repobilityId": "3ad7ca672b30eac4", "scanner": "scanner-primary", "fingerprint": "6385cd0e163a390f", "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": "f7ac6a0f47866f33", "scanner": "scanner-primary", "fingerprint": "08869e94d02e3c11", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0ae38010c60493f1", "level": "note", "message": {"text": "Unused endpoint: POST /webhook"}, "properties": {"repobilityId": "2af0096f278c7648", "scanner": "scanner-primary", "fingerprint": "0ae38010c60493f1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5df81936da990c64", "level": "note", "message": {"text": "Unused endpoint: GET /districts-geojson"}, "properties": {"repobilityId": "a54c131e1e55e025", "scanner": "scanner-primary", "fingerprint": "5df81936da990c64", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1b3864a65ef75a85", "level": "note", "message": {"text": "Unused endpoint: POST /backfill-emails"}, "properties": {"repobilityId": "cc94713bdad82dd4", "scanner": "scanner-primary", "fingerprint": "1b3864a65ef75a85", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ab8b3c68308c92da", "level": "note", "message": {"text": "Unused endpoint: POST /scrape"}, "properties": {"repobilityId": "e0a68ca739c5be85", "scanner": "scanner-primary", "fingerprint": "ab8b3c68308c92da", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c777779439f08b59", "level": "note", "message": {"text": "Unused endpoint: GET /{member_id}"}, "properties": {"repobilityId": "64a519d12cd0b952", "scanner": "scanner-primary", "fingerprint": "c777779439f08b59", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fba533be224fed7c", "level": "note", "message": {"text": "Unused endpoint: GET /{member_id}/legislative-profile"}, "properties": {"repobilityId": "b7c94bfbfd1939ae", "scanner": "scanner-primary", "fingerprint": "fba533be224fed7c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c79feff2775334b7", "level": "note", "message": {"text": "Unused endpoint: GET /{member_id}/votes"}, "properties": {"repobilityId": "2035cd5e4264b98b", "scanner": "scanner-primary", "fingerprint": "c79feff2775334b7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3d846e7f13e3a255", "level": "note", "message": {"text": "Unused endpoint: POST /{member_id}/vote"}, "properties": {"repobilityId": "54746ecafa2548b4", "scanner": "scanner-primary", "fingerprint": "3d846e7f13e3a255", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8080eead19eee8a5", "level": "note", "message": {"text": "Unused endpoint: GET /{member_id}/vote-history"}, "properties": {"repobilityId": "520d9b57ede71386", "scanner": "scanner-primary", "fingerprint": "8080eead19eee8a5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7ce17d6b092a81ca", "level": "note", "message": {"text": "Unused endpoint: POST /refresh"}, "properties": {"repobilityId": "52ce40e22f67a656", "scanner": "scanner-primary", "fingerprint": "7ce17d6b092a81ca", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a04ab6ee7ac183fa", "level": "note", "message": {"text": "Unused endpoint: GET /stream/refresh"}, "properties": {"repobilityId": "6c6d73d37a622168", "scanner": "scanner-primary", "fingerprint": "a04ab6ee7ac183fa", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-49a63852e7dabded", "level": "note", "message": {"text": "Unused endpoint: GET /upcoming"}, "properties": {"repobilityId": "9c9ca2323ecdddf4", "scanner": "scanner-primary", "fingerprint": "49a63852e7dabded", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2433478424a76226", "level": "note", "message": {"text": "Unused endpoint: POST /ingest/federal"}, "properties": {"repobilityId": "98351c399a6e9fc9", "scanner": "scanner-primary", "fingerprint": "2433478424a76226", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6235bebfe1b4fd9a", "level": "note", "message": {"text": "Unused endpoint: POST /ingest/state/{state}"}, "properties": {"repobilityId": "19442e85db976853", "scanner": "scanner-primary", "fingerprint": "6235bebfe1b4fd9a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4dafae593ed55854", "level": "note", "message": {"text": "Unused endpoint: POST /ingest/local/{city}"}, "properties": {"repobilityId": "74a56c31cbbcfc16", "scanner": "scanner-primary", "fingerprint": "4dafae593ed55854", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d682e1d215955e6a", "level": "note", "message": {"text": "Unused endpoint: GET /list"}, "properties": {"repobilityId": "4bd7000bd1575d48", "scanner": "scanner-primary", "fingerprint": "d682e1d215955e6a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-217b23a219c9f8d5", "level": "note", "message": {"text": "Unused endpoint: GET /tag-counts"}, "properties": {"repobilityId": "2a8ff9219213c699", "scanner": "scanner-primary", "fingerprint": "217b23a219c9f8d5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8d11b1c17c1c58c6", "level": "note", "message": {"text": "Unused endpoint: GET /facets"}, "properties": {"repobilityId": "10d5fc8260dc7bb8", "scanner": "scanner-primary", "fingerprint": "8d11b1c17c1c58c6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f5e44059d74979c4", "level": "note", "message": {"text": "Unused endpoint: GET /year-counts"}, "properties": {"repobilityId": "09d06656a7107873", "scanner": "scanner-primary", "fingerprint": "f5e44059d74979c4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3bf54ddd990de3fe", "level": "note", "message": {"text": "Unused endpoint: GET /month-counts"}, "properties": {"repobilityId": "c19cdea4ba7870a3", "scanner": "scanner-primary", "fingerprint": "3bf54ddd990de3fe", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5d6e2a62d2d0d400", "level": "note", "message": {"text": "Unused endpoint: GET /count"}, "properties": {"repobilityId": "aa6a8f198ad12d8d", "scanner": "scanner-primary", "fingerprint": "5d6e2a62d2d0d400", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e686634beeea0bb8", "level": "note", "message": {"text": "Unused endpoint: GET /export"}, "properties": {"repobilityId": "1ec06efadc43ddd9", "scanner": "scanner-primary", "fingerprint": "e686634beeea0bb8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-63d6f80e05d5ba22", "level": "note", "message": {"text": "Unused endpoint: GET /sitemap-ids"}, "properties": {"repobilityId": "1aa1cf84642238c7", "scanner": "scanner-primary", "fingerprint": "63d6f80e05d5ba22", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d16e4fa529c520e9", "level": "note", "message": {"text": "Unused endpoint: GET /search"}, "properties": {"repobilityId": "8017514a2c1d953f", "scanner": "scanner-primary", "fingerprint": "d16e4fa529c520e9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e2c335bcb2974c58", "level": "note", "message": {"text": "Unused endpoint: GET /spotlight"}, "properties": {"repobilityId": "d49024634088b3d9", "scanner": "scanner-primary", "fingerprint": "e2c335bcb2974c58", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2a0baa3183ec2b4f", "level": "note", "message": {"text": "Unused endpoint: GET /pipeline-stats"}, "properties": {"repobilityId": "47534af5ee2fa7b7", "scanner": "scanner-primary", "fingerprint": "2a0baa3183ec2b4f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5f78b4c8810bdb2f", "level": "note", "message": {"text": "Unused endpoint: POST /plain-titles"}, "properties": {"repobilityId": "da53514c12b79451", "scanner": "scanner-primary", "fingerprint": "5f78b4c8810bdb2f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-92b220feaa1cc169", "level": "note", "message": {"text": "Unused endpoint: POST /sync-statuses"}, "properties": {"repobilityId": "cdc94d364e98bc75", "scanner": "scanner-primary", "fingerprint": "92b220feaa1cc169", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f8e4a6a7a7168398", "level": "note", "message": {"text": "Unused endpoint: POST /tag-all"}, "properties": {"repobilityId": "e5898b1131d93937", "scanner": "scanner-primary", "fingerprint": "f8e4a6a7a7168398", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-85fad678eab4c6c2", "level": "note", "message": {"text": "Unused endpoint: POST /bluesky/record-post"}, "properties": {"repobilityId": "03f837c2a23fbf37", "scanner": "scanner-primary", "fingerprint": "85fad678eab4c6c2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-81990e6e6f78627f", "level": "note", "message": {"text": "Unused endpoint: GET /bluesky/posts-to-track"}, "properties": {"repobilityId": "9b20ac807951c832", "scanner": "scanner-primary", "fingerprint": "81990e6e6f78627f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0068a1ca08195025", "level": "note", "message": {"text": "Unused endpoint: POST /bluesky/update-engagement"}, "properties": {"repobilityId": "9fb4dde47058903f", "scanner": "scanner-primary", "fingerprint": "0068a1ca08195025", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-72af3d7dd49975ba", "level": "note", "message": {"text": "Unused endpoint: POST /generate-ledes"}, "properties": {"repobilityId": "7ea378c06afd9bef", "scanner": "scanner-primary", "fingerprint": "72af3d7dd49975ba", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9457ceba7284efcd", "level": "note", "message": {"text": "Unused endpoint: POST /generate-headlines"}, "properties": {"repobilityId": "2410ea85f6dc9b40", "scanner": "scanner-primary", "fingerprint": "9457ceba7284efcd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e0824cc633bd24bf", "level": "note", "message": {"text": "Unused endpoint: POST /fetch-news-all"}, "properties": {"repobilityId": "2f3fefec10bf2240", "scanner": "scanner-primary", "fingerprint": "e0824cc633bd24bf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-950eb430009315f0", "level": "note", "message": {"text": "Unused endpoint: POST /analyze-all"}, "properties": {"repobilityId": "230734749d59f99a", "scanner": "scanner-primary", "fingerprint": "950eb430009315f0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7dffd55a19ce8b4d", "level": "note", "message": {"text": "Unused endpoint: POST /generate-all-perspectives"}, "properties": {"repobilityId": "5ec0318d0e67ea34", "scanner": "scanner-primary", "fingerprint": "7dffd55a19ce8b4d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ba2a77daa036c569", "level": "note", "message": {"text": "Unused endpoint: POST /backfill-vote-records"}, "properties": {"repobilityId": "254ed0f48d7fd458", "scanner": "scanner-primary", "fingerprint": "ba2a77daa036c569", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}