{"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-b08db7d80553ba28", "name": "TODO/FIXME marker in shipping code \u2014 packages/Modernizr.2.6.2/Content/Scripts/modernizr-2.6.2.js:79", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 packages/Modernizr.2.6.2/Content/Scripts/modernizr-2.6.2.js:79"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d9015adb573f0343", "name": "TODO/FIXME marker in shipping code \u2014 packages/jQuery.UI.Combined.1.11.4/Content/Scripts/jquery-ui-1.11.4.js:425", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 packages/jQuery.UI.Combined.1.11.4/Content/Scripts/jquery-ui-1.11.4.js:425"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c5aaff09024fcabd", "name": "TODO/FIXME marker in shipping code \u2014 packages/jQuery.Validation.1.11.1/Content/Scripts/jquery.validate.js:1125", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 packages/jQuery.Validation.1.11.1/Content/Scripts/jquery.validate.js:1125"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5fc43f9263271463", "name": "Stray `console.log` in TS/JS \u2014 packages/jQuery.Validation.1.11.1/Content/Scripts/jquery.validate.js:584", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/jQuery.Validation.1.11.1/Content/Scripts/jquery.validate.js:584"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c08ee09ead45c0b4", "name": "TODO/FIXME marker in shipping code \u2014 packages/jQuery.Validation.1.11.1/Content/Scripts/jquery.validate-vsdoc.js:1210", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 packages/jQuery.Validation.1.11.1/Content/Scripts/jquery.validate-vsdoc.js:1210"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9eb84fc19e0cd9fb", "name": "Stray `console.log` in TS/JS \u2014 packages/jQuery.Validation.1.11.1/Content/Scripts/jquery.validate-vsdoc.js:625", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/jQuery.Validation.1.11.1/Content/Scripts/jquery.validate-vsdoc.js:625"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-16614c1f96557487", "name": "Stray `console.log` in TS/JS \u2014 packages/jQuery.Validation.1.11.1/Content/Scripts/jquery.validate.min.js:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/jQuery.Validation.1.11.1/Content/Scripts/jquery.validate.min.js:16"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-072db34d2963a23c", "name": "Stray `console.log` in TS/JS \u2014 modern-democracy/server/src/seed-demo.ts:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 modern-democracy/server/src/seed-demo.ts:18"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-504a5eef53f0d3a4", "name": "Stray `console.log` in TS/JS \u2014 modern-democracy/server/src/worker.ts:21", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 modern-democracy/server/src/worker.ts:21"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-839cdbb33e37dc3d", "name": "Stray `console.log` in TS/JS \u2014 modern-democracy/server/src/services/demo-community.ts:235", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 modern-democracy/server/src/services/demo-community.ts:235"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d486b06c2ad2722b", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 modern-democracy/src/components/LandingArt.tsx:78", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 modern-democracy/src/components/LandingArt.tsx:78"}, "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-ca0af2af8b58f7b3", "name": "TODO/FIXME marker in shipping code \u2014 Democracy/Scripts/jquery-ui-1.11.4.js:425", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 Democracy/Scripts/jquery-ui-1.11.4.js:425"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6f287d5911483ba0", "name": "TODO/FIXME marker in shipping code \u2014 Democracy/Scripts/jquery.validate.js:1125", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 Democracy/Scripts/jquery.validate.js:1125"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-43b8158bc1a3933f", "name": "Stray `console.log` in TS/JS \u2014 Democracy/Scripts/jquery.validate.js:584", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 Democracy/Scripts/jquery.validate.js:584"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0e15faff0e67a80a", "name": "TODO/FIXME marker in shipping code \u2014 Democracy/Scripts/modernizr-2.6.2.js:79", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 Democracy/Scripts/modernizr-2.6.2.js:79"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-61bfcca2eb99aaa2", "name": "TODO/FIXME marker in shipping code \u2014 Democracy/Scripts/jquery.validate-vsdoc.js:1210", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 Democracy/Scripts/jquery.validate-vsdoc.js:1210"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-03f6a71a1c8f8b1f", "name": "Stray `console.log` in TS/JS \u2014 Democracy/Scripts/jquery.validate-vsdoc.js:625", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 Democracy/Scripts/jquery.validate-vsdoc.js:625"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-92e7bc45d318438a", "name": "Stray `console.log` in TS/JS \u2014 Democracy/Scripts/jquery.validate.min.js:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 Democracy/Scripts/jquery.validate.min.js:16"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b4512cd5f61cf08d", "name": "TODO/FIXME marker in shipping code \u2014 Democracy/Scripts/jquery.ui.widget.js:136", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 Democracy/Scripts/jquery.ui.widget.js:136"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-93640b049e4697e7", "name": "Dockerfile runs as root: modern-democracy/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: modern-democracy/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-b63a1ad3517f297d", "name": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine"}, "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-9e48713adb23afdc", "name": "Dockerfile runs as root: modern-democracy/server/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: modern-democracy/server/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-c9c46176ad7511d7", "name": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine"}, "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-9710c8d059e53154", "name": "No frontend routes/components detected", "shortDescription": {"text": "No frontend routes/components detected"}, "fullDescription": {"text": "No React/Vue/Next routes were found. This is fine for backend-only repos."}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-489df86216551dfc", "name": "Insecure pattern 'new_function_used' in packages/jQuery.1.10.2/Content/Scripts/jquery-1.10.2-vsdoc.js:2316", "shortDescription": {"text": "Insecure pattern 'new_function_used' in packages/jQuery.1.10.2/Content/Scripts/jquery-1.10.2-vsdoc.js:2316"}, "fullDescription": {"text": "Found a known-risky pattern (new_function_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-44b4ce6b80014c00", "name": "Insecure pattern 'direct_innerhtml_assignment' in packages/jQuery.1.10.2/Content/Scripts/jquery-1.10.2-vsdoc.js:1131", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in packages/jQuery.1.10.2/Content/Scripts/jquery-1.10.2-vsdoc.js:1131"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-21fc5341236f5ea5", "name": "Insecure pattern 'new_function_used' in packages/jQuery.1.10.2/Content/Scripts/jquery-1.10.2.js:583", "shortDescription": {"text": "Insecure pattern 'new_function_used' in packages/jQuery.1.10.2/Content/Scripts/jquery-1.10.2.js:583"}, "fullDescription": {"text": "Found a known-risky pattern (new_function_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-60215aa76874fa4e", "name": "Insecure pattern 'direct_innerhtml_assignment' in packages/jQuery.1.10.2/Content/Scripts/jquery-1.10.2.js:1509", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in packages/jQuery.1.10.2/Content/Scripts/jquery-1.10.2.js:1509"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-00398627ca468233", "name": "Insecure pattern 'direct_outerhtml_assignment' in packages/jQuery.1.10.2/Content/Scripts/jquery-1.10.2.js:6404", "shortDescription": {"text": "Insecure pattern 'direct_outerhtml_assignment' in packages/jQuery.1.10.2/Content/Scripts/jquery-1.10.2.js:6404"}, "fullDescription": {"text": "Found a known-risky pattern (direct_outerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e25b89cabef0e7fe", "name": "Insecure pattern 'direct_innerhtml_assignment' in packages/jQuery.1.10.2/Content/Scripts/jquery-1.10.2.min.js:21", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in packages/jQuery.1.10.2/Content/Scripts/jquery-1.10.2.min.js:21"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3bdcff607f17781f", "name": "Insecure pattern 'direct_outerhtml_assignment' in packages/jQuery.1.10.2/Content/Scripts/jquery-1.10.2.min.js:22", "shortDescription": {"text": "Insecure pattern 'direct_outerhtml_assignment' in packages/jQuery.1.10.2/Content/Scripts/jquery-1.10.2.min.js:22"}, "fullDescription": {"text": "Found a known-risky pattern (direct_outerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-076a8731656b850d", "name": "Insecure pattern 'direct_innerhtml_assignment' in packages/Modernizr.2.6.2/Content/Scripts/modernizr-2.6.2.js:851", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in packages/Modernizr.2.6.2/Content/Scripts/modernizr-2.6.2.js:851"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-af774f52eafcb896", "name": "Insecure pattern 'direct_innerhtml_assignment' in packages/jQuery.UI.Combined.1.11.4/Content/Scripts/jquery-ui-1.11.4.js", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in packages/jQuery.UI.Combined.1.11.4/Content/Scripts/jquery-ui-1.11.4.js:1543"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-545e0e890cc4b857", "name": "Insecure pattern 'direct_innerhtml_assignment' in packages/jQuery.UI.Combined.1.11.4/Content/Scripts/jquery-ui-1.11.4.mi", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in packages/jQuery.UI.Combined.1.11.4/Content/Scripts/jquery-ui-1.11.4.min.js:6"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d173785efd0a86a1", "name": "Insecure pattern 'direct_innerhtml_assignment' in packages/Respond.1.2.0/content/Scripts/respond.min.js:17", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in packages/Respond.1.2.0/content/Scripts/respond.min.js:17"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9de49396e0c4c3ae", "name": "Insecure pattern 'direct_innerhtml_assignment' in packages/Respond.1.2.0/content/Scripts/respond.js:33", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in packages/Respond.1.2.0/content/Scripts/respond.js:33"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e0c8bfa7aacc46e9", "name": "Insecure pattern 'direct_innerhtml_assignment' in modern-democracy/src/components/LocalAreaMap.tsx:101", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in modern-democracy/src/components/LocalAreaMap.tsx:101"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c3fd34ff23c19f43", "name": "Insecure pattern 'direct_innerhtml_assignment' in modern-democracy/src/components/ConstituencyMap.tsx:440", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in modern-democracy/src/components/ConstituencyMap.tsx:440"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-768f53ea2b442cee", "name": "Insecure pattern 'direct_innerhtml_assignment' in modern-democracy/src/components/LandingArt.tsx:80", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in modern-democracy/src/components/LandingArt.tsx:80"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8e8984cc4f919c7a", "name": "Insecure pattern 'direct_innerhtml_assignment' in Democracy/Scripts/respond.min.js:17", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in Democracy/Scripts/respond.min.js:17"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5dbf6fecf950f621", "name": "Insecure pattern 'direct_innerhtml_assignment' in Democracy/Scripts/jquery-ui-1.11.4.js:1543", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in Democracy/Scripts/jquery-ui-1.11.4.js:1543"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1a07570f05f1a3bf", "name": "Insecure pattern 'direct_innerhtml_assignment' in Democracy/Scripts/MarkdownDeepEditor.js:680", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in Democracy/Scripts/MarkdownDeepEditor.js:680"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e43c5e6a7ed624d5", "name": "Insecure pattern 'direct_innerhtml_assignment' in Democracy/Scripts/modernizr-2.6.2.js:851", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in Democracy/Scripts/modernizr-2.6.2.js:851"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-85ff7a4c616e75b1", "name": "Insecure pattern 'direct_innerhtml_assignment' in Democracy/Scripts/respond.js:33", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in Democracy/Scripts/respond.js:33"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d95bd12c2d2f2441", "name": "Insecure pattern 'new_function_used' in Democracy/Scripts/jquery-1.10.2.js:583", "shortDescription": {"text": "Insecure pattern 'new_function_used' in Democracy/Scripts/jquery-1.10.2.js:583"}, "fullDescription": {"text": "Found a known-risky pattern (new_function_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c886f002d86c2a6c", "name": "Insecure pattern 'direct_innerhtml_assignment' in Democracy/Scripts/jquery-1.10.2.js:1509", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in Democracy/Scripts/jquery-1.10.2.js:1509"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4677b5ad646af23a", "name": "Insecure pattern 'direct_outerhtml_assignment' in Democracy/Scripts/jquery-1.10.2.js:6404", "shortDescription": {"text": "Insecure pattern 'direct_outerhtml_assignment' in Democracy/Scripts/jquery-1.10.2.js:6404"}, "fullDescription": {"text": "Found a known-risky pattern (direct_outerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-206a7c566335ee66", "name": "Insecure pattern 'direct_innerhtml_assignment' in Democracy/Scripts/jquery-1.10.2.min.js:21", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in Democracy/Scripts/jquery-1.10.2.min.js:21"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d7b103292825234", "name": "Insecure pattern 'direct_outerhtml_assignment' in Democracy/Scripts/jquery-1.10.2.min.js:22", "shortDescription": {"text": "Insecure pattern 'direct_outerhtml_assignment' in Democracy/Scripts/jquery-1.10.2.min.js:22"}, "fullDescription": {"text": "Found a known-risky pattern (direct_outerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-10957606b9aa4ccf", "name": "Insecure pattern 'direct_innerhtml_assignment' in Democracy/Scripts/jquery-ui-1.11.4.min.js:6", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in Democracy/Scripts/jquery-ui-1.11.4.min.js:6"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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-673fd08c667efadb", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b24d1ac2650271c9", "name": "Very large file: packages/jQuery.1.10.2/Content/Scripts/jquery-1.10.2-vsdoc.js (6747 lines)", "shortDescription": {"text": "Very large file: packages/jQuery.1.10.2/Content/Scripts/jquery-1.10.2-vsdoc.js (6747 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-e6cc1ef70f0badb4", "name": "Very large file: packages/jQuery.1.10.2/Content/Scripts/jquery-1.10.2.js (9803 lines)", "shortDescription": {"text": "Very large file: packages/jQuery.1.10.2/Content/Scripts/jquery-1.10.2.js (9803 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-2b551cf96ed98d88", "name": "Very large file: packages/jQuery.1.10.2/Tools/jquery-1.10.2.intellisense.js (2671 lines)", "shortDescription": {"text": "Very large file: packages/jQuery.1.10.2/Tools/jquery-1.10.2.intellisense.js (2671 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-998802ac747fdd1a", "name": "Very large file: packages/Modernizr.2.6.2/Content/Scripts/modernizr-2.6.2.js (1416 lines)", "shortDescription": {"text": "Very large file: packages/Modernizr.2.6.2/Content/Scripts/modernizr-2.6.2.js (1416 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-6e0acff4e90dbb8c", "name": "Very large file: packages/bootstrap.3.3.4/content/Scripts/bootstrap.js (2317 lines)", "shortDescription": {"text": "Very large file: packages/bootstrap.3.3.4/content/Scripts/bootstrap.js (2317 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-08f0bcce5e7030b7", "name": "Very large file: packages/jQuery.UI.Combined.1.11.4/Content/Scripts/jquery-ui-1.11.4.js (16616 lines)", "shortDescription": {"text": "Very large file: packages/jQuery.UI.Combined.1.11.4/Content/Scripts/jquery-ui-1.11.4.js (16616 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-e22b768fdcf4b090", "name": "Very large file: Democracy/Scripts/jquery-ui-1.11.4.js (16616 lines)", "shortDescription": {"text": "Very large file: Democracy/Scripts/jquery-ui-1.11.4.js (16616 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-72ed94a3d9c1b921", "name": "Very large file: Democracy/Scripts/MarkdownDeep.js (4381 lines)", "shortDescription": {"text": "Very large file: Democracy/Scripts/MarkdownDeep.js (4381 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-74a7c4175347d1aa", "name": "Very large file: Democracy/Scripts/jquery-1.10.2.intellisense.js (2671 lines)", "shortDescription": {"text": "Very large file: Democracy/Scripts/jquery-1.10.2.intellisense.js (2671 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-eb9e4bf09dba8f65", "name": "Very large file: Democracy/Scripts/modernizr-2.6.2.js (1416 lines)", "shortDescription": {"text": "Very large file: Democracy/Scripts/modernizr-2.6.2.js (1416 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-c6e119caf559b0d5", "name": "Very large file: Democracy/Scripts/jquery.fileupload.js (1467 lines)", "shortDescription": {"text": "Very large file: Democracy/Scripts/jquery.fileupload.js (1467 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-28f0de913f3ec62d", "name": "Very large file: Democracy/Scripts/jquery-1.10.2.js (9803 lines)", "shortDescription": {"text": "Very large file: Democracy/Scripts/jquery-1.10.2.js (9803 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-2f8cbf8e58419e2f", "name": "Very large file: Democracy/Scripts/bootstrap.js (2317 lines)", "shortDescription": {"text": "Very large file: Democracy/Scripts/bootstrap.js (2317 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": "0 test file(s) for 125 source file(s) (ratio 0.00). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2bc0ddd11b5b01d0", "name": "59 TODO/FIXME markers", "shortDescription": {"text": "59 TODO/FIXME markers"}, "fullDescription": {"text": "High count of TODO/FIXME/HACK markers \u2014 track them as issues so they're not forgotten."}, "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 19 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 207 placeholder/mock markers across 18 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-11825279136b53a3", "name": "CI is configured but no tests are detected", "shortDescription": {"text": "CI is configured but no tests are detected"}, "fullDescription": {"text": "A CI pipeline exists, but the scan found no test files to gate. Opus labeled this generated-code pattern as config theater: release machinery exists, but it has little behavioral signal."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing tests. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b6ae649c204cfa25", "name": "Agent authority lacks a verifier contract: modern-democracy/.claude/launch.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: modern-democracy/.claude/launch.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2c5f98b152cddb6d", "name": "Agent authority lacks a verifier contract: .claude/launch.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/launch.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-df7f3955add87730", "name": "Commented-code block (5 lines) in packages/jQuery.1.10.2/Content/Scripts/jquery-1.10.2.js:1599", "shortDescription": {"text": "Commented-code block (5 lines) in packages/jQuery.1.10.2/Content/Scripts/jquery-1.10.2.js:1599"}, "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-4433b65cec26c68d", "name": "Commented-code block (5 lines) in packages/Modernizr.2.6.2/Content/Scripts/modernizr-2.6.2.js:139", "shortDescription": {"text": "Commented-code block (5 lines) in packages/Modernizr.2.6.2/Content/Scripts/modernizr-2.6.2.js:139"}, "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-a3bad86f33f9e2e5", "name": "Commented-code block (5 lines) in packages/jQuery.UI.Combined.1.11.4/Content/Scripts/jquery-ui-1.11.4.js:14916", "shortDescription": {"text": "Commented-code block (5 lines) in packages/jQuery.UI.Combined.1.11.4/Content/Scripts/jquery-ui-1.11.4.js:14916"}, "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-31a96edbd3078e44", "name": "`fetch()` without try/.catch or AbortSignal \u2014 modern-democracy/server/src/services/interests.ts:35", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 modern-democracy/server/src/services/interests.ts:35"}, "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-05ece426a36f21c8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 modern-democracy/server/src/services/civic-data.ts:841", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 modern-democracy/server/src/services/civic-data.ts:841"}, "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-e2e2384fd38b391f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 modern-democracy/server/src/services/members.ts:36", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 modern-democracy/server/src/services/members.ts:36"}, "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-70a772ca91fff92c", "name": "Commented-code block (5 lines) in modern-democracy/server/src/services/polling.ts:315", "shortDescription": {"text": "Commented-code block (5 lines) in modern-democracy/server/src/services/polling.ts:315"}, "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-f3f8ee240c9a7ed2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 modern-democracy/server/src/services/divisions.ts:71", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 modern-democracy/server/src/services/divisions.ts:71"}, "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-9e108cb3210b3d36", "name": "`fetch()` without try/.catch or AbortSignal \u2014 modern-democracy/server/src/services/hansard.ts:84", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 modern-democracy/server/src/services/hansard.ts:84"}, "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-6d55e5ed7a62cb95", "name": "Commented-code block (5 lines) in modern-democracy/src/components/ConstituencyMap.tsx:152", "shortDescription": {"text": "Commented-code block (5 lines) in modern-democracy/src/components/ConstituencyMap.tsx:152"}, "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-ba60a4ce1a48dced", "name": "Commented-code block (6 lines) in modern-democracy/src/components/LandingArt.tsx:84", "shortDescription": {"text": "Commented-code block (6 lines) in modern-democracy/src/components/LandingArt.tsx:84"}, "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-def07b01ff4be571", "name": "`fetch()` without try/.catch or AbortSignal \u2014 modern-democracy/src/components/LandingArt.tsx:73", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 modern-democracy/src/components/LandingArt.tsx:73"}, "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-0ad2d4e7c7b5b1b3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 modern-democracy/src/lib/api.ts:270", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 modern-democracy/src/lib/api.ts:270"}, "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-9190f4a6cb32ce6f", "name": "Commented-code block (5 lines) in Democracy/Scripts/jquery-ui-1.11.4.js:14916", "shortDescription": {"text": "Commented-code block (5 lines) in Democracy/Scripts/jquery-ui-1.11.4.js:14916"}, "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-ff673b84b5c47dc9", "name": "Commented-code block (5 lines) in Democracy/Scripts/MarkdownDeep.js:3923", "shortDescription": {"text": "Commented-code block (5 lines) in Democracy/Scripts/MarkdownDeep.js:3923"}, "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-3501d4b35d246587", "name": "Commented-code block (8 lines) in Democracy/Scripts/jquery.iframe-transport.js:30", "shortDescription": {"text": "Commented-code block (8 lines) in Democracy/Scripts/jquery.iframe-transport.js:30"}, "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-be7acf80302bbb93", "name": "Commented-code block (5 lines) in Democracy/Scripts/modernizr-2.6.2.js:139", "shortDescription": {"text": "Commented-code block (5 lines) in Democracy/Scripts/modernizr-2.6.2.js:139"}, "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-f9c6e4cfef56c2d7", "name": "Commented-code block (5 lines) in Democracy/Scripts/jquery.fileupload.js:48", "shortDescription": {"text": "Commented-code block (5 lines) in Democracy/Scripts/jquery.fileupload.js: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-b2eb733b87313230", "name": "Commented-code block (5 lines) in Democracy/Scripts/jquery-1.10.2.js:1599", "shortDescription": {"text": "Commented-code block (5 lines) in Democracy/Scripts/jquery-1.10.2.js:1599"}, "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-a2b2e5a48ab0fbb0", "name": "Dangling fetch: GET https://www.gov.uk/api/content/government/organisations/${govukSlug} (modern-democracy/server/src/se", "shortDescription": {"text": "Dangling fetch: GET https://www.gov.uk/api/content/government/organisations/${govukSlug} (modern-democracy/server/src/services/departments.ts:194)"}, "fullDescription": {"text": "`modern-democracy/server/src/services/departments.ts:194` calls `GET https://www.gov.uk/api/content/government/organisations/${govukSlug}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/www.gov.uk/api/content/government/organisations/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-070fed5fa34bd16e", "name": "Dangling fetch: GET /uk-constituency-map.svg (modern-democracy/src/components/LocalAreaMap.tsx:86)", "shortDescription": {"text": "Dangling fetch: GET /uk-constituency-map.svg (modern-democracy/src/components/LocalAreaMap.tsx:86)"}, "fullDescription": {"text": "`modern-democracy/src/components/LocalAreaMap.tsx:86` calls `GET /uk-constituency-map.svg` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/uk-constituency-map.svg`\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-61d9327857702d44", "name": "Dangling fetch: GET /uk-constituency-map.svg (modern-democracy/src/components/ConstituencyMap.tsx:409)", "shortDescription": {"text": "Dangling fetch: GET /uk-constituency-map.svg (modern-democracy/src/components/ConstituencyMap.tsx:409)"}, "fullDescription": {"text": "`modern-democracy/src/components/ConstituencyMap.tsx:409` calls `GET /uk-constituency-map.svg` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/uk-constituency-map.svg`\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-1959b1a21bc2f470", "name": "Dangling fetch: GET /uk-constituency-map.svg (modern-democracy/src/components/LandingArt.tsx:73)", "shortDescription": {"text": "Dangling fetch: GET /uk-constituency-map.svg (modern-democracy/src/components/LandingArt.tsx:73)"}, "fullDescription": {"text": "`modern-democracy/src/components/LandingArt.tsx:73` calls `GET /uk-constituency-map.svg` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/uk-constituency-map.svg`\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-4756b4c4da7d2088", "name": "Unused endpoint: GET /api/health", "shortDescription": {"text": "Unused endpoint: GET /api/health"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `GET /api/health` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-963710f42a2c8219", "name": "Unused endpoint: GET /api/status", "shortDescription": {"text": "Unused endpoint: GET /api/status"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `GET /api/status` 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-6d6f31dfb0658e39", "name": "Unused endpoint: GET /api/civic/sources", "shortDescription": {"text": "Unused endpoint: GET /api/civic/sources"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `GET /api/civic/sources` 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-b62e5f8fb92e3f12", "name": "Unused endpoint: GET /api/civic/local", "shortDescription": {"text": "Unused endpoint: GET /api/civic/local"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `GET /api/civic/local` 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-0add9645d139ff53", "name": "Unused endpoint: GET /api/civic/fiscal", "shortDescription": {"text": "Unused endpoint: GET /api/civic/fiscal"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `GET /api/civic/fiscal` 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-c661d46b0742f275", "name": "Unused endpoint: GET /api/civic/postcode/:postcode", "shortDescription": {"text": "Unused endpoint: GET /api/civic/postcode/:postcode"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `GET /api/civic/postcode/:postcode` 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-57e2525cfad1c065", "name": "Unused endpoint: POST /api/admin/import/civic-data", "shortDescription": {"text": "Unused endpoint: POST /api/admin/import/civic-data"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `POST /api/admin/import/civic-data` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-32167a8b7125c322", "name": "Unused endpoint: GET /api/bills/stats", "shortDescription": {"text": "Unused endpoint: GET /api/bills/stats"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `GET /api/bills/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-8cd4b543f904dd29", "name": "Unused endpoint: GET /api/bills", "shortDescription": {"text": "Unused endpoint: GET /api/bills"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `GET /api/bills` 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-7616098e9ed5deaf", "name": "Unused endpoint: GET /api/bills/:id", "shortDescription": {"text": "Unused endpoint: GET /api/bills/:id"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `GET /api/bills/: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-dc2c673ec177f66d", "name": "Unused endpoint: GET /api/bills/:id/aggregates", "shortDescription": {"text": "Unused endpoint: GET /api/bills/:id/aggregates"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `GET /api/bills/:id/aggregates` 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-157d6610d43c3378", "name": "Unused endpoint: POST /api/bills/:id/analyze", "shortDescription": {"text": "Unused endpoint: POST /api/bills/:id/analyze"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `POST /api/bills/:id/analyze` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4e6d708130ff8ae5", "name": "Unused endpoint: GET /api/map/bindings", "shortDescription": {"text": "Unused endpoint: GET /api/map/bindings"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `GET /api/map/bindings` 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-af99fe13ada6963a", "name": "Unused endpoint: GET /api/constituencies", "shortDescription": {"text": "Unused endpoint: GET /api/constituencies"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `GET /api/constituencies` 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-3aa6558ce5d071d2", "name": "Unused endpoint: GET /api/constituencies/:id/profile", "shortDescription": {"text": "Unused endpoint: GET /api/constituencies/:id/profile"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `GET /api/constituencies/:id/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-6059f1b9bdfad444", "name": "Unused endpoint: GET /api/representatives", "shortDescription": {"text": "Unused endpoint: GET /api/representatives"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `GET /api/representatives` 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-a095690650a99db3", "name": "Unused endpoint: GET /api/representatives/:id", "shortDescription": {"text": "Unused endpoint: GET /api/representatives/:id"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `GET /api/representatives/: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-8a89c5360b2e2def", "name": "Unused endpoint: GET /api/representatives/:id/interests", "shortDescription": {"text": "Unused endpoint: GET /api/representatives/:id/interests"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `GET /api/representatives/:id/interests` 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-e52d457e970d8566", "name": "Unused endpoint: GET /api/departments", "shortDescription": {"text": "Unused endpoint: GET /api/departments"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `GET /api/departments` 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-fcd2448e35404eb3", "name": "Unused endpoint: GET /api/departments/:slug", "shortDescription": {"text": "Unused endpoint: GET /api/departments/:slug"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `GET /api/departments/:slug` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2f1f6955f3bc0462", "name": "Unused endpoint: GET /api/parties", "shortDescription": {"text": "Unused endpoint: GET /api/parties"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `GET /api/parties` 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-b2e6dfd5425b59a4", "name": "Unused endpoint: GET /api/parties/:id/news", "shortDescription": {"text": "Unused endpoint: GET /api/parties/:id/news"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `GET /api/parties/:id/news` 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-edf999a673c07347", "name": "Unused endpoint: GET /api/parties/:id/coverage", "shortDescription": {"text": "Unused endpoint: GET /api/parties/:id/coverage"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `GET /api/parties/:id/coverage` 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-082b8c93f8cb444e", "name": "Unused endpoint: GET /api/constituencies/:id/elections", "shortDescription": {"text": "Unused endpoint: GET /api/constituencies/:id/elections"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `GET /api/constituencies/:id/elections` 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-0697af538652bcd2", "name": "Unused endpoint: GET /api/insights/media", "shortDescription": {"text": "Unused endpoint: GET /api/insights/media"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `GET /api/insights/media` 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-034c37edfe9cee2b", "name": "Unused endpoint: GET /api/insights/media-influence", "shortDescription": {"text": "Unused endpoint: GET /api/insights/media-influence"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `GET /api/insights/media-influence` 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-23deb72c1ad38ba7", "name": "Unused endpoint: GET /api/insights/media-metrics", "shortDescription": {"text": "Unused endpoint: GET /api/insights/media-metrics"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `GET /api/insights/media-metrics` 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-c5c4b10d804f98e1", "name": "Unused endpoint: GET /api/insights/party-popularity", "shortDescription": {"text": "Unused endpoint: GET /api/insights/party-popularity"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `GET /api/insights/party-popularity` 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-f90f786ce88d945d", "name": "Unused endpoint: GET /api/insights/national-compass", "shortDescription": {"text": "Unused endpoint: GET /api/insights/national-compass"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `GET /api/insights/national-compass` 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-2be474d969510734", "name": "Unused endpoint: GET /api/insights/media-articles", "shortDescription": {"text": "Unused endpoint: GET /api/insights/media-articles"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `GET /api/insights/media-articles` 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-c8bd05a80b717a1a", "name": "Unused endpoint: GET /api/insights/ballots", "shortDescription": {"text": "Unused endpoint: GET /api/insights/ballots"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `GET /api/insights/ballots` 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-c3a683e1eb6a35ef", "name": "Unused endpoint: GET /api/insights/leans", "shortDescription": {"text": "Unused endpoint: GET /api/insights/leans"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `GET /api/insights/leans` 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-40fa4212c33b1b7a", "name": "Unused endpoint: GET /api/insights/polling", "shortDescription": {"text": "Unused endpoint: GET /api/insights/polling"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `GET /api/insights/polling` 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-a420b0e6af0dc0b8", "name": "Unused endpoint: GET /api/insights/polling/trend", "shortDescription": {"text": "Unused endpoint: GET /api/insights/polling/trend"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `GET /api/insights/polling/trend` 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-e76667ec5b0a94f3", "name": "Unused endpoint: GET /api/insights/leader-approval", "shortDescription": {"text": "Unused endpoint: GET /api/insights/leader-approval"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `GET /api/insights/leader-approval` 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-9c37387ade0cdc3d", "name": "Unused endpoint: GET /api/insights/mrp", "shortDescription": {"text": "Unused endpoint: GET /api/insights/mrp"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `GET /api/insights/mrp` 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-5262cf18af0a69b3", "name": "Unused endpoint: GET /api/petitions", "shortDescription": {"text": "Unused endpoint: GET /api/petitions"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `GET /api/petitions` 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-cffb63c81edcb39f", "name": "Unused endpoint: GET /api/petitions/:id", "shortDescription": {"text": "Unused endpoint: GET /api/petitions/:id"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `GET /api/petitions/: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-95b6bac4252dbbaf", "name": "Unused endpoint: POST /api/petitions/:id/vote", "shortDescription": {"text": "Unused endpoint: POST /api/petitions/:id/vote"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `POST /api/petitions/: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-1b557869aef704ca", "name": "Unused endpoint: POST /api/petitions/:id/debate", "shortDescription": {"text": "Unused endpoint: POST /api/petitions/:id/debate"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `POST /api/petitions/:id/debate` 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-3162732fa329429f", "name": "Unused endpoint: GET /api/postcode/:postcode", "shortDescription": {"text": "Unused endpoint: GET /api/postcode/:postcode"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `GET /api/postcode/:postcode` 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-a5b3437e64c8f7b4", "name": "Unused endpoint: POST /api/auth/register", "shortDescription": {"text": "Unused endpoint: POST /api/auth/register"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `POST /api/auth/register` 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-fd55aa0818a7c897", "name": "Unused endpoint: POST /api/auth/login", "shortDescription": {"text": "Unused endpoint: POST /api/auth/login"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `POST /api/auth/login` 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-ee4aa5ddab88c9dc", "name": "Unused endpoint: GET /api/auth/me", "shortDescription": {"text": "Unused endpoint: GET /api/auth/me"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `GET /api/auth/me` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6462b053bce69715", "name": "Unused endpoint: POST /api/auth/verify", "shortDescription": {"text": "Unused endpoint: POST /api/auth/verify"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `POST /api/auth/verify` 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-9f8936a1cad1ac0b", "name": "Unused endpoint: POST /api/bills/:id/credential", "shortDescription": {"text": "Unused endpoint: POST /api/bills/:id/credential"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `POST /api/bills/:id/credential` 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-21e26062e2935bf9", "name": "Unused endpoint: POST /api/bills/:id/ballots", "shortDescription": {"text": "Unused endpoint: POST /api/bills/:id/ballots"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `POST /api/bills/:id/ballots` 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-2eef4ef70c21373c", "name": "Unused endpoint: GET /api/receipts/:code/verify", "shortDescription": {"text": "Unused endpoint: GET /api/receipts/:code/verify"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `GET /api/receipts/:code/verify` 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-1e456eddee117a42", "name": "Unused endpoint: GET /api/checkpoints", "shortDescription": {"text": "Unused endpoint: GET /api/checkpoints"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `GET /api/checkpoints` 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-935bfd923ef6af15", "name": "Unused endpoint: GET /api/bills/:id/debate", "shortDescription": {"text": "Unused endpoint: GET /api/bills/:id/debate"}, "fullDescription": {"text": "`modern-democracy/server/src/routes.ts` declares `GET /api/bills/:id/debate` 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/17737"}, "properties": {"repository": "radicalgeek/Democracy", "repoUrl": "https://github.com/radicalgeek/Democracy", "branch": "main"}, "results": [{"ruleId": "scanner-b08db7d80553ba28", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 packages/Modernizr.2.6.2/Content/Scripts/modernizr-2.6.2.js:79"}, "properties": {"repobilityId": "f160991c2f8e9f96", "scanner": "scanner-primary", "fingerprint": "b08db7d80553ba28", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-d9015adb573f0343", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 packages/jQuery.UI.Combined.1.11.4/Content/Scripts/jquery-ui-1.11.4.js:425"}, "properties": {"repobilityId": "75cf26d5f5195fc6", "scanner": "scanner-primary", "fingerprint": "d9015adb573f0343", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-c5aaff09024fcabd", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 packages/jQuery.Validation.1.11.1/Content/Scripts/jquery.validate.js:1125"}, "properties": {"repobilityId": "4fc74cd953a73793", "scanner": "scanner-primary", "fingerprint": "c5aaff09024fcabd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-5fc43f9263271463", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/jQuery.Validation.1.11.1/Content/Scripts/jquery.validate.js:584"}, "properties": {"repobilityId": "43aa0c88cda829bb", "scanner": "scanner-primary", "fingerprint": "5fc43f9263271463", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c08ee09ead45c0b4", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 packages/jQuery.Validation.1.11.1/Content/Scripts/jquery.validate-vsdoc.js:1210"}, "properties": {"repobilityId": "26efc14712dd11ff", "scanner": "scanner-primary", "fingerprint": "c08ee09ead45c0b4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-9eb84fc19e0cd9fb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/jQuery.Validation.1.11.1/Content/Scripts/jquery.validate-vsdoc.js:625"}, "properties": {"repobilityId": "bea25af6c7438953", "scanner": "scanner-primary", "fingerprint": "9eb84fc19e0cd9fb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-16614c1f96557487", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/jQuery.Validation.1.11.1/Content/Scripts/jquery.validate.min.js:16"}, "properties": {"repobilityId": "b0e4c5576c119e64", "scanner": "scanner-primary", "fingerprint": "16614c1f96557487", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-072db34d2963a23c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 modern-democracy/server/src/seed-demo.ts:18"}, "properties": {"repobilityId": "0a2e5d6e7b1a3127", "scanner": "scanner-primary", "fingerprint": "072db34d2963a23c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-504a5eef53f0d3a4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 modern-democracy/server/src/worker.ts:21"}, "properties": {"repobilityId": "ecec76382651c31c", "scanner": "scanner-primary", "fingerprint": "504a5eef53f0d3a4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-839cdbb33e37dc3d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 modern-democracy/server/src/services/demo-community.ts:235"}, "properties": {"repobilityId": "d7aa8440cccea10a", "scanner": "scanner-primary", "fingerprint": "839cdbb33e37dc3d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d486b06c2ad2722b", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 modern-democracy/src/components/LandingArt.tsx:78"}, "properties": {"repobilityId": "9c856ad6d36ddbc3", "scanner": "scanner-primary", "fingerprint": "d486b06c2ad2722b", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-ca0af2af8b58f7b3", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 Democracy/Scripts/jquery-ui-1.11.4.js:425"}, "properties": {"repobilityId": "aa5e05130edef6c5", "scanner": "scanner-primary", "fingerprint": "ca0af2af8b58f7b3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-6f287d5911483ba0", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 Democracy/Scripts/jquery.validate.js:1125"}, "properties": {"repobilityId": "dd220c2540fb3420", "scanner": "scanner-primary", "fingerprint": "6f287d5911483ba0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-43b8158bc1a3933f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 Democracy/Scripts/jquery.validate.js:584"}, "properties": {"repobilityId": "c7c0e66db9e37c51", "scanner": "scanner-primary", "fingerprint": "43b8158bc1a3933f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0e15faff0e67a80a", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 Democracy/Scripts/modernizr-2.6.2.js:79"}, "properties": {"repobilityId": "bc30053849930727", "scanner": "scanner-primary", "fingerprint": "0e15faff0e67a80a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-61bfcca2eb99aaa2", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 Democracy/Scripts/jquery.validate-vsdoc.js:1210"}, "properties": {"repobilityId": "0eced35642f5319c", "scanner": "scanner-primary", "fingerprint": "61bfcca2eb99aaa2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-03f6a71a1c8f8b1f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 Democracy/Scripts/jquery.validate-vsdoc.js:625"}, "properties": {"repobilityId": "fa8b87e6ea8afc0d", "scanner": "scanner-primary", "fingerprint": "03f6a71a1c8f8b1f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-92e7bc45d318438a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 Democracy/Scripts/jquery.validate.min.js:16"}, "properties": {"repobilityId": "5b7c8ddf27fd787d", "scanner": "scanner-primary", "fingerprint": "92e7bc45d318438a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b4512cd5f61cf08d", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 Democracy/Scripts/jquery.ui.widget.js:136"}, "properties": {"repobilityId": "4d4aa81016527c8a", "scanner": "scanner-primary", "fingerprint": "b4512cd5f61cf08d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-93640b049e4697e7", "level": "warning", "message": {"text": "Dockerfile runs as root: modern-democracy/Dockerfile"}, "properties": {"repobilityId": "90a0efabec41a119", "scanner": "scanner-primary", "fingerprint": "93640b049e4697e7", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-b63a1ad3517f297d", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine"}, "properties": {"repobilityId": "e0e787375b165c6f", "scanner": "scanner-primary", "fingerprint": "b63a1ad3517f297d", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "modern-democracy/Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b63a1ad3517f297d", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine"}, "properties": {"repobilityId": "8789d617f1365270", "scanner": "scanner-primary", "fingerprint": "b63a1ad3517f297d", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "modern-democracy/Dockerfile"}, "region": {"startLine": 5}}}]}, {"ruleId": "scanner-b63a1ad3517f297d", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine"}, "properties": {"repobilityId": "0d977492d35da14b", "scanner": "scanner-primary", "fingerprint": "b63a1ad3517f297d", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "modern-democracy/Dockerfile"}, "region": {"startLine": 13}}}]}, {"ruleId": "scanner-9e48713adb23afdc", "level": "warning", "message": {"text": "Dockerfile runs as root: modern-democracy/server/Dockerfile"}, "properties": {"repobilityId": "34c5365f946ba50f", "scanner": "scanner-primary", "fingerprint": "9e48713adb23afdc", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-c9c46176ad7511d7", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine"}, "properties": {"repobilityId": "d75381aa2dae2506", "scanner": "scanner-primary", "fingerprint": "c9c46176ad7511d7", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "modern-democracy/server/Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c9c46176ad7511d7", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine"}, "properties": {"repobilityId": "5e53bae0cf075941", "scanner": "scanner-primary", "fingerprint": "c9c46176ad7511d7", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "modern-democracy/server/Dockerfile"}, "region": {"startLine": 9}}}]}, {"ruleId": "scanner-9710c8d059e53154", "level": "none", "message": {"text": "No frontend routes/components detected"}, "properties": {"repobilityId": "44ca61485762e494", "scanner": "scanner-primary", "fingerprint": "9710c8d059e53154", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-489df86216551dfc", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in packages/jQuery.1.10.2/Content/Scripts/jquery-1.10.2-vsdoc.js:2316"}, "properties": {"repobilityId": "5d3b7ac11b1bba89", "scanner": "scanner-primary", "fingerprint": "489df86216551dfc", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/jQuery.1.10.2/Content/Scripts/jquery-1.10.2-vsdoc.js"}, "region": {"startLine": 2316}}}]}, {"ruleId": "scanner-44b4ce6b80014c00", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in packages/jQuery.1.10.2/Content/Scripts/jquery-1.10.2-vsdoc.js:1131"}, "properties": {"repobilityId": "8953f3b4f141cc7f", "scanner": "scanner-primary", "fingerprint": "44b4ce6b80014c00", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/jQuery.1.10.2/Content/Scripts/jquery-1.10.2-vsdoc.js"}, "region": {"startLine": 1131}}}]}, {"ruleId": "scanner-21fc5341236f5ea5", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in packages/jQuery.1.10.2/Content/Scripts/jquery-1.10.2.js:583"}, "properties": {"repobilityId": "3004ffc08541d9e9", "scanner": "scanner-primary", "fingerprint": "21fc5341236f5ea5", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/jQuery.1.10.2/Content/Scripts/jquery-1.10.2.js"}, "region": {"startLine": 583}}}]}, {"ruleId": "scanner-60215aa76874fa4e", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in packages/jQuery.1.10.2/Content/Scripts/jquery-1.10.2.js:1509"}, "properties": {"repobilityId": "613e53a8a9b04d34", "scanner": "scanner-primary", "fingerprint": "60215aa76874fa4e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/jQuery.1.10.2/Content/Scripts/jquery-1.10.2.js"}, "region": {"startLine": 1509}}}]}, {"ruleId": "scanner-00398627ca468233", "level": "warning", "message": {"text": "Insecure pattern 'direct_outerhtml_assignment' in packages/jQuery.1.10.2/Content/Scripts/jquery-1.10.2.js:6404"}, "properties": {"repobilityId": "f7b9cdb7734837ec", "scanner": "scanner-primary", "fingerprint": "00398627ca468233", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_outerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/jQuery.1.10.2/Content/Scripts/jquery-1.10.2.js"}, "region": {"startLine": 6404}}}]}, {"ruleId": "scanner-e25b89cabef0e7fe", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in packages/jQuery.1.10.2/Content/Scripts/jquery-1.10.2.min.js:21"}, "properties": {"repobilityId": "3e1b9b95c737cc50", "scanner": "scanner-primary", "fingerprint": "e25b89cabef0e7fe", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/jQuery.1.10.2/Content/Scripts/jquery-1.10.2.min.js"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-3bdcff607f17781f", "level": "warning", "message": {"text": "Insecure pattern 'direct_outerhtml_assignment' in packages/jQuery.1.10.2/Content/Scripts/jquery-1.10.2.min.js:22"}, "properties": {"repobilityId": "491674522f3b36cd", "scanner": "scanner-primary", "fingerprint": "3bdcff607f17781f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_outerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/jQuery.1.10.2/Content/Scripts/jquery-1.10.2.min.js"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-076a8731656b850d", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in packages/Modernizr.2.6.2/Content/Scripts/modernizr-2.6.2.js:851"}, "properties": {"repobilityId": "b5f29e2dec6fb4de", "scanner": "scanner-primary", "fingerprint": "076a8731656b850d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/Modernizr.2.6.2/Content/Scripts/modernizr-2.6.2.js"}, "region": {"startLine": 851}}}]}, {"ruleId": "scanner-af774f52eafcb896", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in packages/jQuery.UI.Combined.1.11.4/Content/Scripts/jquery-ui-1.11.4.js:1543"}, "properties": {"repobilityId": "9bab25d52c1b0319", "scanner": "scanner-primary", "fingerprint": "af774f52eafcb896", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/jQuery.UI.Combined.1.11.4/Content/Scripts/jquery-ui-1.11.4.js"}, "region": {"startLine": 1543}}}]}, {"ruleId": "scanner-545e0e890cc4b857", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in packages/jQuery.UI.Combined.1.11.4/Content/Scripts/jquery-ui-1.11.4.min.js:6"}, "properties": {"repobilityId": "6083e5232d5e11bd", "scanner": "scanner-primary", "fingerprint": "545e0e890cc4b857", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/jQuery.UI.Combined.1.11.4/Content/Scripts/jquery-ui-1.11.4.min.js"}, "region": {"startLine": 6}}}]}, {"ruleId": "scanner-d173785efd0a86a1", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in packages/Respond.1.2.0/content/Scripts/respond.min.js:17"}, "properties": {"repobilityId": "775b194efb3aa56c", "scanner": "scanner-primary", "fingerprint": "d173785efd0a86a1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/Respond.1.2.0/content/Scripts/respond.min.js"}, "region": {"startLine": 17}}}]}, {"ruleId": "scanner-9de49396e0c4c3ae", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in packages/Respond.1.2.0/content/Scripts/respond.js:33"}, "properties": {"repobilityId": "6931bb7b283e1052", "scanner": "scanner-primary", "fingerprint": "9de49396e0c4c3ae", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/Respond.1.2.0/content/Scripts/respond.js"}, "region": {"startLine": 33}}}]}, {"ruleId": "scanner-e0c8bfa7aacc46e9", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in modern-democracy/src/components/LocalAreaMap.tsx:101"}, "properties": {"repobilityId": "a13d9a3f34c809fe", "scanner": "scanner-primary", "fingerprint": "e0c8bfa7aacc46e9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "modern-democracy/src/components/LocalAreaMap.tsx"}, "region": {"startLine": 101}}}]}, {"ruleId": "scanner-c3fd34ff23c19f43", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in modern-democracy/src/components/ConstituencyMap.tsx:440"}, "properties": {"repobilityId": "1f244c5c6a4f32a8", "scanner": "scanner-primary", "fingerprint": "c3fd34ff23c19f43", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "modern-democracy/src/components/ConstituencyMap.tsx"}, "region": {"startLine": 440}}}]}, {"ruleId": "scanner-768f53ea2b442cee", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in modern-democracy/src/components/LandingArt.tsx:80"}, "properties": {"repobilityId": "4b80193e6ebb210d", "scanner": "scanner-primary", "fingerprint": "768f53ea2b442cee", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "modern-democracy/src/components/LandingArt.tsx"}, "region": {"startLine": 80}}}]}, {"ruleId": "scanner-8e8984cc4f919c7a", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in Democracy/Scripts/respond.min.js:17"}, "properties": {"repobilityId": "de111bef6f190fe0", "scanner": "scanner-primary", "fingerprint": "8e8984cc4f919c7a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Democracy/Scripts/respond.min.js"}, "region": {"startLine": 17}}}]}, {"ruleId": "scanner-5dbf6fecf950f621", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in Democracy/Scripts/jquery-ui-1.11.4.js:1543"}, "properties": {"repobilityId": "c6d9b38d881417da", "scanner": "scanner-primary", "fingerprint": "5dbf6fecf950f621", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Democracy/Scripts/jquery-ui-1.11.4.js"}, "region": {"startLine": 1543}}}]}, {"ruleId": "scanner-1a07570f05f1a3bf", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in Democracy/Scripts/MarkdownDeepEditor.js:680"}, "properties": {"repobilityId": "57b83e9020c548be", "scanner": "scanner-primary", "fingerprint": "1a07570f05f1a3bf", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Democracy/Scripts/MarkdownDeepEditor.js"}, "region": {"startLine": 680}}}]}, {"ruleId": "scanner-e43c5e6a7ed624d5", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in Democracy/Scripts/modernizr-2.6.2.js:851"}, "properties": {"repobilityId": "de8e812aadeb2488", "scanner": "scanner-primary", "fingerprint": "e43c5e6a7ed624d5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Democracy/Scripts/modernizr-2.6.2.js"}, "region": {"startLine": 851}}}]}, {"ruleId": "scanner-85ff7a4c616e75b1", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in Democracy/Scripts/respond.js:33"}, "properties": {"repobilityId": "7a0b2f4cffb1b4f9", "scanner": "scanner-primary", "fingerprint": "85ff7a4c616e75b1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Democracy/Scripts/respond.js"}, "region": {"startLine": 33}}}]}, {"ruleId": "scanner-d95bd12c2d2f2441", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in Democracy/Scripts/jquery-1.10.2.js:583"}, "properties": {"repobilityId": "ec82f90e3a330976", "scanner": "scanner-primary", "fingerprint": "d95bd12c2d2f2441", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Democracy/Scripts/jquery-1.10.2.js"}, "region": {"startLine": 583}}}]}, {"ruleId": "scanner-c886f002d86c2a6c", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in Democracy/Scripts/jquery-1.10.2.js:1509"}, "properties": {"repobilityId": "07b939e550e42f49", "scanner": "scanner-primary", "fingerprint": "c886f002d86c2a6c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Democracy/Scripts/jquery-1.10.2.js"}, "region": {"startLine": 1509}}}]}, {"ruleId": "scanner-4677b5ad646af23a", "level": "warning", "message": {"text": "Insecure pattern 'direct_outerhtml_assignment' in Democracy/Scripts/jquery-1.10.2.js:6404"}, "properties": {"repobilityId": "a678480d8fc581d2", "scanner": "scanner-primary", "fingerprint": "4677b5ad646af23a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_outerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Democracy/Scripts/jquery-1.10.2.js"}, "region": {"startLine": 6404}}}]}, {"ruleId": "scanner-206a7c566335ee66", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in Democracy/Scripts/jquery-1.10.2.min.js:21"}, "properties": {"repobilityId": "9e350001898c2849", "scanner": "scanner-primary", "fingerprint": "206a7c566335ee66", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Democracy/Scripts/jquery-1.10.2.min.js"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-2d7b103292825234", "level": "warning", "message": {"text": "Insecure pattern 'direct_outerhtml_assignment' in Democracy/Scripts/jquery-1.10.2.min.js:22"}, "properties": {"repobilityId": "ea5c85b127fde66e", "scanner": "scanner-primary", "fingerprint": "2d7b103292825234", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_outerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Democracy/Scripts/jquery-1.10.2.min.js"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-10957606b9aa4ccf", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in Democracy/Scripts/jquery-ui-1.11.4.min.js:6"}, "properties": {"repobilityId": "6f5fb433af358712", "scanner": "scanner-primary", "fingerprint": "10957606b9aa4ccf", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Democracy/Scripts/jquery-ui-1.11.4.min.js"}, "region": {"startLine": 6}}}]}, {"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-673fd08c667efadb", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "30ccbe03d3acd7cd", "scanner": "scanner-primary", "fingerprint": "673fd08c667efadb", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/build-images.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b24d1ac2650271c9", "level": "note", "message": {"text": "Very large file: packages/jQuery.1.10.2/Content/Scripts/jquery-1.10.2-vsdoc.js (6747 lines)"}, "properties": {"repobilityId": "38ac6a5ed7e802e3", "scanner": "scanner-primary", "fingerprint": "b24d1ac2650271c9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e6cc1ef70f0badb4", "level": "note", "message": {"text": "Very large file: packages/jQuery.1.10.2/Content/Scripts/jquery-1.10.2.js (9803 lines)"}, "properties": {"repobilityId": "6bdf64bdc32947be", "scanner": "scanner-primary", "fingerprint": "e6cc1ef70f0badb4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-2b551cf96ed98d88", "level": "note", "message": {"text": "Very large file: packages/jQuery.1.10.2/Tools/jquery-1.10.2.intellisense.js (2671 lines)"}, "properties": {"repobilityId": "eb2bc26f119def9e", "scanner": "scanner-primary", "fingerprint": "2b551cf96ed98d88", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-998802ac747fdd1a", "level": "note", "message": {"text": "Very large file: packages/Modernizr.2.6.2/Content/Scripts/modernizr-2.6.2.js (1416 lines)"}, "properties": {"repobilityId": "91c674e3e1fe8c2c", "scanner": "scanner-primary", "fingerprint": "998802ac747fdd1a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6e0acff4e90dbb8c", "level": "note", "message": {"text": "Very large file: packages/bootstrap.3.3.4/content/Scripts/bootstrap.js (2317 lines)"}, "properties": {"repobilityId": "712dc0579e432bdf", "scanner": "scanner-primary", "fingerprint": "6e0acff4e90dbb8c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-08f0bcce5e7030b7", "level": "note", "message": {"text": "Very large file: packages/jQuery.UI.Combined.1.11.4/Content/Scripts/jquery-ui-1.11.4.js (16616 lines)"}, "properties": {"repobilityId": "cee1f6c9041484d2", "scanner": "scanner-primary", "fingerprint": "08f0bcce5e7030b7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e22b768fdcf4b090", "level": "note", "message": {"text": "Very large file: Democracy/Scripts/jquery-ui-1.11.4.js (16616 lines)"}, "properties": {"repobilityId": "c3328bd877dec74b", "scanner": "scanner-primary", "fingerprint": "e22b768fdcf4b090", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-72ed94a3d9c1b921", "level": "note", "message": {"text": "Very large file: Democracy/Scripts/MarkdownDeep.js (4381 lines)"}, "properties": {"repobilityId": "69e3649338a64acc", "scanner": "scanner-primary", "fingerprint": "72ed94a3d9c1b921", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-74a7c4175347d1aa", "level": "note", "message": {"text": "Very large file: Democracy/Scripts/jquery-1.10.2.intellisense.js (2671 lines)"}, "properties": {"repobilityId": "8b140e239a2fbdea", "scanner": "scanner-primary", "fingerprint": "74a7c4175347d1aa", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-eb9e4bf09dba8f65", "level": "note", "message": {"text": "Very large file: Democracy/Scripts/modernizr-2.6.2.js (1416 lines)"}, "properties": {"repobilityId": "9bb24c0a563c0cd6", "scanner": "scanner-primary", "fingerprint": "eb9e4bf09dba8f65", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c6e119caf559b0d5", "level": "note", "message": {"text": "Very large file: Democracy/Scripts/jquery.fileupload.js (1467 lines)"}, "properties": {"repobilityId": "2b4f404b2705f56a", "scanner": "scanner-primary", "fingerprint": "c6e119caf559b0d5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-28f0de913f3ec62d", "level": "note", "message": {"text": "Very large file: Democracy/Scripts/jquery-1.10.2.js (9803 lines)"}, "properties": {"repobilityId": "f32f2b97aac99f57", "scanner": "scanner-primary", "fingerprint": "28f0de913f3ec62d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-2f8cbf8e58419e2f", "level": "note", "message": {"text": "Very large file: Democracy/Scripts/bootstrap.js (2317 lines)"}, "properties": {"repobilityId": "9fa13fb6199daa7d", "scanner": "scanner-primary", "fingerprint": "2f8cbf8e58419e2f", "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-2bc0ddd11b5b01d0", "level": "note", "message": {"text": "59 TODO/FIXME markers"}, "properties": {"repobilityId": "4b38c118003e07d2", "scanner": "scanner-primary", "fingerprint": "2bc0ddd11b5b01d0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["maintenance"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "baaf9f48e72581e8", "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": "1a76d923811e4187", "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": "eab36fae6ff42d2d", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-11825279136b53a3", "level": "warning", "message": {"text": "CI is configured but no tests are detected"}, "properties": {"repobilityId": "45676f86595cdfd3", "scanner": "scanner-primary", "fingerprint": "11825279136b53a3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "ci", "config-theater", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "b7d8565c10148c78", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "39002371ac0e4c54", "scanner": "scanner-primary", "fingerprint": "ea8f3013f588db25", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-8424db9c75e04ba4", "level": "none", "message": {"text": "Very short observed git history"}, "properties": {"repobilityId": "7894bbf2de58d0c5", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-b6ae649c204cfa25", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: modern-democracy/.claude/launch.json"}, "properties": {"repobilityId": "0ecf9d50b59c0ddf", "scanner": "scanner-primary", "fingerprint": "b6ae649c204cfa25", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "modern-democracy/.claude/launch.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2c5f98b152cddb6d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/launch.json"}, "properties": {"repobilityId": "0de48c0f4ab303d8", "scanner": "scanner-primary", "fingerprint": "2c5f98b152cddb6d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/launch.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-df7f3955add87730", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/jQuery.1.10.2/Content/Scripts/jquery-1.10.2.js:1599"}, "properties": {"repobilityId": "6900b35833e4eafe", "scanner": "scanner-primary", "fingerprint": "df7f3955add87730", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4433b65cec26c68d", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/Modernizr.2.6.2/Content/Scripts/modernizr-2.6.2.js:139"}, "properties": {"repobilityId": "7a5d2e003c89dfe6", "scanner": "scanner-primary", "fingerprint": "4433b65cec26c68d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a3bad86f33f9e2e5", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/jQuery.UI.Combined.1.11.4/Content/Scripts/jquery-ui-1.11.4.js:14916"}, "properties": {"repobilityId": "c845e3e5b64c5d57", "scanner": "scanner-primary", "fingerprint": "a3bad86f33f9e2e5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-31a96edbd3078e44", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 modern-democracy/server/src/services/interests.ts:35"}, "properties": {"repobilityId": "3d902ef72b8f32fc", "scanner": "scanner-primary", "fingerprint": "31a96edbd3078e44", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-05ece426a36f21c8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 modern-democracy/server/src/services/civic-data.ts:841"}, "properties": {"repobilityId": "2045c55dc89d1bc5", "scanner": "scanner-primary", "fingerprint": "05ece426a36f21c8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e2e2384fd38b391f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 modern-democracy/server/src/services/members.ts:36"}, "properties": {"repobilityId": "cba6ba37b8aeed89", "scanner": "scanner-primary", "fingerprint": "e2e2384fd38b391f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-70a772ca91fff92c", "level": "none", "message": {"text": "Commented-code block (5 lines) in modern-democracy/server/src/services/polling.ts:315"}, "properties": {"repobilityId": "45f7fd9d89fc5b28", "scanner": "scanner-primary", "fingerprint": "70a772ca91fff92c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f3f8ee240c9a7ed2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 modern-democracy/server/src/services/divisions.ts:71"}, "properties": {"repobilityId": "22e0b084985faa3f", "scanner": "scanner-primary", "fingerprint": "f3f8ee240c9a7ed2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9e108cb3210b3d36", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 modern-democracy/server/src/services/hansard.ts:84"}, "properties": {"repobilityId": "4e9acd2c8ffa9c87", "scanner": "scanner-primary", "fingerprint": "9e108cb3210b3d36", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6d55e5ed7a62cb95", "level": "none", "message": {"text": "Commented-code block (5 lines) in modern-democracy/src/components/ConstituencyMap.tsx:152"}, "properties": {"repobilityId": "05c77f20c020bb59", "scanner": "scanner-primary", "fingerprint": "6d55e5ed7a62cb95", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ba60a4ce1a48dced", "level": "none", "message": {"text": "Commented-code block (6 lines) in modern-democracy/src/components/LandingArt.tsx:84"}, "properties": {"repobilityId": "6ade0504ee8f723c", "scanner": "scanner-primary", "fingerprint": "ba60a4ce1a48dced", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-def07b01ff4be571", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 modern-democracy/src/components/LandingArt.tsx:73"}, "properties": {"repobilityId": "1576c35d9dd6b952", "scanner": "scanner-primary", "fingerprint": "def07b01ff4be571", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0ad2d4e7c7b5b1b3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 modern-democracy/src/lib/api.ts:270"}, "properties": {"repobilityId": "3d4a150161ab04fb", "scanner": "scanner-primary", "fingerprint": "0ad2d4e7c7b5b1b3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9190f4a6cb32ce6f", "level": "none", "message": {"text": "Commented-code block (5 lines) in Democracy/Scripts/jquery-ui-1.11.4.js:14916"}, "properties": {"repobilityId": "163236e4ec2b959c", "scanner": "scanner-primary", "fingerprint": "9190f4a6cb32ce6f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ff673b84b5c47dc9", "level": "none", "message": {"text": "Commented-code block (5 lines) in Democracy/Scripts/MarkdownDeep.js:3923"}, "properties": {"repobilityId": "e89304923fa15ccb", "scanner": "scanner-primary", "fingerprint": "ff673b84b5c47dc9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3501d4b35d246587", "level": "none", "message": {"text": "Commented-code block (8 lines) in Democracy/Scripts/jquery.iframe-transport.js:30"}, "properties": {"repobilityId": "1c049b5b629e852d", "scanner": "scanner-primary", "fingerprint": "3501d4b35d246587", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-be7acf80302bbb93", "level": "none", "message": {"text": "Commented-code block (5 lines) in Democracy/Scripts/modernizr-2.6.2.js:139"}, "properties": {"repobilityId": "ccb0a6d822fa1537", "scanner": "scanner-primary", "fingerprint": "be7acf80302bbb93", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f9c6e4cfef56c2d7", "level": "none", "message": {"text": "Commented-code block (5 lines) in Democracy/Scripts/jquery.fileupload.js:48"}, "properties": {"repobilityId": "c5aa867f2d521f86", "scanner": "scanner-primary", "fingerprint": "f9c6e4cfef56c2d7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b2eb733b87313230", "level": "none", "message": {"text": "Commented-code block (5 lines) in Democracy/Scripts/jquery-1.10.2.js:1599"}, "properties": {"repobilityId": "f9103373cd04fdb6", "scanner": "scanner-primary", "fingerprint": "b2eb733b87313230", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a2b2e5a48ab0fbb0", "level": "error", "message": {"text": "Dangling fetch: GET https://www.gov.uk/api/content/government/organisations/${govukSlug} (modern-democracy/server/src/services/departments.ts:194)"}, "properties": {"repobilityId": "a7aae655542ba430", "scanner": "scanner-primary", "fingerprint": "a2b2e5a48ab0fbb0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-070fed5fa34bd16e", "level": "error", "message": {"text": "Dangling fetch: GET /uk-constituency-map.svg (modern-democracy/src/components/LocalAreaMap.tsx:86)"}, "properties": {"repobilityId": "17ed26331401b576", "scanner": "scanner-primary", "fingerprint": "070fed5fa34bd16e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-61d9327857702d44", "level": "error", "message": {"text": "Dangling fetch: GET /uk-constituency-map.svg (modern-democracy/src/components/ConstituencyMap.tsx:409)"}, "properties": {"repobilityId": "1cd02cf7fcf8989e", "scanner": "scanner-primary", "fingerprint": "61d9327857702d44", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1959b1a21bc2f470", "level": "error", "message": {"text": "Dangling fetch: GET /uk-constituency-map.svg (modern-democracy/src/components/LandingArt.tsx:73)"}, "properties": {"repobilityId": "d5f21fc209fc64a1", "scanner": "scanner-primary", "fingerprint": "1959b1a21bc2f470", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4756b4c4da7d2088", "level": "note", "message": {"text": "Unused endpoint: GET /api/health"}, "properties": {"repobilityId": "dfe19531d251b010", "scanner": "scanner-primary", "fingerprint": "4756b4c4da7d2088", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-963710f42a2c8219", "level": "note", "message": {"text": "Unused endpoint: GET /api/status"}, "properties": {"repobilityId": "74fd425fd6420161", "scanner": "scanner-primary", "fingerprint": "963710f42a2c8219", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6d6f31dfb0658e39", "level": "note", "message": {"text": "Unused endpoint: GET /api/civic/sources"}, "properties": {"repobilityId": "e6f58c6b79b78926", "scanner": "scanner-primary", "fingerprint": "6d6f31dfb0658e39", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b62e5f8fb92e3f12", "level": "note", "message": {"text": "Unused endpoint: GET /api/civic/local"}, "properties": {"repobilityId": "06ff858993414262", "scanner": "scanner-primary", "fingerprint": "b62e5f8fb92e3f12", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0add9645d139ff53", "level": "note", "message": {"text": "Unused endpoint: GET /api/civic/fiscal"}, "properties": {"repobilityId": "ebd2371bf79fb05d", "scanner": "scanner-primary", "fingerprint": "0add9645d139ff53", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c661d46b0742f275", "level": "note", "message": {"text": "Unused endpoint: GET /api/civic/postcode/:postcode"}, "properties": {"repobilityId": "dc91c9bda8ffd855", "scanner": "scanner-primary", "fingerprint": "c661d46b0742f275", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-57e2525cfad1c065", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/import/civic-data"}, "properties": {"repobilityId": "a607cc995c4a9d8d", "scanner": "scanner-primary", "fingerprint": "57e2525cfad1c065", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-32167a8b7125c322", "level": "note", "message": {"text": "Unused endpoint: GET /api/bills/stats"}, "properties": {"repobilityId": "2e10b7e76ef00a36", "scanner": "scanner-primary", "fingerprint": "32167a8b7125c322", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8cd4b543f904dd29", "level": "note", "message": {"text": "Unused endpoint: GET /api/bills"}, "properties": {"repobilityId": "026139877763618c", "scanner": "scanner-primary", "fingerprint": "8cd4b543f904dd29", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7616098e9ed5deaf", "level": "note", "message": {"text": "Unused endpoint: GET /api/bills/:id"}, "properties": {"repobilityId": "4b139c3485922d18", "scanner": "scanner-primary", "fingerprint": "7616098e9ed5deaf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dc2c673ec177f66d", "level": "note", "message": {"text": "Unused endpoint: GET /api/bills/:id/aggregates"}, "properties": {"repobilityId": "d742ef15c5ef7265", "scanner": "scanner-primary", "fingerprint": "dc2c673ec177f66d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-157d6610d43c3378", "level": "note", "message": {"text": "Unused endpoint: POST /api/bills/:id/analyze"}, "properties": {"repobilityId": "972cb089ff32f241", "scanner": "scanner-primary", "fingerprint": "157d6610d43c3378", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4e6d708130ff8ae5", "level": "note", "message": {"text": "Unused endpoint: GET /api/map/bindings"}, "properties": {"repobilityId": "6cb468f62ca4695a", "scanner": "scanner-primary", "fingerprint": "4e6d708130ff8ae5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-af99fe13ada6963a", "level": "note", "message": {"text": "Unused endpoint: GET /api/constituencies"}, "properties": {"repobilityId": "0f7b7464d08a49e0", "scanner": "scanner-primary", "fingerprint": "af99fe13ada6963a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3aa6558ce5d071d2", "level": "note", "message": {"text": "Unused endpoint: GET /api/constituencies/:id/profile"}, "properties": {"repobilityId": "e3e477fd4097f682", "scanner": "scanner-primary", "fingerprint": "3aa6558ce5d071d2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6059f1b9bdfad444", "level": "note", "message": {"text": "Unused endpoint: GET /api/representatives"}, "properties": {"repobilityId": "8fe2f92e0896d306", "scanner": "scanner-primary", "fingerprint": "6059f1b9bdfad444", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a095690650a99db3", "level": "note", "message": {"text": "Unused endpoint: GET /api/representatives/:id"}, "properties": {"repobilityId": "f4f5f7fa3469e330", "scanner": "scanner-primary", "fingerprint": "a095690650a99db3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8a89c5360b2e2def", "level": "note", "message": {"text": "Unused endpoint: GET /api/representatives/:id/interests"}, "properties": {"repobilityId": "6844a08903afcbf4", "scanner": "scanner-primary", "fingerprint": "8a89c5360b2e2def", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e52d457e970d8566", "level": "note", "message": {"text": "Unused endpoint: GET /api/departments"}, "properties": {"repobilityId": "6526944332c80c75", "scanner": "scanner-primary", "fingerprint": "e52d457e970d8566", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fcd2448e35404eb3", "level": "note", "message": {"text": "Unused endpoint: GET /api/departments/:slug"}, "properties": {"repobilityId": "6fc19e28bc345ca2", "scanner": "scanner-primary", "fingerprint": "fcd2448e35404eb3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2f1f6955f3bc0462", "level": "note", "message": {"text": "Unused endpoint: GET /api/parties"}, "properties": {"repobilityId": "ca0f8758b1588502", "scanner": "scanner-primary", "fingerprint": "2f1f6955f3bc0462", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b2e6dfd5425b59a4", "level": "note", "message": {"text": "Unused endpoint: GET /api/parties/:id/news"}, "properties": {"repobilityId": "f050a3b64b8cff49", "scanner": "scanner-primary", "fingerprint": "b2e6dfd5425b59a4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-edf999a673c07347", "level": "note", "message": {"text": "Unused endpoint: GET /api/parties/:id/coverage"}, "properties": {"repobilityId": "b4dda5a589f8b453", "scanner": "scanner-primary", "fingerprint": "edf999a673c07347", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-082b8c93f8cb444e", "level": "note", "message": {"text": "Unused endpoint: GET /api/constituencies/:id/elections"}, "properties": {"repobilityId": "84cd5430c27bddea", "scanner": "scanner-primary", "fingerprint": "082b8c93f8cb444e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0697af538652bcd2", "level": "note", "message": {"text": "Unused endpoint: GET /api/insights/media"}, "properties": {"repobilityId": "6b2970b3eca3a103", "scanner": "scanner-primary", "fingerprint": "0697af538652bcd2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-034c37edfe9cee2b", "level": "note", "message": {"text": "Unused endpoint: GET /api/insights/media-influence"}, "properties": {"repobilityId": "b5a72c78651fd72e", "scanner": "scanner-primary", "fingerprint": "034c37edfe9cee2b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-23deb72c1ad38ba7", "level": "note", "message": {"text": "Unused endpoint: GET /api/insights/media-metrics"}, "properties": {"repobilityId": "866d9648acff6f68", "scanner": "scanner-primary", "fingerprint": "23deb72c1ad38ba7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c5c4b10d804f98e1", "level": "note", "message": {"text": "Unused endpoint: GET /api/insights/party-popularity"}, "properties": {"repobilityId": "e68db02803e4eb7a", "scanner": "scanner-primary", "fingerprint": "c5c4b10d804f98e1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f90f786ce88d945d", "level": "note", "message": {"text": "Unused endpoint: GET /api/insights/national-compass"}, "properties": {"repobilityId": "cc2e42979b11e913", "scanner": "scanner-primary", "fingerprint": "f90f786ce88d945d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2be474d969510734", "level": "note", "message": {"text": "Unused endpoint: GET /api/insights/media-articles"}, "properties": {"repobilityId": "4f873a8243dd4189", "scanner": "scanner-primary", "fingerprint": "2be474d969510734", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c8bd05a80b717a1a", "level": "note", "message": {"text": "Unused endpoint: GET /api/insights/ballots"}, "properties": {"repobilityId": "1e84947e9e6bd4b4", "scanner": "scanner-primary", "fingerprint": "c8bd05a80b717a1a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c3a683e1eb6a35ef", "level": "note", "message": {"text": "Unused endpoint: GET /api/insights/leans"}, "properties": {"repobilityId": "c8c90c760a812bde", "scanner": "scanner-primary", "fingerprint": "c3a683e1eb6a35ef", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-40fa4212c33b1b7a", "level": "note", "message": {"text": "Unused endpoint: GET /api/insights/polling"}, "properties": {"repobilityId": "d39b1290771c584d", "scanner": "scanner-primary", "fingerprint": "40fa4212c33b1b7a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a420b0e6af0dc0b8", "level": "note", "message": {"text": "Unused endpoint: GET /api/insights/polling/trend"}, "properties": {"repobilityId": "66092ba8ef442dc2", "scanner": "scanner-primary", "fingerprint": "a420b0e6af0dc0b8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e76667ec5b0a94f3", "level": "note", "message": {"text": "Unused endpoint: GET /api/insights/leader-approval"}, "properties": {"repobilityId": "2d2d09279c259675", "scanner": "scanner-primary", "fingerprint": "e76667ec5b0a94f3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9c37387ade0cdc3d", "level": "note", "message": {"text": "Unused endpoint: GET /api/insights/mrp"}, "properties": {"repobilityId": "c6181c04ce18b4c1", "scanner": "scanner-primary", "fingerprint": "9c37387ade0cdc3d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5262cf18af0a69b3", "level": "note", "message": {"text": "Unused endpoint: GET /api/petitions"}, "properties": {"repobilityId": "d133e18088ddd0f3", "scanner": "scanner-primary", "fingerprint": "5262cf18af0a69b3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cffb63c81edcb39f", "level": "note", "message": {"text": "Unused endpoint: GET /api/petitions/:id"}, "properties": {"repobilityId": "f2b639a0b1755d5a", "scanner": "scanner-primary", "fingerprint": "cffb63c81edcb39f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-95b6bac4252dbbaf", "level": "note", "message": {"text": "Unused endpoint: POST /api/petitions/:id/vote"}, "properties": {"repobilityId": "491ba8a33593205b", "scanner": "scanner-primary", "fingerprint": "95b6bac4252dbbaf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1b557869aef704ca", "level": "note", "message": {"text": "Unused endpoint: POST /api/petitions/:id/debate"}, "properties": {"repobilityId": "df40034f22f9387a", "scanner": "scanner-primary", "fingerprint": "1b557869aef704ca", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3162732fa329429f", "level": "note", "message": {"text": "Unused endpoint: GET /api/postcode/:postcode"}, "properties": {"repobilityId": "92f8f87f6d8103d6", "scanner": "scanner-primary", "fingerprint": "3162732fa329429f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a5b3437e64c8f7b4", "level": "note", "message": {"text": "Unused endpoint: POST /api/auth/register"}, "properties": {"repobilityId": "70dda6d85f2ab41c", "scanner": "scanner-primary", "fingerprint": "a5b3437e64c8f7b4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fd55aa0818a7c897", "level": "note", "message": {"text": "Unused endpoint: POST /api/auth/login"}, "properties": {"repobilityId": "5fd782629aa7b470", "scanner": "scanner-primary", "fingerprint": "fd55aa0818a7c897", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ee4aa5ddab88c9dc", "level": "note", "message": {"text": "Unused endpoint: GET /api/auth/me"}, "properties": {"repobilityId": "63f558668dee14b6", "scanner": "scanner-primary", "fingerprint": "ee4aa5ddab88c9dc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6462b053bce69715", "level": "note", "message": {"text": "Unused endpoint: POST /api/auth/verify"}, "properties": {"repobilityId": "9b602d070790ac1b", "scanner": "scanner-primary", "fingerprint": "6462b053bce69715", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9f8936a1cad1ac0b", "level": "note", "message": {"text": "Unused endpoint: POST /api/bills/:id/credential"}, "properties": {"repobilityId": "fefd44a11060f2f0", "scanner": "scanner-primary", "fingerprint": "9f8936a1cad1ac0b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-21e26062e2935bf9", "level": "note", "message": {"text": "Unused endpoint: POST /api/bills/:id/ballots"}, "properties": {"repobilityId": "2e35b20829a04446", "scanner": "scanner-primary", "fingerprint": "21e26062e2935bf9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2eef4ef70c21373c", "level": "note", "message": {"text": "Unused endpoint: GET /api/receipts/:code/verify"}, "properties": {"repobilityId": "54607ca03902c67b", "scanner": "scanner-primary", "fingerprint": "2eef4ef70c21373c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1e456eddee117a42", "level": "note", "message": {"text": "Unused endpoint: GET /api/checkpoints"}, "properties": {"repobilityId": "4c59c3acde209cce", "scanner": "scanner-primary", "fingerprint": "1e456eddee117a42", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-935bfd923ef6af15", "level": "note", "message": {"text": "Unused endpoint: GET /api/bills/:id/debate"}, "properties": {"repobilityId": "878b476d778e5b12", "scanner": "scanner-primary", "fingerprint": "935bfd923ef6af15", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}