{"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-c5ed6945b1fd1ebb", "name": "Possibly dead Python function: go_to_roster", "shortDescription": {"text": "Possibly dead Python function: go_to_roster"}, "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-59eb320167fb4dae", "name": "Possibly dead Python function: backfill_genesis", "shortDescription": {"text": "Possibly dead Python function: backfill_genesis"}, "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-e92320589fe1f2db", "name": "Possibly dead Python function: record_alias", "shortDescription": {"text": "Possibly dead Python function: record_alias"}, "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-2bc4a67c64610728", "name": "Possibly dead Python function: mark_url_healthy", "shortDescription": {"text": "Possibly dead Python function: mark_url_healthy"}, "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-7c288e695a7f3d2b", "name": "Possibly dead Python function: upsert", "shortDescription": {"text": "Possibly dead Python function: upsert"}, "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-553ac6c111ea3d55", "name": "Possibly dead Python function: spending_allowed", "shortDescription": {"text": "Possibly dead Python function: spending_allowed"}, "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-7c1dae086451f141", "name": "Possibly dead Python function: release", "shortDescription": {"text": "Possibly dead Python function: release"}, "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-c6e7f01fa7ccc7a8", "name": "Possibly dead Python function: observe_minutes_missing", "shortDescription": {"text": "Possibly dead Python function: observe_minutes_missing"}, "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-58f8c1341f75eea8", "name": "Possibly dead Python function: observe_agenda_missing", "shortDescription": {"text": "Possibly dead Python function: observe_agenda_missing"}, "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-7c667845709161f8", "name": "Possibly dead Python function: observe_member_roster_missing", "shortDescription": {"text": "Possibly dead Python function: observe_member_roster_missing"}, "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-fa60b5f9d9be0b90", "name": "Possibly dead Python function: observe_campaign_finance_missing", "shortDescription": {"text": "Possibly dead Python function: observe_campaign_finance_missing"}, "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-4fff59cda1aeb419", "name": "Possibly dead Python function: observe_meeting_notice_too_short", "shortDescription": {"text": "Possibly dead Python function: observe_meeting_notice_too_short"}, "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-bbd086550c2935f5", "name": "Possibly dead Python function: observe_budget_adoption_overdue", "shortDescription": {"text": "Possibly dead Python function: observe_budget_adoption_overdue"}, "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-c47248480d80b395", "name": "Possibly dead Python function: record_process_error", "shortDescription": {"text": "Possibly dead Python function: record_process_error"}, "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-2989667be5107d1d", "name": "Possibly dead Python function: kwargs", "shortDescription": {"text": "Possibly dead Python function: kwargs"}, "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-bda2b01e255b19a8", "name": "Possibly dead Python function: source_name", "shortDescription": {"text": "Possibly dead Python function: source_name"}, "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-07214ba55e6fc871", "name": "Possibly dead Python function: fetch_categories", "shortDescription": {"text": "Possibly dead Python function: fetch_categories"}, "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-fba7fa1bae846414", "name": "Possibly dead Python function: extract_from_screenshot", "shortDescription": {"text": "Possibly dead Python function: extract_from_screenshot"}, "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-1df3f72890ee9e1e", "name": "Possibly dead Python function: pdf_page_count", "shortDescription": {"text": "Possibly dead Python function: pdf_page_count"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bba627ed8317a8ce", "name": "Possibly dead Python function: split_pdf_to_windows", "shortDescription": {"text": "Possibly dead Python function: split_pdf_to_windows"}, "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-4442c9b456c87ac7", "name": "Possibly dead Python function: split_text_to_windows", "shortDescription": {"text": "Possibly dead Python function: split_text_to_windows"}, "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-8d44be994a1b4474", "name": "Possibly dead Python function: extract_from_screenshot", "shortDescription": {"text": "Possibly dead Python function: extract_from_screenshot"}, "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-97b19a51caa7cb6b", "name": "Dockerfile runs as root: etl/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: etl/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-d96d43bae71dd13a", "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-6372cebde0220094", "name": "No auth library detected", "shortDescription": {"text": "No auth library detected"}, "fullDescription": {"text": "The scanner did not find any standard auth library (JWT, OAuth, NextAuth, Auth0, etc.). The repo has auth/admin/session surface indicators, so auth may live in custom code, in a separate service, or be missing."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c2bd325894d2760d", "name": "Very large file: etl/streamlit_app.py (1274 lines)", "shortDescription": {"text": "Very large file: etl/streamlit_app.py (1274 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-6a6a6f7ec2417589", "name": "Very large file: etl/townwatch_etl/jobs/prepare_records_request.py (1176 lines)", "shortDescription": {"text": "Very large file: etl/townwatch_etl/jobs/prepare_records_request.py (1176 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": "2 test file(s) for 134 source file(s) (ratio 0.01). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 664 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 35 placeholder/mock markers across 13 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1dc4cac8bef88448", "name": "Commented-code block (5 lines) in etl/townwatch_etl/records_request_pdf.py:184", "shortDescription": {"text": "Commented-code block (5 lines) in etl/townwatch_etl/records_request_pdf.py:184"}, "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-6667ea82d4b5f341", "name": "Commented-code block (5 lines) in etl/townwatch_etl/pipeline_health.py:173", "shortDescription": {"text": "Commented-code block (5 lines) in etl/townwatch_etl/pipeline_health.py:173"}, "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-5b9cd0cbb8ee2221", "name": "Commented-code block (6 lines) in etl/townwatch_etl/config.py:5", "shortDescription": {"text": "Commented-code block (6 lines) in etl/townwatch_etl/config.py:5"}, "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-acd850a2191f039a", "name": "Commented-code block (5 lines) in etl/townwatch_etl/http_client.py:74", "shortDescription": {"text": "Commented-code block (5 lines) in etl/townwatch_etl/http_client.py:74"}, "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-1b6a847ec8da884b", "name": "Commented-code block (5 lines) in etl/townwatch_etl/document_text.py:47", "shortDescription": {"text": "Commented-code block (5 lines) in etl/townwatch_etl/document_text.py:47"}, "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-a43b8b94e89ae452", "name": "Commented-code block (6 lines) in etl/townwatch_etl/timezones.py:107", "shortDescription": {"text": "Commented-code block (6 lines) in etl/townwatch_etl/timezones.py:107"}, "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-032f869b3d6cbd8e", "name": "Commented-code block (7 lines) in etl/townwatch_etl/jobs/daily_refresh.py:90", "shortDescription": {"text": "Commented-code block (7 lines) in etl/townwatch_etl/jobs/daily_refresh.py:90"}, "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-b586b45a9b8934af", "name": "Network/subprocess call without timeout or try/except \u2014 etl/townwatch_etl/jobs/daily_refresh.py:325", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 etl/townwatch_etl/jobs/daily_refresh.py:325"}, "fullDescription": {"text": "`subprocess.Popen(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fd97a7e9e56c29f6", "name": "Commented-code block (5 lines) in etl/townwatch_etl/jobs/extract_agendas.py:569", "shortDescription": {"text": "Commented-code block (5 lines) in etl/townwatch_etl/jobs/extract_agendas.py:569"}, "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-ed992ee794a5bd59", "name": "Commented-code block (7 lines) in etl/townwatch_etl/jobs/refresh_council_roster.py:316", "shortDescription": {"text": "Commented-code block (7 lines) in etl/townwatch_etl/jobs/refresh_council_roster.py:316"}, "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-7a20736222d22856", "name": "Commented-code block (5 lines) in etl/townwatch_etl/jobs/prepare_records_request.py:667", "shortDescription": {"text": "Commented-code block (5 lines) in etl/townwatch_etl/jobs/prepare_records_request.py:667"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c6ee9c37304158b1", "name": "Commented-code block (7 lines) in etl/townwatch_etl/jobs/monitor_clerk_contact.py:105", "shortDescription": {"text": "Commented-code block (7 lines) in etl/townwatch_etl/jobs/monitor_clerk_contact.py:105"}, "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-dce8ef03923229a2", "name": "Commented-code block (5 lines) in etl/townwatch_etl/jobs/ingest_elections.py:65", "shortDescription": {"text": "Commented-code block (5 lines) in etl/townwatch_etl/jobs/ingest_elections.py:65"}, "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-80272cb6fd4ca01d", "name": "Commented-code block (6 lines) in etl/townwatch_etl/jobs/extract_minutes.py:74", "shortDescription": {"text": "Commented-code block (6 lines) in etl/townwatch_etl/jobs/extract_minutes.py:74"}, "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-c8ce9c6d25a4e4cc", "name": "Commented-code block (5 lines) in etl/townwatch_etl/jobs/extract_agendas_batch.py:77", "shortDescription": {"text": "Commented-code block (5 lines) in etl/townwatch_etl/jobs/extract_agendas_batch.py:77"}, "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-7ec83062a0e137ab", "name": "Commented-code block (5 lines) in etl/townwatch_etl/jobs/sync_jurisdictions.py:39", "shortDescription": {"text": "Commented-code block (5 lines) in etl/townwatch_etl/jobs/sync_jurisdictions.py:39"}, "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-006491faac7e727b", "name": "Network/subprocess call without timeout or try/except \u2014 etl/townwatch_etl/jobs/scaffold.py:153", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 etl/townwatch_etl/jobs/scaffold.py:153"}, "fullDescription": {"text": "`subprocess.Popen(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8704b17778e8ad19", "name": "Commented-code block (10 lines) in etl/townwatch_etl/jobs/refresh_findings.py:52", "shortDescription": {"text": "Commented-code block (10 lines) in etl/townwatch_etl/jobs/refresh_findings.py:52"}, "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-d6b61538ec424fd8", "name": "Commented-code block (5 lines) in etl/townwatch_etl/jobs/discover_election_source.py:114", "shortDescription": {"text": "Commented-code block (5 lines) in etl/townwatch_etl/jobs/discover_election_source.py:114"}, "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-9be7b934d2db6feb", "name": "Commented-code block (9 lines) in etl/townwatch_etl/jobs/scan_document_availability.py:61", "shortDescription": {"text": "Commented-code block (9 lines) in etl/townwatch_etl/jobs/scan_document_availability.py:61"}, "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-332922ee31bd2721", "name": "Commented-code block (5 lines) in etl/townwatch_etl/jobs/acquire_staff.py:163", "shortDescription": {"text": "Commented-code block (5 lines) in etl/townwatch_etl/jobs/acquire_staff.py:163"}, "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-2329e0986209e9be", "name": "Commented-code block (5 lines) in etl/townwatch_etl/jobs/extract_packets.py:42", "shortDescription": {"text": "Commented-code block (5 lines) in etl/townwatch_etl/jobs/extract_packets.py:42"}, "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-ae7b95f6b2e7a524", "name": "Commented-code block (8 lines) in etl/townwatch_etl/jobs/meetings_inventory.py:32", "shortDescription": {"text": "Commented-code block (8 lines) in etl/townwatch_etl/jobs/meetings_inventory.py:32"}, "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-03263363cfef601e", "name": "Commented-code block (6 lines) in etl/townwatch_etl/jobs/pipeline_issues.py:100", "shortDescription": {"text": "Commented-code block (6 lines) in etl/townwatch_etl/jobs/pipeline_issues.py:100"}, "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-d3fa26ec9cb519bd", "name": "Commented-code block (5 lines) in etl/townwatch_etl/jobs/extract_budgets.py:216", "shortDescription": {"text": "Commented-code block (5 lines) in etl/townwatch_etl/jobs/extract_budgets.py:216"}, "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-520f262fa2ef1cf0", "name": "Commented-code block (7 lines) in etl/townwatch_etl/jobs/backfill_document_text.py:48", "shortDescription": {"text": "Commented-code block (7 lines) in etl/townwatch_etl/jobs/backfill_document_text.py:48"}, "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-e48b81e863ec376b", "name": "Commented-code block (7 lines) in etl/townwatch_etl/scrapers/civicclerk_meetings.py:36", "shortDescription": {"text": "Commented-code block (7 lines) in etl/townwatch_etl/scrapers/civicclerk_meetings.py:36"}, "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-cf74b617155e9d3f", "name": "Commented-code block (6 lines) in etl/townwatch_etl/campaign_finance/recordsearch.py:88", "shortDescription": {"text": "Commented-code block (6 lines) in etl/townwatch_etl/campaign_finance/recordsearch.py:88"}, "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-08629c2316b7cbe2", "name": "Legacy-named symbol `model_copy` in etl/townwatch_etl/extractors/minutes.py:524", "shortDescription": {"text": "Legacy-named symbol `model_copy` in etl/townwatch_etl/extractors/minutes.py:524"}, "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-7a3f0979a2bdce16", "name": "Commented-code block (5 lines) in etl/townwatch_etl/extractors/minutes.py:65", "shortDescription": {"text": "Commented-code block (5 lines) in etl/townwatch_etl/extractors/minutes.py:65"}, "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-8576a7bc83b07f74", "name": "Legacy-named symbol `model_copy` in etl/townwatch_etl/extractors/agendas.py:477", "shortDescription": {"text": "Legacy-named symbol `model_copy` in etl/townwatch_etl/extractors/agendas.py:477"}, "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-ab403b522f6b25ac", "name": "Commented-code block (5 lines) in etl/townwatch_etl/extractors/agendas.py:275", "shortDescription": {"text": "Commented-code block (5 lines) in etl/townwatch_etl/extractors/agendas.py:275"}, "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-0aa5fabdba7e133f", "name": "Commented-code block (5 lines) in etl/townwatch_etl/extractors/pdf_text.py:42", "shortDescription": {"text": "Commented-code block (5 lines) in etl/townwatch_etl/extractors/pdf_text.py:42"}, "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-2da701079eae7277", "name": "Network/subprocess call without timeout or try/except \u2014 etl/townwatch_etl/extractors/pdf_text.py:81", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 etl/townwatch_etl/extractors/pdf_text.py:81"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d0b17c8c07a7421d", "name": "8 env vars used in code but missing from .env.example", "shortDescription": {"text": "8 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `DATABASE_PUBLIC_URL`, `INTAKE_TOKEN`, `MISTRAL_API_KEY`, `PORT`, `RESEND_API_KEY`, `RESEND_FROM`, `RESEND_REPLY_TO`, `VISION_RENDER_DPI`. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\netl/townwatch_etl/identity.py:resolve, etl/townwatch_etl/identity.py:resolve\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:\netl/townwatch_etl/jobs/sync_capabilities.py:main, etl/townwatch_etl/jobs/monitor_clerk_contact.py:main, etl/townwatch_etl/jobs/monitor_roster_changes.py:main\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-76a2f6818267a9a8", "name": "Near-duplicate function bodies in 8 places", "shortDescription": {"text": "Near-duplicate function bodies in 8 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\netl/townwatch_etl/patterns/qa_data_anomalies.py:detect, etl/townwatch_etl/patterns/qa_data_anomalies.py:detect, etl/townwatch_etl/patterns/qa_data_anomalies.py:detect, etl/townwatch_etl/patterns/qa_data_anomalies.py:detect\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-fac4d0f28171fd12", "name": "FastAPI POST `post_correction` without auth dependency \u2014 etl/townwatch_etl/api.py:90", "shortDescription": {"text": "FastAPI POST `post_correction` without auth dependency \u2014 etl/townwatch_etl/api.py:90"}, "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-1462d7d0edba0a33", "name": "FastAPI POST `post_user_sync` without auth dependency \u2014 etl/townwatch_etl/api.py:114", "shortDescription": {"text": "FastAPI POST `post_user_sync` without auth dependency \u2014 etl/townwatch_etl/api.py:114"}, "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-d873c43ec2b119c6", "name": "FastAPI POST `post_home_jurisdiction` without auth dependency \u2014 etl/townwatch_etl/api.py:132", "shortDescription": {"text": "FastAPI POST `post_home_jurisdiction` without auth dependency \u2014 etl/townwatch_etl/api.py:132"}, "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-951733ba8ee50c6d", "name": "FastAPI POST `post_comment` without auth dependency \u2014 etl/townwatch_etl/api.py:149", "shortDescription": {"text": "FastAPI POST `post_comment` without auth dependency \u2014 etl/townwatch_etl/api.py:149"}, "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-ccf3a1c6eec75ec4", "name": "FastAPI POST `post_email_delivery_event` without auth dependency \u2014 etl/townwatch_etl/api.py:172", "shortDescription": {"text": "FastAPI POST `post_email_delivery_event` without auth dependency \u2014 etl/townwatch_etl/api.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}}]}}, "automationDetails": {"id": "repobility/24206"}, "properties": {"repository": "Angelcotech/townwatch", "repoUrl": "https://github.com/Angelcotech/townwatch", "branch": "main"}, "results": [{"ruleId": "scanner-c5ed6945b1fd1ebb", "level": "note", "message": {"text": "Possibly dead Python function: go_to_roster"}, "properties": {"repobilityId": "abca717ea5c1fe33", "scanner": "scanner-primary", "fingerprint": "c5ed6945b1fd1ebb", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "etl/streamlit_app.py:116"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-59eb320167fb4dae", "level": "note", "message": {"text": "Possibly dead Python function: backfill_genesis"}, "properties": {"repobilityId": "c5622cc694b209be", "scanner": "scanner-primary", "fingerprint": "59eb320167fb4dae", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "etl/townwatch_etl/activity.py:70"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e92320589fe1f2db", "level": "note", "message": {"text": "Possibly dead Python function: record_alias"}, "properties": {"repobilityId": "4807384a5235b0c3", "scanner": "scanner-primary", "fingerprint": "e92320589fe1f2db", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "etl/townwatch_etl/identity.py:516"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2bc4a67c64610728", "level": "note", "message": {"text": "Possibly dead Python function: mark_url_healthy"}, "properties": {"repobilityId": "464f9e0cd918312f", "scanner": "scanner-primary", "fingerprint": "2bc4a67c64610728", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "etl/townwatch_etl/audit.py:138"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7c288e695a7f3d2b", "level": "note", "message": {"text": "Possibly dead Python function: upsert"}, "properties": {"repobilityId": "119b389e0f44ad68", "scanner": "scanner-primary", "fingerprint": "7c288e695a7f3d2b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "etl/townwatch_etl/ingest_base.py:146"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-553ac6c111ea3d55", "level": "note", "message": {"text": "Possibly dead Python function: spending_allowed"}, "properties": {"repobilityId": "ac31342b968e8480", "scanner": "scanner-primary", "fingerprint": "553ac6c111ea3d55", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "etl/townwatch_etl/funds.py:104"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7c1dae086451f141", "level": "note", "message": {"text": "Possibly dead Python function: release"}, "properties": {"repobilityId": "9b74e836f1d2751c", "scanner": "scanner-primary", "fingerprint": "7c1dae086451f141", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "etl/townwatch_etl/funds.py:277"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c6e7f01fa7ccc7a8", "level": "note", "message": {"text": "Possibly dead Python function: observe_minutes_missing"}, "properties": {"repobilityId": "a44dde5cd2d330cb", "scanner": "scanner-primary", "fingerprint": "c6e7f01fa7ccc7a8", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "etl/townwatch_etl/jobs/refresh_findings.py:65"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-58f8c1341f75eea8", "level": "note", "message": {"text": "Possibly dead Python function: observe_agenda_missing"}, "properties": {"repobilityId": "4247f3a69be2c055", "scanner": "scanner-primary", "fingerprint": "58f8c1341f75eea8", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "etl/townwatch_etl/jobs/refresh_findings.py:117"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7c667845709161f8", "level": "note", "message": {"text": "Possibly dead Python function: observe_member_roster_missing"}, "properties": {"repobilityId": "7f45588f8e5ed784", "scanner": "scanner-primary", "fingerprint": "7c667845709161f8", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "etl/townwatch_etl/jobs/refresh_findings.py:157"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-fa60b5f9d9be0b90", "level": "note", "message": {"text": "Possibly dead Python function: observe_campaign_finance_missing"}, "properties": {"repobilityId": "ccc167d84367a7e1", "scanner": "scanner-primary", "fingerprint": "fa60b5f9d9be0b90", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "etl/townwatch_etl/jobs/refresh_findings.py:189"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4fff59cda1aeb419", "level": "note", "message": {"text": "Possibly dead Python function: observe_meeting_notice_too_short"}, "properties": {"repobilityId": "e7bea0068b24cbaa", "scanner": "scanner-primary", "fingerprint": "4fff59cda1aeb419", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "etl/townwatch_etl/jobs/refresh_findings.py:278"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bbd086550c2935f5", "level": "note", "message": {"text": "Possibly dead Python function: observe_budget_adoption_overdue"}, "properties": {"repobilityId": "2bb9d47858c01319", "scanner": "scanner-primary", "fingerprint": "bbd086550c2935f5", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "etl/townwatch_etl/jobs/refresh_findings.py:361"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c47248480d80b395", "level": "note", "message": {"text": "Possibly dead Python function: record_process_error"}, "properties": {"repobilityId": "0bfcbc97ccb22d77", "scanner": "scanner-primary", "fingerprint": "c47248480d80b395", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "etl/townwatch_etl/jobs/pipeline_errors.py:16"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2989667be5107d1d", "level": "note", "message": {"text": "Possibly dead Python function: kwargs"}, "properties": {"repobilityId": "7b478461b9673e91", "scanner": "scanner-primary", "fingerprint": "2989667be5107d1d", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "etl/townwatch_etl/jobs/meetings_inventory.py:134"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bda2b01e255b19a8", "level": "note", "message": {"text": "Possibly dead Python function: source_name"}, "properties": {"repobilityId": "3afc9877526207f7", "scanner": "scanner-primary", "fingerprint": "bda2b01e255b19a8", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "etl/townwatch_etl/jobs/meetings_inventory.py:154"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-07214ba55e6fc871", "level": "note", "message": {"text": "Possibly dead Python function: fetch_categories"}, "properties": {"repobilityId": "9138f65758fd1803", "scanner": "scanner-primary", "fingerprint": "07214ba55e6fc871", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "etl/townwatch_etl/scrapers/civicclerk_meetings.py:102"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-fba7fa1bae846414", "level": "note", "message": {"text": "Possibly dead Python function: extract_from_screenshot"}, "properties": {"repobilityId": "a6c66da252a5827d", "scanner": "scanner-primary", "fingerprint": "fba7fa1bae846414", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "etl/townwatch_etl/extractors/election_results.py:256"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1df3f72890ee9e1e", "level": "note", "message": {"text": "Possibly dead Python function: pdf_page_count"}, "properties": {"repobilityId": "979c991e4b9d156c", "scanner": "scanner-primary", "fingerprint": "1df3f72890ee9e1e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "etl/townwatch_etl/extractors/chunking.py:42"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bba627ed8317a8ce", "level": "note", "message": {"text": "Possibly dead Python function: split_pdf_to_windows"}, "properties": {"repobilityId": "dd7de105032a892e", "scanner": "scanner-primary", "fingerprint": "bba627ed8317a8ce", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "etl/townwatch_etl/extractors/chunking.py:46"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4442c9b456c87ac7", "level": "note", "message": {"text": "Possibly dead Python function: split_text_to_windows"}, "properties": {"repobilityId": "55443955f8f86d23", "scanner": "scanner-primary", "fingerprint": "4442c9b456c87ac7", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "etl/townwatch_etl/extractors/chunking.py:69"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8d44be994a1b4474", "level": "note", "message": {"text": "Possibly dead Python function: extract_from_screenshot"}, "properties": {"repobilityId": "a6c66da252a5827d", "scanner": "scanner-primary", "fingerprint": "8d44be994a1b4474", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "etl/townwatch_etl/extractors/council_roster.py:202"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-97b19a51caa7cb6b", "level": "warning", "message": {"text": "Dockerfile runs as root: etl/Dockerfile"}, "properties": {"repobilityId": "8c4f065636389717", "scanner": "scanner-primary", "fingerprint": "97b19a51caa7cb6b", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-d96d43bae71dd13a", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim"}, "properties": {"repobilityId": "3d8e0c30e4ae6953", "scanner": "scanner-primary", "fingerprint": "d96d43bae71dd13a", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "etl/Dockerfile"}, "region": {"startLine": 18}}}]}, {"ruleId": "scanner-6372cebde0220094", "level": "warning", "message": {"text": "No auth library detected"}, "properties": {"repobilityId": "a5b6035a5bbf8054", "scanner": "scanner-primary", "fingerprint": "6372cebde0220094", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["coverage", "auth"]}}, {"ruleId": "scanner-c2bd325894d2760d", "level": "note", "message": {"text": "Very large file: etl/streamlit_app.py (1274 lines)"}, "properties": {"repobilityId": "005d59c8333b9f0c", "scanner": "scanner-primary", "fingerprint": "c2bd325894d2760d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6a6a6f7ec2417589", "level": "note", "message": {"text": "Very large file: etl/townwatch_etl/jobs/prepare_records_request.py (1176 lines)"}, "properties": {"repobilityId": "cb71373451254172", "scanner": "scanner-primary", "fingerprint": "6a6a6f7ec2417589", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "3a7360d3f7821f52", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "d1f26a6135b3f87d", "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": "c5dec2583c4886a1", "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": "9815e7bde0212ba8", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "fe5a4d63bf98686f", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-1dc4cac8bef88448", "level": "none", "message": {"text": "Commented-code block (5 lines) in etl/townwatch_etl/records_request_pdf.py:184"}, "properties": {"repobilityId": "9625f03391b6acdf", "scanner": "scanner-primary", "fingerprint": "1dc4cac8bef88448", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6667ea82d4b5f341", "level": "none", "message": {"text": "Commented-code block (5 lines) in etl/townwatch_etl/pipeline_health.py:173"}, "properties": {"repobilityId": "6aea5ef3c2a3f0a8", "scanner": "scanner-primary", "fingerprint": "6667ea82d4b5f341", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5b9cd0cbb8ee2221", "level": "none", "message": {"text": "Commented-code block (6 lines) in etl/townwatch_etl/config.py:5"}, "properties": {"repobilityId": "581c5c949175bd0d", "scanner": "scanner-primary", "fingerprint": "5b9cd0cbb8ee2221", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-acd850a2191f039a", "level": "none", "message": {"text": "Commented-code block (5 lines) in etl/townwatch_etl/http_client.py:74"}, "properties": {"repobilityId": "d1f238e3fbff32fe", "scanner": "scanner-primary", "fingerprint": "acd850a2191f039a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1b6a847ec8da884b", "level": "none", "message": {"text": "Commented-code block (5 lines) in etl/townwatch_etl/document_text.py:47"}, "properties": {"repobilityId": "0ae29e7c4022da2d", "scanner": "scanner-primary", "fingerprint": "1b6a847ec8da884b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a43b8b94e89ae452", "level": "none", "message": {"text": "Commented-code block (6 lines) in etl/townwatch_etl/timezones.py:107"}, "properties": {"repobilityId": "87da9f92d1492e58", "scanner": "scanner-primary", "fingerprint": "a43b8b94e89ae452", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-032f869b3d6cbd8e", "level": "none", "message": {"text": "Commented-code block (7 lines) in etl/townwatch_etl/jobs/daily_refresh.py:90"}, "properties": {"repobilityId": "358af80f98984a63", "scanner": "scanner-primary", "fingerprint": "032f869b3d6cbd8e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b586b45a9b8934af", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 etl/townwatch_etl/jobs/daily_refresh.py:325"}, "properties": {"repobilityId": "1e363c14c4bc5a3f", "scanner": "scanner-primary", "fingerprint": "b586b45a9b8934af", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fd97a7e9e56c29f6", "level": "none", "message": {"text": "Commented-code block (5 lines) in etl/townwatch_etl/jobs/extract_agendas.py:569"}, "properties": {"repobilityId": "04057e9d019d2469", "scanner": "scanner-primary", "fingerprint": "fd97a7e9e56c29f6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ed992ee794a5bd59", "level": "none", "message": {"text": "Commented-code block (7 lines) in etl/townwatch_etl/jobs/refresh_council_roster.py:316"}, "properties": {"repobilityId": "eaaef3701a5ff1b0", "scanner": "scanner-primary", "fingerprint": "ed992ee794a5bd59", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7a20736222d22856", "level": "none", "message": {"text": "Commented-code block (5 lines) in etl/townwatch_etl/jobs/prepare_records_request.py:667"}, "properties": {"repobilityId": "9158b85ef8d6e82f", "scanner": "scanner-primary", "fingerprint": "7a20736222d22856", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c6ee9c37304158b1", "level": "none", "message": {"text": "Commented-code block (7 lines) in etl/townwatch_etl/jobs/monitor_clerk_contact.py:105"}, "properties": {"repobilityId": "530c2d452eb5f276", "scanner": "scanner-primary", "fingerprint": "c6ee9c37304158b1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dce8ef03923229a2", "level": "none", "message": {"text": "Commented-code block (5 lines) in etl/townwatch_etl/jobs/ingest_elections.py:65"}, "properties": {"repobilityId": "0845bb406aeac096", "scanner": "scanner-primary", "fingerprint": "dce8ef03923229a2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-80272cb6fd4ca01d", "level": "none", "message": {"text": "Commented-code block (6 lines) in etl/townwatch_etl/jobs/extract_minutes.py:74"}, "properties": {"repobilityId": "e856f733ccbf70bc", "scanner": "scanner-primary", "fingerprint": "80272cb6fd4ca01d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c8ce9c6d25a4e4cc", "level": "none", "message": {"text": "Commented-code block (5 lines) in etl/townwatch_etl/jobs/extract_agendas_batch.py:77"}, "properties": {"repobilityId": "3ad11e2d4df53b2c", "scanner": "scanner-primary", "fingerprint": "c8ce9c6d25a4e4cc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7ec83062a0e137ab", "level": "none", "message": {"text": "Commented-code block (5 lines) in etl/townwatch_etl/jobs/sync_jurisdictions.py:39"}, "properties": {"repobilityId": "82eb0cab2380ef9a", "scanner": "scanner-primary", "fingerprint": "7ec83062a0e137ab", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-006491faac7e727b", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 etl/townwatch_etl/jobs/scaffold.py:153"}, "properties": {"repobilityId": "ab26e166c665d531", "scanner": "scanner-primary", "fingerprint": "006491faac7e727b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8704b17778e8ad19", "level": "none", "message": {"text": "Commented-code block (10 lines) in etl/townwatch_etl/jobs/refresh_findings.py:52"}, "properties": {"repobilityId": "83d8f234c853f301", "scanner": "scanner-primary", "fingerprint": "8704b17778e8ad19", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d6b61538ec424fd8", "level": "none", "message": {"text": "Commented-code block (5 lines) in etl/townwatch_etl/jobs/discover_election_source.py:114"}, "properties": {"repobilityId": "31fe4a9586440273", "scanner": "scanner-primary", "fingerprint": "d6b61538ec424fd8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9be7b934d2db6feb", "level": "none", "message": {"text": "Commented-code block (9 lines) in etl/townwatch_etl/jobs/scan_document_availability.py:61"}, "properties": {"repobilityId": "c43cdd27f92447ae", "scanner": "scanner-primary", "fingerprint": "9be7b934d2db6feb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-332922ee31bd2721", "level": "none", "message": {"text": "Commented-code block (5 lines) in etl/townwatch_etl/jobs/acquire_staff.py:163"}, "properties": {"repobilityId": "c12ecd8e3f11cf0c", "scanner": "scanner-primary", "fingerprint": "332922ee31bd2721", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2329e0986209e9be", "level": "none", "message": {"text": "Commented-code block (5 lines) in etl/townwatch_etl/jobs/extract_packets.py:42"}, "properties": {"repobilityId": "6658ca81eda7c58b", "scanner": "scanner-primary", "fingerprint": "2329e0986209e9be", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ae7b95f6b2e7a524", "level": "none", "message": {"text": "Commented-code block (8 lines) in etl/townwatch_etl/jobs/meetings_inventory.py:32"}, "properties": {"repobilityId": "05696d484aee76f5", "scanner": "scanner-primary", "fingerprint": "ae7b95f6b2e7a524", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-03263363cfef601e", "level": "none", "message": {"text": "Commented-code block (6 lines) in etl/townwatch_etl/jobs/pipeline_issues.py:100"}, "properties": {"repobilityId": "21aa19d47516b4e9", "scanner": "scanner-primary", "fingerprint": "03263363cfef601e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d3fa26ec9cb519bd", "level": "none", "message": {"text": "Commented-code block (5 lines) in etl/townwatch_etl/jobs/extract_budgets.py:216"}, "properties": {"repobilityId": "58bd559e41c6aaa3", "scanner": "scanner-primary", "fingerprint": "d3fa26ec9cb519bd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-520f262fa2ef1cf0", "level": "none", "message": {"text": "Commented-code block (7 lines) in etl/townwatch_etl/jobs/backfill_document_text.py:48"}, "properties": {"repobilityId": "d2056220ee199581", "scanner": "scanner-primary", "fingerprint": "520f262fa2ef1cf0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e48b81e863ec376b", "level": "none", "message": {"text": "Commented-code block (7 lines) in etl/townwatch_etl/scrapers/civicclerk_meetings.py:36"}, "properties": {"repobilityId": "3ae5055b4ac23f55", "scanner": "scanner-primary", "fingerprint": "e48b81e863ec376b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cf74b617155e9d3f", "level": "none", "message": {"text": "Commented-code block (6 lines) in etl/townwatch_etl/campaign_finance/recordsearch.py:88"}, "properties": {"repobilityId": "2942f7d0c27e50a4", "scanner": "scanner-primary", "fingerprint": "cf74b617155e9d3f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-08629c2316b7cbe2", "level": "note", "message": {"text": "Legacy-named symbol `model_copy` in etl/townwatch_etl/extractors/minutes.py:524"}, "properties": {"repobilityId": "1a37de7fe94a9d48", "scanner": "scanner-primary", "fingerprint": "08629c2316b7cbe2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-7a3f0979a2bdce16", "level": "none", "message": {"text": "Commented-code block (5 lines) in etl/townwatch_etl/extractors/minutes.py:65"}, "properties": {"repobilityId": "371b3fabf379fea4", "scanner": "scanner-primary", "fingerprint": "7a3f0979a2bdce16", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8576a7bc83b07f74", "level": "note", "message": {"text": "Legacy-named symbol `model_copy` in etl/townwatch_etl/extractors/agendas.py:477"}, "properties": {"repobilityId": "cc9ba9ad1c9b859d", "scanner": "scanner-primary", "fingerprint": "8576a7bc83b07f74", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ab403b522f6b25ac", "level": "none", "message": {"text": "Commented-code block (5 lines) in etl/townwatch_etl/extractors/agendas.py:275"}, "properties": {"repobilityId": "88fd06544b54439d", "scanner": "scanner-primary", "fingerprint": "ab403b522f6b25ac", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0aa5fabdba7e133f", "level": "none", "message": {"text": "Commented-code block (5 lines) in etl/townwatch_etl/extractors/pdf_text.py:42"}, "properties": {"repobilityId": "4f08efc9b40b3ba0", "scanner": "scanner-primary", "fingerprint": "0aa5fabdba7e133f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2da701079eae7277", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 etl/townwatch_etl/extractors/pdf_text.py:81"}, "properties": {"repobilityId": "54ad6f8ba008a1d5", "scanner": "scanner-primary", "fingerprint": "2da701079eae7277", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d0b17c8c07a7421d", "level": "note", "message": {"text": "8 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "17fe720e8247f9df", "scanner": "scanner-primary", "fingerprint": "d0b17c8c07a7421d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "f608de47916071c4", "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": "23c0b96185b253bc", "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": "a40cd26d1f81e1bd", "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": "e6375d162888451b", "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": "94db62a75a0bb6ea", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "f59325a24db201b8", "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": "904c987c75deeaa6", "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": "1008fa0e53217d97", "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": "7018dd12dba24f48", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "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": "df6b87d677e85955", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "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": "4e0b7a723d1c0d9f", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-76a2f6818267a9a8", "level": "note", "message": {"text": "Near-duplicate function bodies in 8 places"}, "properties": {"repobilityId": "5f324ee13bd8ff1e", "scanner": "scanner-primary", "fingerprint": "76a2f6818267a9a8", "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": "955ca6032bfefb52", "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": "13670d36d74a7213", "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": "6dbc47ff1de95ff4", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-fac4d0f28171fd12", "level": "error", "message": {"text": "FastAPI POST `post_correction` without auth dependency \u2014 etl/townwatch_etl/api.py:90"}, "properties": {"repobilityId": "9c603c5e05a1f499", "scanner": "scanner-primary", "fingerprint": "fac4d0f28171fd12", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "etl/townwatch_etl/api.py"}, "region": {"startLine": 90}}}]}, {"ruleId": "scanner-1462d7d0edba0a33", "level": "error", "message": {"text": "FastAPI POST `post_user_sync` without auth dependency \u2014 etl/townwatch_etl/api.py:114"}, "properties": {"repobilityId": "539a71ef4baa2314", "scanner": "scanner-primary", "fingerprint": "1462d7d0edba0a33", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "etl/townwatch_etl/api.py"}, "region": {"startLine": 114}}}]}, {"ruleId": "scanner-d873c43ec2b119c6", "level": "error", "message": {"text": "FastAPI POST `post_home_jurisdiction` without auth dependency \u2014 etl/townwatch_etl/api.py:132"}, "properties": {"repobilityId": "e3a5c705b715ff12", "scanner": "scanner-primary", "fingerprint": "d873c43ec2b119c6", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "etl/townwatch_etl/api.py"}, "region": {"startLine": 132}}}]}, {"ruleId": "scanner-951733ba8ee50c6d", "level": "error", "message": {"text": "FastAPI POST `post_comment` without auth dependency \u2014 etl/townwatch_etl/api.py:149"}, "properties": {"repobilityId": "f858e84a982ffb87", "scanner": "scanner-primary", "fingerprint": "951733ba8ee50c6d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "etl/townwatch_etl/api.py"}, "region": {"startLine": 149}}}]}, {"ruleId": "scanner-ccf3a1c6eec75ec4", "level": "error", "message": {"text": "FastAPI POST `post_email_delivery_event` without auth dependency \u2014 etl/townwatch_etl/api.py:172"}, "properties": {"repobilityId": "1234542c07c5a410", "scanner": "scanner-primary", "fingerprint": "ccf3a1c6eec75ec4", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "etl/townwatch_etl/api.py"}, "region": {"startLine": 172}}}]}]}]}