{"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-a63c2efc9a92bd2c", "name": "Possibly dead Python function: do_POST", "shortDescription": {"text": "Possibly dead Python function: do_POST"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3a1eeb8f30a5fb33", "name": "Possibly dead Python function: log_message", "shortDescription": {"text": "Possibly dead Python function: log_message"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4a190e07e5172a50", "name": "Possibly dead Python function: register_analytics_foreman", "shortDescription": {"text": "Possibly dead Python function: register_analytics_foreman"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-93dfb0c2d075967c", "name": "Icon-only button without accessible name \u2014 app/static/assets/js/hq.js:703", "shortDescription": {"text": "Icon-only button without accessible name \u2014 app/static/assets/js/hq.js:703"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5e3dd760c799b7b3", "name": "Icon-only button without accessible name \u2014 app/static/assets/js/map.js:105", "shortDescription": {"text": "Icon-only button without accessible name \u2014 app/static/assets/js/map.js:105"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-37e0c18402b5b2aa", "name": "Icon-only button without accessible name \u2014 app/static/assets/js/education.js:133", "shortDescription": {"text": "Icon-only button without accessible name \u2014 app/static/assets/js/education.js:133"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1ad54e82236ad9fa", "name": "Icon-only button without accessible name \u2014 app/static/assets/js/book_studio.js:184", "shortDescription": {"text": "Icon-only button without accessible name \u2014 app/static/assets/js/book_studio.js:184"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4f9296907bd74d2e", "name": "Icon-only button without accessible name \u2014 app/static/assets/js/agent_office.js:47", "shortDescription": {"text": "Icon-only button without accessible name \u2014 app/static/assets/js/agent_office.js:47"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d63da3583b14afc0", "name": "Dockerfile runs as root: Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-de3c1f217d72a063", "name": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "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-bd3acec92d92cfb5", "name": "Insecure pattern 'direct_innerhtml_assignment' in app/static/thomas.html:352", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/thomas.html:352"}, "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-2ceac576e385b7a5", "name": "Insecure pattern 'direct_innerhtml_assignment' in app/static/pulse.html:201", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/pulse.html:201"}, "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-e045e53f322de051", "name": "Insecure pattern 'direct_innerhtml_assignment' in app/static/index.html:367", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/index.html:367"}, "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-c7c0c8997be5813f", "name": "Insecure pattern 'direct_innerhtml_assignment' in app/static/agent_passport.html:161", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/agent_passport.html:161"}, "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-0d5dd07c9526489e", "name": "Insecure pattern 'direct_innerhtml_assignment' in app/static/hq.html:750", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/hq.html:750"}, "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-ce64af9d7267ebcb", "name": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/technik.js:15", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/technik.js:15"}, "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-c422fa179899f2b7", "name": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/world.js:19", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/world.js:19"}, "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-67d24fb7f3150b80", "name": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/butler.js:172", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/butler.js:172"}, "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-fb3ed1825fe2dca6", "name": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/scribe.js:14", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/scribe.js:14"}, "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-9f648084d0aed434", "name": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/library.js:33", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/library.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-cdb3afa7b5ce6a8d", "name": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/home.js:36", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/home.js:36"}, "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-87f111064469317c", "name": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/ideas.js:15", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/ideas.js:15"}, "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-5b00fbc5d095f007", "name": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/civilization.js:115", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/civilization.js:115"}, "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-8207eeccf388cdd3", "name": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/hq.js:164", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/hq.js:164"}, "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-f7ea6b0498dbba96", "name": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/solar.js:105", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/solar.js:105"}, "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-3aa68f905edb1eb8", "name": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/dispatcher.js:34", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/dispatcher.js:34"}, "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-a6d7ac4c9c918579", "name": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/files.js:9", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/files.js:9"}, "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-b15a69958c7e81f7", "name": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/babla.js:23", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/babla.js:23"}, "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-1f383c4592aae1c0", "name": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/map.js:42", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/map.js:42"}, "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-c963cd95dcdfe274", "name": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/education.js:26", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/education.js:26"}, "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-5e70dc1f3a141bd8", "name": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/butler_router.js:31", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/butler_router.js:31"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-877d3d0c938c29fd", "name": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/build.js:14", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/build.js:14"}, "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-8bc9e4b2594a86a1", "name": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/audit.js:31", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/audit.js:31"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3674399a80accc65", "name": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/command_palette.js:65", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/command_palette.js:65"}, "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-3ea199e48ed27891", "name": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/book_studio_gallery.js:15", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/book_studio_gallery.js:15"}, "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-d6f432bb96134f96", "name": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/book_studio.js:27", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/book_studio.js:27"}, "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-7db768711bc457fd", "name": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/agent_office.js:40", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/agent_office.js:40"}, "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-124e93d30c32f6a5", "name": "Insecure pattern 'direct_innerhtml_assignment' in app/static/world/wyrd_connections.js:44", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/world/wyrd_connections.js:44"}, "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-51128c6342aaecaa", "name": "Insecure pattern 'tls_verify_false' in app/routers/dispatcher_proxy.py:19", "shortDescription": {"text": "Insecure pattern 'tls_verify_false' in app/routers/dispatcher_proxy.py:19"}, "fullDescription": {"text": "Found a known-risky pattern (tls_verify_false). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e980ee0dfcf281e2", "name": "Insecure pattern 'tls_verify_false' in app/routers/butler_tts.py:26", "shortDescription": {"text": "Insecure pattern 'tls_verify_false' in app/routers/butler_tts.py:26"}, "fullDescription": {"text": "Found a known-risky pattern (tls_verify_false). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "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 81 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-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-faccb9061e9b52a0", "name": "No README detected", "shortDescription": {"text": "No README detected"}, "fullDescription": {"text": "No README file was found. Generated repos without README context are hard to operate, validate, or safely hand off."}, "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 22 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-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci, tests, operator-readme. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci, tests, operator-readme. 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-96422f3d81ddf6a4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/static/assets/js/world.js:116", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/static/assets/js/world.js:116"}, "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-1a5db1b0deb96151", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/static/assets/js/home.js:39", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/static/assets/js/home.js:39"}, "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-9bd58e46b0f23565", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/static/assets/js/hq.js:776", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/static/assets/js/hq.js:776"}, "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-6cc1c28b3fedf6ab", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/static/assets/js/dispatcher.js:6", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/static/assets/js/dispatcher.js:6"}, "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-0e0d865997f1c191", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/static/assets/js/babla.js:8", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/static/assets/js/babla.js:8"}, "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-530ebbb6b8b7d854", "name": "Legacy-named symbol `create_backup` in app/routers/backups.py:36", "shortDescription": {"text": "Legacy-named symbol `create_backup` in app/routers/backups.py:36"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\napp/babla_agent.py:safe, app/analytics_agent.py:safe\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-be46ea126aa5d8dc", "name": "Near-duplicate function bodies in 3 places", "shortDescription": {"text": "Near-duplicate function bodies in 3 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\napp/routers/civilization.py:get_agent_prompt, app/routers/civilization.py:save_agent_prompt, app/routers/civilization.py:send_to_training\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-58711b814aef058e", "name": "FastAPI POST `run_now` without auth dependency \u2014 app/audit_agent.py:104", "shortDescription": {"text": "FastAPI POST `run_now` without auth dependency \u2014 app/audit_agent.py:104"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5899930f0bd1b4ce", "name": "FastAPI POST `trigger_all` without auth dependency \u2014 app/main.py:154", "shortDescription": {"text": "FastAPI POST `trigger_all` without auth dependency \u2014 app/main.py:154"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8e43d2d5199e5b40", "name": "FastAPI POST `trigger_agent` without auth dependency \u2014 app/main.py:160", "shortDescription": {"text": "FastAPI POST `trigger_agent` without auth dependency \u2014 app/main.py:160"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d2858e357b1e1040", "name": "FastAPI POST `save_cycle_result` without auth dependency \u2014 app/routers/education.py:217", "shortDescription": {"text": "FastAPI POST `save_cycle_result` without auth dependency \u2014 app/routers/education.py:217"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-63159fcd8eb5725e", "name": "FastAPI POST `run_idea_dept` without auth dependency \u2014 app/routers/ideas_dept.py:27", "shortDescription": {"text": "FastAPI POST `run_idea_dept` without auth dependency \u2014 app/routers/ideas_dept.py:27"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-46b1037059fbab81", "name": "FastAPI POST `scribe_webhook` without auth dependency \u2014 app/routers/scribe_proxy.py:13", "shortDescription": {"text": "FastAPI POST `scribe_webhook` without auth dependency \u2014 app/routers/scribe_proxy.py:13"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e755b6364a35298c", "name": "FastAPI POST `run_babla` without auth dependency \u2014 app/routers/babla.py:27", "shortDescription": {"text": "FastAPI POST `run_babla` without auth dependency \u2014 app/routers/babla.py:27"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e07603c3c80b8e68", "name": "FastAPI POST `run_analytics` without auth dependency \u2014 app/routers/analytics.py:27", "shortDescription": {"text": "FastAPI POST `run_analytics` without auth dependency \u2014 app/routers/analytics.py:27"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a12f038b56f46a7d", "name": "FastAPI POST `run_projects_dept` without auth dependency \u2014 app/routers/projects_dept.py:27", "shortDescription": {"text": "FastAPI POST `run_projects_dept` without auth dependency \u2014 app/routers/projects_dept.py:27"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8f428406a0e6a513", "name": "FastAPI POST `run_all_readers` without auth dependency \u2014 app/routers/library_proxy.py:105", "shortDescription": {"text": "FastAPI POST `run_all_readers` without auth dependency \u2014 app/routers/library_proxy.py:105"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-871594ca6d7a287d", "name": "FastAPI POST `bs_create_book` without auth dependency \u2014 app/routers/book_studio_proxy.py:58", "shortDescription": {"text": "FastAPI POST `bs_create_book` without auth dependency \u2014 app/routers/book_studio_proxy.py:58"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-dd3a6560cea8bc3b", "name": "FastAPI POST `bs_studio_prepare` without auth dependency \u2014 app/routers/book_studio_proxy.py:63", "shortDescription": {"text": "FastAPI POST `bs_studio_prepare` without auth dependency \u2014 app/routers/book_studio_proxy.py:63"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6011f04727ef03bd", "name": "FastAPI POST `bs_generate` without auth dependency \u2014 app/routers/book_studio_proxy.py:88", "shortDescription": {"text": "FastAPI POST `bs_generate` without auth dependency \u2014 app/routers/book_studio_proxy.py:88"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-613e5b14cb51395f", "name": "FastAPI POST `bs_publish` without auth dependency \u2014 app/routers/book_studio_proxy.py:97", "shortDescription": {"text": "FastAPI POST `bs_publish` without auth dependency \u2014 app/routers/book_studio_proxy.py:97"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-79a3d4996a42e238", "name": "FastAPI POST `bs_feedback` without auth dependency \u2014 app/routers/book_studio_proxy.py:102", "shortDescription": {"text": "FastAPI POST `bs_feedback` without auth dependency \u2014 app/routers/book_studio_proxy.py:102"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4bc973b62086f02a", "name": "FastAPI POST `bs_conductor_post` without auth dependency \u2014 app/routers/book_studio_proxy.py:135", "shortDescription": {"text": "FastAPI POST `bs_conductor_post` without auth dependency \u2014 app/routers/book_studio_proxy.py:135"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d4ae8218a911657b", "name": "FastAPI POST `bs_school_post` without auth dependency \u2014 app/routers/book_studio_proxy.py:161", "shortDescription": {"text": "FastAPI POST `bs_school_post` without auth dependency \u2014 app/routers/book_studio_proxy.py:161"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-02113ffe4d0df93c", "name": "FastAPI POST `bs_agent_run` without auth dependency \u2014 app/routers/book_studio_proxy.py:304", "shortDescription": {"text": "FastAPI POST `bs_agent_run` without auth dependency \u2014 app/routers/book_studio_proxy.py:304"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0f0977bb80e9c1f4", "name": "FastAPI POST `bs_next_book` without auth dependency \u2014 app/routers/book_studio_proxy.py:326", "shortDescription": {"text": "FastAPI POST `bs_next_book` without auth dependency \u2014 app/routers/book_studio_proxy.py:326"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a26a482f0d4acd49", "name": "FastAPI POST `butler_speak` without auth dependency \u2014 app/routers/butler_tts.py:49", "shortDescription": {"text": "FastAPI POST `butler_speak` without auth dependency \u2014 app/routers/butler_tts.py:49"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9cfa8045a26d9eca", "name": "FastAPI POST `butler_chat` without auth dependency \u2014 app/routers/butler.py:122", "shortDescription": {"text": "FastAPI POST `butler_chat` without auth dependency \u2014 app/routers/butler.py:122"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-974d457a95bcef75", "name": "FastAPI POST `butler_autobrief` without auth dependency \u2014 app/routers/butler.py:204", "shortDescription": {"text": "FastAPI POST `butler_autobrief` without auth dependency \u2014 app/routers/butler.py:204"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7977dc5a3f5f6c50", "name": "Dangling fetch: GET /tech/tasks?limit=50 (app/static/assets/js/technik.js:17)", "shortDescription": {"text": "Dangling fetch: GET /tech/tasks?limit=50 (app/static/assets/js/technik.js:17)"}, "fullDescription": {"text": "`app/static/assets/js/technik.js:17` calls `GET /tech/tasks?limit=50` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tech/tasks`\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-764db9caa72a893b", "name": "Dangling fetch: POST /tech/tasks (app/static/assets/js/technik.js:82)", "shortDescription": {"text": "Dangling fetch: POST /tech/tasks (app/static/assets/js/technik.js:82)"}, "fullDescription": {"text": "`app/static/assets/js/technik.js:82` calls `POST /tech/tasks` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tech/tasks`\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-bcd27835e47b9bf3", "name": "Dangling fetch: GET /tech/tasks?limit=50 (app/static/assets/js/technik.js:96)", "shortDescription": {"text": "Dangling fetch: GET /tech/tasks?limit=50 (app/static/assets/js/technik.js:96)"}, "fullDescription": {"text": "`app/static/assets/js/technik.js:96` calls `GET /tech/tasks?limit=50` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tech/tasks`\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-8bd1835c653e888e", "name": "Dangling fetch: GET /hq-world/health (app/static/assets/js/world.js:116)", "shortDescription": {"text": "Dangling fetch: GET /hq-world/health (app/static/assets/js/world.js:116)"}, "fullDescription": {"text": "`app/static/assets/js/world.js:116` calls `GET /hq-world/health` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/hq-world/health`\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-ab03125af826f267", "name": "Dangling fetch: GET /hq-world/brief (app/static/assets/js/world.js:117)", "shortDescription": {"text": "Dangling fetch: GET /hq-world/brief (app/static/assets/js/world.js:117)"}, "fullDescription": {"text": "`app/static/assets/js/world.js:117` calls `GET /hq-world/brief` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/hq-world/brief`\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-96b3a4ecbb9446f4", "name": "Dangling fetch: GET /analytics/reports/latest (app/static/assets/js/world.js:118)", "shortDescription": {"text": "Dangling fetch: GET /analytics/reports/latest (app/static/assets/js/world.js:118)"}, "fullDescription": {"text": "`app/static/assets/js/world.js:118` calls `GET /analytics/reports/latest` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/analytics/reports/latest`\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-992064ab9366f415", "name": "Dangling fetch: POST /analytics/run (app/static/assets/js/world.js:129)", "shortDescription": {"text": "Dangling fetch: POST /analytics/run (app/static/assets/js/world.js:129)"}, "fullDescription": {"text": "`app/static/assets/js/world.js:129` calls `POST /analytics/run` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/analytics/run`\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-931b1186491fa63b", "name": "Dangling fetch: POST /butler/speak (app/static/assets/js/butler.js:69)", "shortDescription": {"text": "Dangling fetch: POST /butler/speak (app/static/assets/js/butler.js:69)"}, "fullDescription": {"text": "`app/static/assets/js/butler.js:69` calls `POST /butler/speak` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/butler/speak`\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-671af3b02b2fc649", "name": "Dangling fetch: POST /butler/autobrief (app/static/assets/js/butler.js:92)", "shortDescription": {"text": "Dangling fetch: POST /butler/autobrief (app/static/assets/js/butler.js:92)"}, "fullDescription": {"text": "`app/static/assets/js/butler.js:92` calls `POST /butler/autobrief` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/butler/autobrief`\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-bc0bf2b0a19e5e30", "name": "Dangling fetch: POST /butler/chat (app/static/assets/js/butler.js:120)", "shortDescription": {"text": "Dangling fetch: POST /butler/chat (app/static/assets/js/butler.js:120)"}, "fullDescription": {"text": "`app/static/assets/js/butler.js:120` calls `POST /butler/chat` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/butler/chat`\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-0579e1d03f26d18a", "name": "Dangling fetch: GET /tokens/scribe/stats (app/static/assets/js/scribe.js:11)", "shortDescription": {"text": "Dangling fetch: GET /tokens/scribe/stats (app/static/assets/js/scribe.js:11)"}, "fullDescription": {"text": "`app/static/assets/js/scribe.js:11` calls `GET /tokens/scribe/stats` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tokens/scribe/stats`\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-1b38b92709cbb782", "name": "Dangling fetch: GET /tokens/scribe/stats (app/static/assets/js/scribe.js:37)", "shortDescription": {"text": "Dangling fetch: GET /tokens/scribe/stats (app/static/assets/js/scribe.js:37)"}, "fullDescription": {"text": "`app/static/assets/js/scribe.js:37` calls `GET /tokens/scribe/stats` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tokens/scribe/stats`\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-5713d51c8350db93", "name": "Dangling fetch: GET /library/stats (app/static/assets/js/library.js:23)", "shortDescription": {"text": "Dangling fetch: GET /library/stats (app/static/assets/js/library.js:23)"}, "fullDescription": {"text": "`app/static/assets/js/library.js:23` calls `GET /library/stats` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/library/stats`\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-cc7760111337b4c2", "name": "Dangling fetch: GET /library/readers (app/static/assets/js/library.js:61)", "shortDescription": {"text": "Dangling fetch: GET /library/readers (app/static/assets/js/library.js:61)"}, "fullDescription": {"text": "`app/static/assets/js/library.js:61` calls `GET /library/readers` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/library/readers`\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-993f1b02975cdbaa", "name": "Dangling fetch: POST /library/readers/${encodeURIComponent(readerId)}/run (app/static/assets/js/library.js:107)", "shortDescription": {"text": "Dangling fetch: POST /library/readers/${encodeURIComponent(readerId)}/run (app/static/assets/js/library.js:107)"}, "fullDescription": {"text": "`app/static/assets/js/library.js:107` calls `POST /library/readers/${encodeURIComponent(readerId)}/run` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/library/readers/<p>/run`\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-f8f415630de5eb87", "name": "Dangling fetch: POST /library/readers/run-all (app/static/assets/js/library.js:134)", "shortDescription": {"text": "Dangling fetch: POST /library/readers/run-all (app/static/assets/js/library.js:134)"}, "fullDescription": {"text": "`app/static/assets/js/library.js:134` calls `POST /library/readers/run-all` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/library/readers/run-all`\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-ef87de0a8c889c5b", "name": "Dangling fetch: GET /library/recent?limit=20 (app/static/assets/js/library.js:153)", "shortDescription": {"text": "Dangling fetch: GET /library/recent?limit=20 (app/static/assets/js/library.js:153)"}, "fullDescription": {"text": "`app/static/assets/js/library.js:153` calls `GET /library/recent?limit=20` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/library/recent`\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-a7f3b86fce226c44", "name": "Dangling fetch: GET /library/knowledge/${item.id} (app/static/assets/js/library.js:197)", "shortDescription": {"text": "Dangling fetch: GET /library/knowledge/${item.id} (app/static/assets/js/library.js:197)"}, "fullDescription": {"text": "`app/static/assets/js/library.js:197` calls `GET /library/knowledge/${item.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/library/knowledge/<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-0b214989273c41c9", "name": "Dangling fetch: GET /library/search?q=${encodeURIComponent(q)}&limit=10 (app/static/assets/js/library.js:222)", "shortDescription": {"text": "Dangling fetch: GET /library/search?q=${encodeURIComponent(q)}&limit=10 (app/static/assets/js/library.js:222)"}, "fullDescription": {"text": "`app/static/assets/js/library.js:222` calls `GET /library/search?q=${encodeURIComponent(q)}&limit=10` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/library/search`\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-5839d26e5bbc9873", "name": "Dangling fetch: GET /library/knowledge/${item.id} (app/static/assets/js/library.js:264)", "shortDescription": {"text": "Dangling fetch: GET /library/knowledge/${item.id} (app/static/assets/js/library.js:264)"}, "fullDescription": {"text": "`app/static/assets/js/library.js:264` calls `GET /library/knowledge/${item.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/library/knowledge/<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-f6f44515b1f110f6", "name": "Dangling fetch: GET /civilization/agents (app/static/assets/js/home.js:39)", "shortDescription": {"text": "Dangling fetch: GET /civilization/agents (app/static/assets/js/home.js:39)"}, "fullDescription": {"text": "`app/static/assets/js/home.js:39` calls `GET /civilization/agents` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/civilization/agents`\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-c53188ef668c2aea", "name": "Dangling fetch: GET /events?limit=20 (app/static/assets/js/home.js:40)", "shortDescription": {"text": "Dangling fetch: GET /events?limit=20 (app/static/assets/js/home.js:40)"}, "fullDescription": {"text": "`app/static/assets/js/home.js:40` calls `GET /events?limit=20` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/events`\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-18d7ee85ce40fd5a", "name": "Dangling fetch: GET /bs/stats (app/static/assets/js/home.js:41)", "shortDescription": {"text": "Dangling fetch: GET /bs/stats (app/static/assets/js/home.js:41)"}, "fullDescription": {"text": "`app/static/assets/js/home.js:41` calls `GET /bs/stats` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/bs/stats`\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-40c2f35858251df8", "name": "Dangling fetch: GET /council/sessions?limit=1 (app/static/assets/js/home.js:42)", "shortDescription": {"text": "Dangling fetch: GET /council/sessions?limit=1 (app/static/assets/js/home.js:42)"}, "fullDescription": {"text": "`app/static/assets/js/home.js:42` calls `GET /council/sessions?limit=1` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/council/sessions`\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-40b70545c8e9d53d", "name": "Dangling fetch: POST /bs/books/tolstyak/scout/all (app/static/assets/js/home.js:235)", "shortDescription": {"text": "Dangling fetch: POST /bs/books/tolstyak/scout/all (app/static/assets/js/home.js:235)"}, "fullDescription": {"text": "`app/static/assets/js/home.js:235` calls `POST /bs/books/tolstyak/scout/all` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/bs/books/tolstyak/scout/all`\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-777659ece12a64a1", "name": "Dangling fetch: POST /bs/books/tolstyak/conductor (app/static/assets/js/home.js:241)", "shortDescription": {"text": "Dangling fetch: POST /bs/books/tolstyak/conductor (app/static/assets/js/home.js:241)"}, "fullDescription": {"text": "`app/static/assets/js/home.js:241` calls `POST /bs/books/tolstyak/conductor` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/bs/books/tolstyak/conductor`\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-11224883eddfee2d", "name": "Dangling fetch: PATCH /income/ideas/${id} (app/static/assets/js/ideas.js:70)", "shortDescription": {"text": "Dangling fetch: PATCH /income/ideas/${id} (app/static/assets/js/ideas.js:70)"}, "fullDescription": {"text": "`app/static/assets/js/ideas.js:70` calls `PATCH /income/ideas/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/income/ideas/<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-4d025896908723bc", "name": "Dangling fetch: DELETE /income/ideas/${id} (app/static/assets/js/ideas.js:86)", "shortDescription": {"text": "Dangling fetch: DELETE /income/ideas/${id} (app/static/assets/js/ideas.js:86)"}, "fullDescription": {"text": "`app/static/assets/js/ideas.js:86` calls `DELETE /income/ideas/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/income/ideas/<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-97023e2d06f78708", "name": "Dangling fetch: GET /civilization/agents (app/static/assets/js/civilization.js:46)", "shortDescription": {"text": "Dangling fetch: GET /civilization/agents (app/static/assets/js/civilization.js:46)"}, "fullDescription": {"text": "`app/static/assets/js/civilization.js:46` calls `GET /civilization/agents` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/civilization/agents`\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-3294649cb5337f09", "name": "Dangling fetch: GET /civilization/proposals (app/static/assets/js/civilization.js:180)", "shortDescription": {"text": "Dangling fetch: GET /civilization/proposals (app/static/assets/js/civilization.js:180)"}, "fullDescription": {"text": "`app/static/assets/js/civilization.js:180` calls `GET /civilization/proposals` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/civilization/proposals`\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-42f5bc932ca797db", "name": "Dangling fetch: PATCH /civilization/proposals/${id} (app/static/assets/js/civilization.js:218)", "shortDescription": {"text": "Dangling fetch: PATCH /civilization/proposals/${id} (app/static/assets/js/civilization.js:218)"}, "fullDescription": {"text": "`app/static/assets/js/civilization.js:218` calls `PATCH /civilization/proposals/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/civilization/proposals/<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-f749ffc824088eee", "name": "Dangling fetch: GET /council/sessions?limit=10 (app/static/assets/js/civilization.js:238)", "shortDescription": {"text": "Dangling fetch: GET /council/sessions?limit=10 (app/static/assets/js/civilization.js:238)"}, "fullDescription": {"text": "`app/static/assets/js/civilization.js:238` calls `GET /council/sessions?limit=10` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/council/sessions`\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-fffe2c6452ad78df", "name": "Dangling fetch: GET /council/sessions/${sessionId}/messages (app/static/assets/js/civilization.js:315)", "shortDescription": {"text": "Dangling fetch: GET /council/sessions/${sessionId}/messages (app/static/assets/js/civilization.js:315)"}, "fullDescription": {"text": "`app/static/assets/js/civilization.js:315` calls `GET /council/sessions/${sessionId}/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/council/sessions/<p>/messages`\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-f405aeaa087b4602", "name": "Dangling fetch: DELETE /council/sessions (app/static/assets/js/civilization.js:332)", "shortDescription": {"text": "Dangling fetch: DELETE /council/sessions (app/static/assets/js/civilization.js:332)"}, "fullDescription": {"text": "`app/static/assets/js/civilization.js:332` calls `DELETE /council/sessions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/council/sessions`\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-442c036db5544f46", "name": "Dangling fetch: POST /council/sessions (app/static/assets/js/civilization.js:343)", "shortDescription": {"text": "Dangling fetch: POST /council/sessions (app/static/assets/js/civilization.js:343)"}, "fullDescription": {"text": "`app/static/assets/js/civilization.js:343` calls `POST /council/sessions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/council/sessions`\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-704950f341859a26", "name": "Dangling fetch: GET /council/thoughts?limit=15 (app/static/assets/js/civilization.js:354)", "shortDescription": {"text": "Dangling fetch: GET /council/thoughts?limit=15 (app/static/assets/js/civilization.js:354)"}, "fullDescription": {"text": "`app/static/assets/js/civilization.js:354` calls `GET /council/thoughts?limit=15` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/council/thoughts`\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-cb2dfa0f4347b58a", "name": "Dangling fetch: GET /branches (app/static/assets/js/hq.js:161)", "shortDescription": {"text": "Dangling fetch: GET /branches (app/static/assets/js/hq.js:161)"}, "fullDescription": {"text": "`app/static/assets/js/hq.js:161` calls `GET /branches` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/branches`\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-a028b659288066cd", "name": "Dangling fetch: GET /tech/tasks?limit=10 (app/static/assets/js/hq.js:202)", "shortDescription": {"text": "Dangling fetch: GET /tech/tasks?limit=10 (app/static/assets/js/hq.js:202)"}, "fullDescription": {"text": "`app/static/assets/js/hq.js:202` calls `GET /tech/tasks?limit=10` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tech/tasks`\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-ba36c76eed72d046", "name": "Dangling fetch: GET /income/ideas?limit=6 (app/static/assets/js/hq.js:218)", "shortDescription": {"text": "Dangling fetch: GET /income/ideas?limit=6 (app/static/assets/js/hq.js:218)"}, "fullDescription": {"text": "`app/static/assets/js/hq.js:218` calls `GET /income/ideas?limit=6` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/income/ideas`\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-c7b1d6982888c2c8", "name": "Dangling fetch: GET /library/recent?limit=6 (app/static/assets/js/hq.js:234)", "shortDescription": {"text": "Dangling fetch: GET /library/recent?limit=6 (app/static/assets/js/hq.js:234)"}, "fullDescription": {"text": "`app/static/assets/js/hq.js:234` calls `GET /library/recent?limit=6` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/library/recent`\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-756a9118dc063671", "name": "Dangling fetch: GET /events?limit=20 (app/static/assets/js/hq.js:250)", "shortDescription": {"text": "Dangling fetch: GET /events?limit=20 (app/static/assets/js/hq.js:250)"}, "fullDescription": {"text": "`app/static/assets/js/hq.js:250` calls `GET /events?limit=20` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/events`\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-66c19a936e7c3211", "name": "Dangling fetch: GET /notes (app/static/assets/js/hq.js:315)", "shortDescription": {"text": "Dangling fetch: GET /notes (app/static/assets/js/hq.js:315)"}, "fullDescription": {"text": "`app/static/assets/js/hq.js:315` calls `GET /notes` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/notes`\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-59be80569b29f6fa", "name": "Dangling fetch: POST /notes (app/static/assets/js/hq.js:352)", "shortDescription": {"text": "Dangling fetch: POST /notes (app/static/assets/js/hq.js:352)"}, "fullDescription": {"text": "`app/static/assets/js/hq.js:352` calls `POST /notes` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/notes`\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-555d509e8ad6b319", "name": "Dangling fetch: DELETE /notes/${id} (app/static/assets/js/hq.js:365)", "shortDescription": {"text": "Dangling fetch: DELETE /notes/${id} (app/static/assets/js/hq.js:365)"}, "fullDescription": {"text": "`app/static/assets/js/hq.js:365` calls `DELETE /notes/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/notes/<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-b12debf833c9e1c1", "name": "Dangling fetch: GET /civilization/agents (app/static/assets/js/hq.js:500)", "shortDescription": {"text": "Dangling fetch: GET /civilization/agents (app/static/assets/js/hq.js:500)"}, "fullDescription": {"text": "`app/static/assets/js/hq.js:500` calls `GET /civilization/agents` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/civilization/agents`\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-700f731ec0e9da5c", "name": "Dangling fetch: GET /tech/tasks?status=running&limit=50 (app/static/assets/js/hq.js:517)", "shortDescription": {"text": "Dangling fetch: GET /tech/tasks?status=running&limit=50 (app/static/assets/js/hq.js:517)"}, "fullDescription": {"text": "`app/static/assets/js/hq.js:517` calls `GET /tech/tasks?status=running&limit=50` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tech/tasks`\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-48c153cd53b02970", "name": "Dangling fetch: GET /flags?type=risk&status=active (app/static/assets/js/hq.js:528)", "shortDescription": {"text": "Dangling fetch: GET /flags?type=risk&status=active (app/static/assets/js/hq.js:528)"}, "fullDescription": {"text": "`app/static/assets/js/hq.js:528` calls `GET /flags?type=risk&status=active` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/flags`\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-df2441adb7d4d05c", "name": "Dangling fetch: GET /bs/stats (app/static/assets/js/hq.js:539)", "shortDescription": {"text": "Dangling fetch: GET /bs/stats (app/static/assets/js/hq.js:539)"}, "fullDescription": {"text": "`app/static/assets/js/hq.js:539` calls `GET /bs/stats` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/bs/stats`\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-6511c935c10683f2", "name": "Dangling fetch: GET /library/stats (app/static/assets/js/hq.js:548)", "shortDescription": {"text": "Dangling fetch: GET /library/stats (app/static/assets/js/hq.js:548)"}, "fullDescription": {"text": "`app/static/assets/js/hq.js:548` calls `GET /library/stats` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/library/stats`\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-ec53bdd516e57939", "name": "Dangling fetch: GET /tech/tasks?limit=5 (app/static/assets/js/hq.js:714)", "shortDescription": {"text": "Dangling fetch: GET /tech/tasks?limit=5 (app/static/assets/js/hq.js:714)"}, "fullDescription": {"text": "`app/static/assets/js/hq.js:714` calls `GET /tech/tasks?limit=5` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tech/tasks`\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-9999e810b06342e8", "name": "Dangling fetch: GET /events?branch=${encodeURIComponent(branch)}&limit=5 (app/static/assets/js/hq.js:742)", "shortDescription": {"text": "Dangling fetch: GET /events?branch=${encodeURIComponent(branch)}&limit=5 (app/static/assets/js/hq.js:742)"}, "fullDescription": {"text": "`app/static/assets/js/hq.js:742` calls `GET /events?branch=${encodeURIComponent(branch)}&limit=5` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/events`\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-ba5f73e6c6dc2f7c", "name": "Dangling fetch: POST /tech/tasks (app/static/assets/js/hq.js:776)", "shortDescription": {"text": "Dangling fetch: POST /tech/tasks (app/static/assets/js/hq.js:776)"}, "fullDescription": {"text": "`app/static/assets/js/hq.js:776` calls `POST /tech/tasks` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tech/tasks`\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-b47b8fb229ba2379", "name": "Dangling fetch: POST /civilization/agents/${agentId}/trigger (app/static/assets/js/hq.js:786)", "shortDescription": {"text": "Dangling fetch: POST /civilization/agents/${agentId}/trigger (app/static/assets/js/hq.js:786)"}, "fullDescription": {"text": "`app/static/assets/js/hq.js:786` calls `POST /civilization/agents/${agentId}/trigger` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/civilization/agents/<p>/trigger`\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-86d0763f8f6ed39c", "name": "Dangling fetch: GET /dispatcher-proxy/stats (app/static/assets/js/dispatcher.js:6)", "shortDescription": {"text": "Dangling fetch: GET /dispatcher-proxy/stats (app/static/assets/js/dispatcher.js:6)"}, "fullDescription": {"text": "`app/static/assets/js/dispatcher.js:6` calls `GET /dispatcher-proxy/stats` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dispatcher-proxy/stats`\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-5be72d91de1f1e92", "name": "Dangling fetch: GET /dispatcher-proxy/health (app/static/assets/js/dispatcher.js:7)", "shortDescription": {"text": "Dangling fetch: GET /dispatcher-proxy/health (app/static/assets/js/dispatcher.js:7)"}, "fullDescription": {"text": "`app/static/assets/js/dispatcher.js:7` calls `GET /dispatcher-proxy/health` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dispatcher-proxy/health`\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-439e97b439ab7f45", "name": "Dangling fetch: GET /thomas/docs (app/static/assets/js/files.js:11)", "shortDescription": {"text": "Dangling fetch: GET /thomas/docs (app/static/assets/js/files.js:11)"}, "fullDescription": {"text": "`app/static/assets/js/files.js:11` calls `GET /thomas/docs` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/thomas/docs`\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-62bc3fa2b783052a", "name": "Dangling fetch: GET /thomas/docs/${encodeURIComponent(path)} (app/static/assets/js/files.js:59)", "shortDescription": {"text": "Dangling fetch: GET /thomas/docs/${encodeURIComponent(path)} (app/static/assets/js/files.js:59)"}, "fullDescription": {"text": "`app/static/assets/js/files.js:59` calls `GET /thomas/docs/${encodeURIComponent(path)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/thomas/docs/<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-b380d0548f057aa9", "name": "Dangling fetch: GET /babla/reports/latest (app/static/assets/js/babla.js:8)", "shortDescription": {"text": "Dangling fetch: GET /babla/reports/latest (app/static/assets/js/babla.js:8)"}, "fullDescription": {"text": "`app/static/assets/js/babla.js:8` calls `GET /babla/reports/latest` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/babla/reports/latest`\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-4da299541eb637ae", "name": "Dangling fetch: GET /income/ideas (app/static/assets/js/babla.js:9)", "shortDescription": {"text": "Dangling fetch: GET /income/ideas (app/static/assets/js/babla.js:9)"}, "fullDescription": {"text": "`app/static/assets/js/babla.js:9` calls `GET /income/ideas` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/income/ideas`\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-1d30eb52425f6a3c", "name": "Dangling fetch: GET /income/experiments (app/static/assets/js/babla.js:10)", "shortDescription": {"text": "Dangling fetch: GET /income/experiments (app/static/assets/js/babla.js:10)"}, "fullDescription": {"text": "`app/static/assets/js/babla.js:10` calls `GET /income/experiments` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/income/experiments`\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-49d1ed1a488e7d30", "name": "Dangling fetch: POST /babla/run (app/static/assets/js/babla.js:121)", "shortDescription": {"text": "Dangling fetch: POST /babla/run (app/static/assets/js/babla.js:121)"}, "fullDescription": {"text": "`app/static/assets/js/babla.js:121` calls `POST /babla/run` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/babla/run`\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-0c840a08748b0aa6", "name": "Dangling fetch: GET /branches (app/static/assets/js/map.js:45)", "shortDescription": {"text": "Dangling fetch: GET /branches (app/static/assets/js/map.js:45)"}, "fullDescription": {"text": "`app/static/assets/js/map.js:45` calls `GET /branches` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/branches`\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-be4d311d800602d6", "name": "Dangling fetch: GET /flags?limit=200 (app/static/assets/js/map.js:46)", "shortDescription": {"text": "Dangling fetch: GET /flags?limit=200 (app/static/assets/js/map.js:46)"}, "fullDescription": {"text": "`app/static/assets/js/map.js:46` calls `GET /flags?limit=200` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/flags`\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-a4a7366031a3653c", "name": "Dangling fetch: POST /flags (app/static/assets/js/map.js:188)", "shortDescription": {"text": "Dangling fetch: POST /flags (app/static/assets/js/map.js:188)"}, "fullDescription": {"text": "`app/static/assets/js/map.js:188` calls `POST /flags` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/flags`\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-c7f5e4fb1ba037ed", "name": "Dangling fetch: PATCH /flags/${id} (app/static/assets/js/map.js:204)", "shortDescription": {"text": "Dangling fetch: PATCH /flags/${id} (app/static/assets/js/map.js:204)"}, "fullDescription": {"text": "`app/static/assets/js/map.js:204` calls `PATCH /flags/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/flags/<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-8ee316a25d5608c9", "name": "Dangling fetch: GET /library/readers (app/static/assets/js/education.js:19)", "shortDescription": {"text": "Dangling fetch: GET /library/readers (app/static/assets/js/education.js:19)"}, "fullDescription": {"text": "`app/static/assets/js/education.js:19` calls `GET /library/readers` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/library/readers`\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-75e561fe342fcfe9", "name": "Dangling fetch: GET /education/scores (app/static/assets/js/education.js:33)", "shortDescription": {"text": "Dangling fetch: GET /education/scores (app/static/assets/js/education.js:33)"}, "fullDescription": {"text": "`app/static/assets/js/education.js:33` calls `GET /education/scores` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/education/scores`\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-511456f198fa0083", "name": "Dangling fetch: GET /council/prompts (app/static/assets/js/education.js:110)", "shortDescription": {"text": "Dangling fetch: GET /council/prompts (app/static/assets/js/education.js:110)"}, "fullDescription": {"text": "`app/static/assets/js/education.js:110` calls `GET /council/prompts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/council/prompts`\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-71957c83ce7ac108", "name": "Dangling fetch: GET /education/scores (app/static/assets/js/education.js:144)", "shortDescription": {"text": "Dangling fetch: GET /education/scores (app/static/assets/js/education.js:144)"}, "fullDescription": {"text": "`app/static/assets/js/education.js:144` calls `GET /education/scores` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/education/scores`\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-6bb71cfcfc0765c2", "name": "Dangling fetch: POST /tech/tasks (app/static/assets/js/education.js:171)", "shortDescription": {"text": "Dangling fetch: POST /tech/tasks (app/static/assets/js/education.js:171)"}, "fullDescription": {"text": "`app/static/assets/js/education.js:171` calls `POST /tech/tasks` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tech/tasks`\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-8369fefa1705fe9a", "name": "Dangling fetch: GET /constitution (app/static/assets/js/constitution.js:11)", "shortDescription": {"text": "Dangling fetch: GET /constitution (app/static/assets/js/constitution.js:11)"}, "fullDescription": {"text": "`app/static/assets/js/constitution.js:11` calls `GET /constitution` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/constitution`\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-ed3d2985854e18ee", "name": "Dangling fetch: PUT /constitution (app/static/assets/js/constitution.js:31)", "shortDescription": {"text": "Dangling fetch: PUT /constitution (app/static/assets/js/constitution.js:31)"}, "fullDescription": {"text": "`app/static/assets/js/constitution.js:31` calls `PUT /constitution` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/constitution`\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-21466bb9a917cbdc", "name": "Dangling fetch: POST /bs/agent-run/${d.agent}${qs} (app/static/assets/js/butler_router.js:68)", "shortDescription": {"text": "Dangling fetch: POST /bs/agent-run/${d.agent}${qs} (app/static/assets/js/butler_router.js:68)"}, "fullDescription": {"text": "`app/static/assets/js/butler_router.js:68` calls `POST /bs/agent-run/${d.agent}${qs}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/bs/agent-run/<p>/<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-1b3f7654bfbd6716", "name": "Dangling fetch: GET /agent-log/${run.run_id}/tail?since=${since} (app/static/assets/js/butler_router.js:77)", "shortDescription": {"text": "Dangling fetch: GET /agent-log/${run.run_id}/tail?since=${since} (app/static/assets/js/butler_router.js:77)"}, "fullDescription": {"text": "`app/static/assets/js/butler_router.js:77` calls `GET /agent-log/${run.run_id}/tail?since=${since}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent-log/<p>/tail`\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-dfa2bd44121a7c9e", "name": "Dangling fetch: GET /build/queue (app/static/assets/js/build.js:16)", "shortDescription": {"text": "Dangling fetch: GET /build/queue (app/static/assets/js/build.js:16)"}, "fullDescription": {"text": "`app/static/assets/js/build.js:16` calls `GET /build/queue` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/build/queue`\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-020b9326041bdb2d", "name": "Dangling fetch: GET /build/foreman (app/static/assets/js/build.js:32)", "shortDescription": {"text": "Dangling fetch: GET /build/foreman (app/static/assets/js/build.js:32)"}, "fullDescription": {"text": "`app/static/assets/js/build.js:32` calls `GET /build/foreman` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/build/foreman`\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-a14f68bc18c4e3a1", "name": "Dangling fetch: PATCH /build/queue/${id} (app/static/assets/js/build.js:144)", "shortDescription": {"text": "Dangling fetch: PATCH /build/queue/${id} (app/static/assets/js/build.js:144)"}, "fullDescription": {"text": "`app/static/assets/js/build.js:144` calls `PATCH /build/queue/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/build/queue/<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-42fd424b120351b0", "name": "Dangling fetch: GET /audit/status (app/static/assets/js/audit.js:10)", "shortDescription": {"text": "Dangling fetch: GET /audit/status (app/static/assets/js/audit.js:10)"}, "fullDescription": {"text": "`app/static/assets/js/audit.js:10` calls `GET /audit/status` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/audit/status`\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-eeb049ba022a1dde", "name": "Dangling fetch: GET /civilization/agents (app/static/assets/js/audit.js:11)", "shortDescription": {"text": "Dangling fetch: GET /civilization/agents (app/static/assets/js/audit.js:11)"}, "fullDescription": {"text": "`app/static/assets/js/audit.js:11` calls `GET /civilization/agents` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/civilization/agents`\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-97110c37528e0f6f", "name": "Dangling fetch: GET /council/sessions?limit=100 (app/static/assets/js/audit.js:12)", "shortDescription": {"text": "Dangling fetch: GET /council/sessions?limit=100 (app/static/assets/js/audit.js:12)"}, "fullDescription": {"text": "`app/static/assets/js/audit.js:12` calls `GET /council/sessions?limit=100` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/council/sessions`\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-1e9a304d188f9dcc", "name": "Dangling fetch: POST /audit/run (app/static/assets/js/audit.js:212)", "shortDescription": {"text": "Dangling fetch: POST /audit/run (app/static/assets/js/audit.js:212)"}, "fullDescription": {"text": "`app/static/assets/js/audit.js:212` calls `POST /audit/run` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/audit/run`\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-d4167f2630bf3aae", "name": "Dangling fetch: POST /trigger/professor (app/static/assets/js/audit.js:213)", "shortDescription": {"text": "Dangling fetch: POST /trigger/professor (app/static/assets/js/audit.js:213)"}, "fullDescription": {"text": "`app/static/assets/js/audit.js:213` calls `POST /trigger/professor` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trigger/professor`\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-1c713df23d5fc536", "name": "Dangling fetch: POST /bs/books/tolstyak/scout/all (app/static/assets/js/command_palette.js:27)", "shortDescription": {"text": "Dangling fetch: POST /bs/books/tolstyak/scout/all (app/static/assets/js/command_palette.js:27)"}, "fullDescription": {"text": "`app/static/assets/js/command_palette.js:27` calls `POST /bs/books/tolstyak/scout/all` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/bs/books/tolstyak/scout/all`\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-60f83b93c010bf23", "name": "Dangling fetch: POST /bs/scout/all (app/static/assets/js/book_studio.js:150)", "shortDescription": {"text": "Dangling fetch: POST /bs/scout/all (app/static/assets/js/book_studio.js:150)"}, "fullDescription": {"text": "`app/static/assets/js/book_studio.js:150` calls `POST /bs/scout/all` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/bs/scout/all`\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-b9fda8a8f61b137c", "name": "Dangling fetch: GET /agent-log/recent?limit=5 (app/static/assets/js/agent_office.js:80)", "shortDescription": {"text": "Dangling fetch: GET /agent-log/recent?limit=5 (app/static/assets/js/agent_office.js:80)"}, "fullDescription": {"text": "`app/static/assets/js/agent_office.js:80` calls `GET /agent-log/recent?limit=5` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent-log/recent`\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-b270a26675d28945", "name": "Dangling fetch: GET /agent-log/${d.run_id}/tail?since=${since} (app/static/assets/js/agent_office.js:106)", "shortDescription": {"text": "Dangling fetch: GET /agent-log/${d.run_id}/tail?since=${since} (app/static/assets/js/agent_office.js:106)"}, "fullDescription": {"text": "`app/static/assets/js/agent_office.js:106` calls `GET /agent-log/${d.run_id}/tail?since=${since}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent-log/<p>/tail`\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-5c713e605c7f8a9a", "name": "Dangling fetch: GET /civilization/agents (app/static/world/wyrd_hybrid.js:403)", "shortDescription": {"text": "Dangling fetch: GET /civilization/agents (app/static/world/wyrd_hybrid.js:403)"}, "fullDescription": {"text": "`app/static/world/wyrd_hybrid.js:403` calls `GET /civilization/agents` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/civilization/agents`\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-4fd9662fdd79133f", "name": "Dangling fetch: GET /civilization/agents (app/static/world/wyrd_live.js:91)", "shortDescription": {"text": "Dangling fetch: GET /civilization/agents (app/static/world/wyrd_live.js:91)"}, "fullDescription": {"text": "`app/static/world/wyrd_live.js:91` calls `GET /civilization/agents` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/civilization/agents`\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-8f8a9cf309a6366b", "name": "Dangling fetch: GET /council/sessions?limit=1 (app/static/world/wyrd_live.js:92)", "shortDescription": {"text": "Dangling fetch: GET /council/sessions?limit=1 (app/static/world/wyrd_live.js:92)"}, "fullDescription": {"text": "`app/static/world/wyrd_live.js:92` calls `GET /council/sessions?limit=1` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/council/sessions`\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-69a693dfc33637f4", "name": "Unused endpoint: POST /run", "shortDescription": {"text": "Unused endpoint: POST /run"}, "fullDescription": {"text": "`app/audit_agent.py` declares `POST /run` 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-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`app/main.py` declares `GET /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-854974fd7784915d", "name": "Unused endpoint: GET /hq", "shortDescription": {"text": "Unused endpoint: GET /hq"}, "fullDescription": {"text": "`app/main.py` declares `GET /hq` 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-b775129bea2b2b9a", "name": "Unused endpoint: GET /thomas", "shortDescription": {"text": "Unused endpoint: GET /thomas"}, "fullDescription": {"text": "`app/main.py` declares `GET /thomas` 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-8031a83ad375986b", "name": "Unused endpoint: GET /studio", "shortDescription": {"text": "Unused endpoint: GET /studio"}, "fullDescription": {"text": "`app/main.py` declares `GET /studio` 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-2c5793a963202f52", "name": "Unused endpoint: GET /pulse", "shortDescription": {"text": "Unused endpoint: GET /pulse"}, "fullDescription": {"text": "`app/main.py` declares `GET /pulse` 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-3e3c68b43cbb73af", "name": "Unused endpoint: GET /agent/{name}", "shortDescription": {"text": "Unused endpoint: GET /agent/{name}"}, "fullDescription": {"text": "`app/main.py` declares `GET /agent/{name}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5881fad21d09723d", "name": "Unused endpoint: GET /manifest.json", "shortDescription": {"text": "Unused endpoint: GET /manifest.json"}, "fullDescription": {"text": "`app/main.py` declares `GET /manifest.json` 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-8891075661fa1768", "name": "Unused endpoint: POST /trigger/all", "shortDescription": {"text": "Unused endpoint: POST /trigger/all"}, "fullDescription": {"text": "`app/main.py` declares `POST /trigger/all` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-74f9f23540e1440e", "name": "Unused endpoint: POST /trigger/{agent}", "shortDescription": {"text": "Unused endpoint: POST /trigger/{agent}"}, "fullDescription": {"text": "`app/main.py` declares `POST /trigger/{agent}` 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-67d28fa8cd6bb12f", "name": "Unused endpoint: PUT /", "shortDescription": {"text": "Unused endpoint: PUT /"}, "fullDescription": {"text": "`app/routers/constitution.py` declares `PUT /` 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-af53906f953d0c4e", "name": "Unused endpoint: POST /cycle-result", "shortDescription": {"text": "Unused endpoint: POST /cycle-result"}, "fullDescription": {"text": "`app/routers/education.py` declares `POST /cycle-result` 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-cbcb9b9a9dbf4265", "name": "Unused endpoint: GET /scores", "shortDescription": {"text": "Unused endpoint: GET /scores"}, "fullDescription": {"text": "`app/routers/education.py` declares `GET /scores` 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-304b6f2b403d93f7", "name": "Unused endpoint: POST /register", "shortDescription": {"text": "Unused endpoint: POST /register"}, "fullDescription": {"text": "`app/routers/branches.py` declares `POST /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-c124716a4436518b", "name": "Unused endpoint: GET /reports", "shortDescription": {"text": "Unused endpoint: GET /reports"}, "fullDescription": {"text": "`app/routers/ideas_dept.py` declares `GET /reports` 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-004ed1ef171c54a7", "name": "Unused endpoint: GET /reports/latest", "shortDescription": {"text": "Unused endpoint: GET /reports/latest"}, "fullDescription": {"text": "`app/routers/ideas_dept.py` declares `GET /reports/latest` 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-3140e61d7cac5091", "name": "Unused endpoint: GET /agents", "shortDescription": {"text": "Unused endpoint: GET /agents"}, "fullDescription": {"text": "`app/routers/civilization.py` declares `GET /agents` 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-2f3fa31f1e9b1b90", "name": "Unused endpoint: POST /agents", "shortDescription": {"text": "Unused endpoint: POST /agents"}, "fullDescription": {"text": "`app/routers/civilization.py` declares `POST /agents` 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-b30cbdd177c13681", "name": "Unused endpoint: GET /agents/{agent_id}", "shortDescription": {"text": "Unused endpoint: GET /agents/{agent_id}"}, "fullDescription": {"text": "`app/routers/civilization.py` declares `GET /agents/{agent_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-43335e6c9e96b89f", "name": "Unused endpoint: POST /agents/{agent_id}/trigger", "shortDescription": {"text": "Unused endpoint: POST /agents/{agent_id}/trigger"}, "fullDescription": {"text": "`app/routers/civilization.py` declares `POST /agents/{agent_id}/trigger` 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-edd9ca52371b491b", "name": "Unused endpoint: POST /agents/{agent_id}/pulse", "shortDescription": {"text": "Unused endpoint: POST /agents/{agent_id}/pulse"}, "fullDescription": {"text": "`app/routers/civilization.py` declares `POST /agents/{agent_id}/pulse` 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-615600bf017add87", "name": "Unused endpoint: GET /agents/{agent_id}/prompt", "shortDescription": {"text": "Unused endpoint: GET /agents/{agent_id}/prompt"}, "fullDescription": {"text": "`app/routers/civilization.py` declares `GET /agents/{agent_id}/prompt` 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-68f846ee827b1fba", "name": "Unused endpoint: PUT /agents/{agent_id}/prompt", "shortDescription": {"text": "Unused endpoint: PUT /agents/{agent_id}/prompt"}, "fullDescription": {"text": "`app/routers/civilization.py` declares `PUT /agents/{agent_id}/prompt` 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-481261cdd4cda8b6", "name": "Unused endpoint: GET /agents/{agent_id}/journal", "shortDescription": {"text": "Unused endpoint: GET /agents/{agent_id}/journal"}, "fullDescription": {"text": "`app/routers/civilization.py` declares `GET /agents/{agent_id}/journal` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6870010d866a1d4a", "name": "Unused endpoint: POST /agents/{agent_id}/journal", "shortDescription": {"text": "Unused endpoint: POST /agents/{agent_id}/journal"}, "fullDescription": {"text": "`app/routers/civilization.py` declares `POST /agents/{agent_id}/journal` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4d0b75c541565cd9", "name": "Unused endpoint: GET /journal", "shortDescription": {"text": "Unused endpoint: GET /journal"}, "fullDescription": {"text": "`app/routers/civilization.py` declares `GET /journal` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f37b4c55488c6145", "name": "Unused endpoint: POST /agents/{agent_id}/train", "shortDescription": {"text": "Unused endpoint: POST /agents/{agent_id}/train"}, "fullDescription": {"text": "`app/routers/civilization.py` declares `POST /agents/{agent_id}/train` 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-0661a017d8970e67", "name": "Unused endpoint: GET /proposals", "shortDescription": {"text": "Unused endpoint: GET /proposals"}, "fullDescription": {"text": "`app/routers/civilization.py` declares `GET /proposals` 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-bc031ab87451a9fa", "name": "Unused endpoint: POST /proposals", "shortDescription": {"text": "Unused endpoint: POST /proposals"}, "fullDescription": {"text": "`app/routers/civilization.py` declares `POST /proposals` 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-2d928cfddca27425", "name": "Unused endpoint: PATCH /proposals/{prop_id}", "shortDescription": {"text": "Unused endpoint: PATCH /proposals/{prop_id}"}, "fullDescription": {"text": "`app/routers/civilization.py` declares `PATCH /proposals/{prop_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-cb7be80d77423fe1", "name": "Unused endpoint: GET /agent-reports", "shortDescription": {"text": "Unused endpoint: GET /agent-reports"}, "fullDescription": {"text": "`app/routers/civilization.py` declares `GET /agent-reports` 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-55bedc79e2f4268e", "name": "Unused endpoint: GET /passports", "shortDescription": {"text": "Unused endpoint: GET /passports"}, "fullDescription": {"text": "`app/routers/civilization.py` declares `GET /passports` 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-e3ba0de7cd6007c5", "name": "Unused endpoint: PATCH /passports/{agent_name}/activate", "shortDescription": {"text": "Unused endpoint: PATCH /passports/{agent_name}/activate"}, "fullDescription": {"text": "`app/routers/civilization.py` declares `PATCH /passports/{agent_name}/activate` 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-362b9f4f3e4e4222", "name": "Unused endpoint: POST /scribe-webhook", "shortDescription": {"text": "Unused endpoint: POST /scribe-webhook"}, "fullDescription": {"text": "`app/routers/scribe_proxy.py` declares `POST /scribe-webhook` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ca4c3a6fd7d717d0", "name": "Unused endpoint: GET /brief", "shortDescription": {"text": "Unused endpoint: GET /brief"}, "fullDescription": {"text": "`app/routers/hq_world.py` declares `GET /brief` 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-7a009b1a56794f45", "name": "Unused endpoint: POST /", "shortDescription": {"text": "Unused endpoint: POST /"}, "fullDescription": {"text": "`app/routers/backups.py` declares `POST /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d16e4fa529c520e9", "name": "Unused endpoint: GET /search", "shortDescription": {"text": "Unused endpoint: GET /search"}, "fullDescription": {"text": "`app/routers/memory.py` declares `GET /search` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cd8dc4599ec52a08", "name": "Unused endpoint: GET /stats", "shortDescription": {"text": "Unused endpoint: GET /stats"}, "fullDescription": {"text": "`app/routers/dispatcher_proxy.py` declares `GET /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-01a333a34760fca3", "name": "Unused endpoint: GET /prompts", "shortDescription": {"text": "Unused endpoint: GET /prompts"}, "fullDescription": {"text": "`app/routers/council.py` declares `GET /prompts` 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-b15d518d538de57d", "name": "Unused endpoint: GET /sessions", "shortDescription": {"text": "Unused endpoint: GET /sessions"}, "fullDescription": {"text": "`app/routers/council.py` declares `GET /sessions` 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-92efb2dc9205e7a4", "name": "Unused endpoint: POST /sessions", "shortDescription": {"text": "Unused endpoint: POST /sessions"}, "fullDescription": {"text": "`app/routers/council.py` declares `POST /sessions` 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-41c23ec3b2c0e166", "name": "Unused endpoint: GET /sessions/{session_id}", "shortDescription": {"text": "Unused endpoint: GET /sessions/{session_id}"}, "fullDescription": {"text": "`app/routers/council.py` declares `GET /sessions/{session_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cf67944bdc3564bd", "name": "Unused endpoint: GET /sessions/{session_id}/messages", "shortDescription": {"text": "Unused endpoint: GET /sessions/{session_id}/messages"}, "fullDescription": {"text": "`app/routers/council.py` declares `GET /sessions/{session_id}/messages` 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-fe072aed3c22cbb1", "name": "Unused endpoint: GET /thoughts", "shortDescription": {"text": "Unused endpoint: GET /thoughts"}, "fullDescription": {"text": "`app/routers/council.py` declares `GET /thoughts` 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-3949483d29cd466f", "name": "Unused endpoint: POST /thoughts", "shortDescription": {"text": "Unused endpoint: POST /thoughts"}, "fullDescription": {"text": "`app/routers/council.py` declares `POST /thoughts` 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-e209d54c92e512ab", "name": "Unused endpoint: DELETE /thoughts", "shortDescription": {"text": "Unused endpoint: DELETE /thoughts"}, "fullDescription": {"text": "`app/routers/council.py` declares `DELETE /thoughts` 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-7b52fcc22ba5e3d2", "name": "Unused endpoint: DELETE /sessions", "shortDescription": {"text": "Unused endpoint: DELETE /sessions"}, "fullDescription": {"text": "`app/routers/council.py` declares `DELETE /sessions` 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-cafc7483ac57e06a", "name": "Unused endpoint: GET /ui", "shortDescription": {"text": "Unused endpoint: GET /ui"}, "fullDescription": {"text": "`app/routers/thomas_proxy.py` declares `GET /ui` 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-384fad3ae5a4606f", "name": "Unused endpoint: GET /ui/{path:path}", "shortDescription": {"text": "Unused endpoint: GET /ui/{path:path}"}, "fullDescription": {"text": "`app/routers/thomas_proxy.py` declares `GET /ui/{path:path}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-eb0428442a390121", "name": "Unused endpoint: GET /docs", "shortDescription": {"text": "Unused endpoint: GET /docs"}, "fullDescription": {"text": "`app/routers/thomas_proxy.py` declares `GET /docs` 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/22088"}, "properties": {"repository": "vasiliiilin2107-beep/wyrd-hq", "repoUrl": "https://github.com/vasiliiilin2107-beep/wyrd-hq", "branch": "main"}, "results": [{"ruleId": "scanner-a63c2efc9a92bd2c", "level": "note", "message": {"text": "Possibly dead Python function: do_POST"}, "properties": {"repobilityId": "53357410ca9379a9", "scanner": "scanner-primary", "fingerprint": "a63c2efc9a92bd2c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/preview_stub.py:123"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3a1eeb8f30a5fb33", "level": "note", "message": {"text": "Possibly dead Python function: log_message"}, "properties": {"repobilityId": "965f3150b4af5b2e", "scanner": "scanner-primary", "fingerprint": "3a1eeb8f30a5fb33", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/preview_stub.py:133"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4a190e07e5172a50", "level": "note", "message": {"text": "Possibly dead Python function: register_analytics_foreman"}, "properties": {"repobilityId": "4721767a246053dd", "scanner": "scanner-primary", "fingerprint": "4a190e07e5172a50", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/foreman_agent.py:97"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-93dfb0c2d075967c", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 app/static/assets/js/hq.js:703"}, "properties": {"repobilityId": "3e1b67bf75237e3d", "scanner": "scanner-primary", "fingerprint": "93dfb0c2d075967c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-5e3dd760c799b7b3", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 app/static/assets/js/map.js:105"}, "properties": {"repobilityId": "f68a3090ad4ffc92", "scanner": "scanner-primary", "fingerprint": "5e3dd760c799b7b3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-37e0c18402b5b2aa", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 app/static/assets/js/education.js:133"}, "properties": {"repobilityId": "fd6f10fe6aedaff3", "scanner": "scanner-primary", "fingerprint": "37e0c18402b5b2aa", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-1ad54e82236ad9fa", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 app/static/assets/js/book_studio.js:184"}, "properties": {"repobilityId": "7bff25d53e922cef", "scanner": "scanner-primary", "fingerprint": "1ad54e82236ad9fa", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-4f9296907bd74d2e", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 app/static/assets/js/agent_office.js:47"}, "properties": {"repobilityId": "c95a56c92999a1b0", "scanner": "scanner-primary", "fingerprint": "4f9296907bd74d2e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-d63da3583b14afc0", "level": "warning", "message": {"text": "Dockerfile runs as root: Dockerfile"}, "properties": {"repobilityId": "a2ed1bd120e507db", "scanner": "scanner-primary", "fingerprint": "d63da3583b14afc0", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-de3c1f217d72a063", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim"}, "properties": {"repobilityId": "1de0ecd007803dbd", "scanner": "scanner-primary", "fingerprint": "de3c1f217d72a063", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"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-bd3acec92d92cfb5", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/thomas.html:352"}, "properties": {"repobilityId": "99bc71f4dd79b7b6", "scanner": "scanner-primary", "fingerprint": "bd3acec92d92cfb5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/static/thomas.html"}, "region": {"startLine": 352}}}]}, {"ruleId": "scanner-2ceac576e385b7a5", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/pulse.html:201"}, "properties": {"repobilityId": "e889a47ce1b4b4ac", "scanner": "scanner-primary", "fingerprint": "2ceac576e385b7a5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/static/pulse.html"}, "region": {"startLine": 201}}}]}, {"ruleId": "scanner-e045e53f322de051", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/index.html:367"}, "properties": {"repobilityId": "a97dfede071e5ef1", "scanner": "scanner-primary", "fingerprint": "e045e53f322de051", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/static/index.html"}, "region": {"startLine": 367}}}]}, {"ruleId": "scanner-c7c0c8997be5813f", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/agent_passport.html:161"}, "properties": {"repobilityId": "ecbf2bc29134be79", "scanner": "scanner-primary", "fingerprint": "c7c0c8997be5813f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/static/agent_passport.html"}, "region": {"startLine": 161}}}]}, {"ruleId": "scanner-0d5dd07c9526489e", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/hq.html:750"}, "properties": {"repobilityId": "75e832b72dd7b603", "scanner": "scanner-primary", "fingerprint": "0d5dd07c9526489e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/static/hq.html"}, "region": {"startLine": 750}}}]}, {"ruleId": "scanner-ce64af9d7267ebcb", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/technik.js:15"}, "properties": {"repobilityId": "d3fc2527ee285328", "scanner": "scanner-primary", "fingerprint": "ce64af9d7267ebcb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/static/assets/js/technik.js"}, "region": {"startLine": 15}}}]}, {"ruleId": "scanner-c422fa179899f2b7", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/world.js:19"}, "properties": {"repobilityId": "33144b514bc11973", "scanner": "scanner-primary", "fingerprint": "c422fa179899f2b7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/static/assets/js/world.js"}, "region": {"startLine": 19}}}]}, {"ruleId": "scanner-67d24fb7f3150b80", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/butler.js:172"}, "properties": {"repobilityId": "a3aa8d7ef3696230", "scanner": "scanner-primary", "fingerprint": "67d24fb7f3150b80", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/static/assets/js/butler.js"}, "region": {"startLine": 172}}}]}, {"ruleId": "scanner-fb3ed1825fe2dca6", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/scribe.js:14"}, "properties": {"repobilityId": "aa188ba4bdb41832", "scanner": "scanner-primary", "fingerprint": "fb3ed1825fe2dca6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/static/assets/js/scribe.js"}, "region": {"startLine": 14}}}]}, {"ruleId": "scanner-9f648084d0aed434", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/library.js:33"}, "properties": {"repobilityId": "f26f97fb9f6205df", "scanner": "scanner-primary", "fingerprint": "9f648084d0aed434", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/static/assets/js/library.js"}, "region": {"startLine": 33}}}]}, {"ruleId": "scanner-cdb3afa7b5ce6a8d", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/home.js:36"}, "properties": {"repobilityId": "d49b28810de929ec", "scanner": "scanner-primary", "fingerprint": "cdb3afa7b5ce6a8d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/static/assets/js/home.js"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-87f111064469317c", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/ideas.js:15"}, "properties": {"repobilityId": "ee28701098fb0b39", "scanner": "scanner-primary", "fingerprint": "87f111064469317c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/static/assets/js/ideas.js"}, "region": {"startLine": 15}}}]}, {"ruleId": "scanner-5b00fbc5d095f007", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/civilization.js:115"}, "properties": {"repobilityId": "a14b6ea1245bbed7", "scanner": "scanner-primary", "fingerprint": "5b00fbc5d095f007", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/static/assets/js/civilization.js"}, "region": {"startLine": 115}}}]}, {"ruleId": "scanner-8207eeccf388cdd3", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/hq.js:164"}, "properties": {"repobilityId": "b796fb4cdcd82290", "scanner": "scanner-primary", "fingerprint": "8207eeccf388cdd3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/static/assets/js/hq.js"}, "region": {"startLine": 164}}}]}, {"ruleId": "scanner-f7ea6b0498dbba96", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/solar.js:105"}, "properties": {"repobilityId": "51a113c8733512d4", "scanner": "scanner-primary", "fingerprint": "f7ea6b0498dbba96", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/static/assets/js/solar.js"}, "region": {"startLine": 105}}}]}, {"ruleId": "scanner-3aa68f905edb1eb8", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/dispatcher.js:34"}, "properties": {"repobilityId": "89a8c5a1da43760a", "scanner": "scanner-primary", "fingerprint": "3aa68f905edb1eb8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/static/assets/js/dispatcher.js"}, "region": {"startLine": 34}}}]}, {"ruleId": "scanner-a6d7ac4c9c918579", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/files.js:9"}, "properties": {"repobilityId": "0a2706c5e800b0f8", "scanner": "scanner-primary", "fingerprint": "a6d7ac4c9c918579", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/static/assets/js/files.js"}, "region": {"startLine": 9}}}]}, {"ruleId": "scanner-b15a69958c7e81f7", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/babla.js:23"}, "properties": {"repobilityId": "af8d7e01a30c1ddc", "scanner": "scanner-primary", "fingerprint": "b15a69958c7e81f7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/static/assets/js/babla.js"}, "region": {"startLine": 23}}}]}, {"ruleId": "scanner-1f383c4592aae1c0", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/map.js:42"}, "properties": {"repobilityId": "f5064373757e5e13", "scanner": "scanner-primary", "fingerprint": "1f383c4592aae1c0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/static/assets/js/map.js"}, "region": {"startLine": 42}}}]}, {"ruleId": "scanner-c963cd95dcdfe274", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/education.js:26"}, "properties": {"repobilityId": "0b8de1647d9c3b02", "scanner": "scanner-primary", "fingerprint": "c963cd95dcdfe274", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/static/assets/js/education.js"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-5e70dc1f3a141bd8", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/butler_router.js:31"}, "properties": {"repobilityId": "31b5f5fd7c303b1d", "scanner": "scanner-primary", "fingerprint": "5e70dc1f3a141bd8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/static/assets/js/butler_router.js"}, "region": {"startLine": 31}}}]}, {"ruleId": "scanner-877d3d0c938c29fd", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/build.js:14"}, "properties": {"repobilityId": "c21f7f3b66815f80", "scanner": "scanner-primary", "fingerprint": "877d3d0c938c29fd", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/static/assets/js/build.js"}, "region": {"startLine": 14}}}]}, {"ruleId": "scanner-8bc9e4b2594a86a1", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/audit.js:31"}, "properties": {"repobilityId": "4423d7acdbcb152d", "scanner": "scanner-primary", "fingerprint": "8bc9e4b2594a86a1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/static/assets/js/audit.js"}, "region": {"startLine": 31}}}]}, {"ruleId": "scanner-3674399a80accc65", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/command_palette.js:65"}, "properties": {"repobilityId": "265f799e762f529d", "scanner": "scanner-primary", "fingerprint": "3674399a80accc65", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/static/assets/js/command_palette.js"}, "region": {"startLine": 65}}}]}, {"ruleId": "scanner-3ea199e48ed27891", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/book_studio_gallery.js:15"}, "properties": {"repobilityId": "eb27c1cac6b4de2d", "scanner": "scanner-primary", "fingerprint": "3ea199e48ed27891", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/static/assets/js/book_studio_gallery.js"}, "region": {"startLine": 15}}}]}, {"ruleId": "scanner-d6f432bb96134f96", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/book_studio.js:27"}, "properties": {"repobilityId": "3d46d705283cb227", "scanner": "scanner-primary", "fingerprint": "d6f432bb96134f96", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/static/assets/js/book_studio.js"}, "region": {"startLine": 27}}}]}, {"ruleId": "scanner-7db768711bc457fd", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/assets/js/agent_office.js:40"}, "properties": {"repobilityId": "46214846c47b6b0c", "scanner": "scanner-primary", "fingerprint": "7db768711bc457fd", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/static/assets/js/agent_office.js"}, "region": {"startLine": 40}}}]}, {"ruleId": "scanner-124e93d30c32f6a5", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/static/world/wyrd_connections.js:44"}, "properties": {"repobilityId": "e7de1fa513efe21c", "scanner": "scanner-primary", "fingerprint": "124e93d30c32f6a5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/static/world/wyrd_connections.js"}, "region": {"startLine": 44}}}]}, {"ruleId": "scanner-51128c6342aaecaa", "level": "error", "message": {"text": "Insecure pattern 'tls_verify_false' in app/routers/dispatcher_proxy.py:19"}, "properties": {"repobilityId": "b5851093140369ee", "scanner": "scanner-primary", "fingerprint": "51128c6342aaecaa", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "tls_verify_false"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/routers/dispatcher_proxy.py"}, "region": {"startLine": 19}}}]}, {"ruleId": "scanner-e980ee0dfcf281e2", "level": "error", "message": {"text": "Insecure pattern 'tls_verify_false' in app/routers/butler_tts.py:26"}, "properties": {"repobilityId": "0ebd004ce2d204e8", "scanner": "scanner-primary", "fingerprint": "e980ee0dfcf281e2", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "tls_verify_false"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/routers/butler_tts.py"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "0a5294e43c29baad", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-faccb9061e9b52a0", "level": "note", "message": {"text": "No README detected"}, "properties": {"repobilityId": "c38f9abb6ef8e62a", "scanner": "scanner-primary", "fingerprint": "faccb9061e9b52a0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["docs", "readme", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "70d72b9ada5e37d0", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "11e2fa23e31c1fee", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "96a18b9769859982", "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": "48021a5a9212e505", "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": "b27bece0cdab9379", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-96422f3d81ddf6a4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/static/assets/js/world.js:116"}, "properties": {"repobilityId": "74345a436f444a15", "scanner": "scanner-primary", "fingerprint": "96422f3d81ddf6a4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1a5db1b0deb96151", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/static/assets/js/home.js:39"}, "properties": {"repobilityId": "cbe288c8012e28ff", "scanner": "scanner-primary", "fingerprint": "1a5db1b0deb96151", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9bd58e46b0f23565", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/static/assets/js/hq.js:776"}, "properties": {"repobilityId": "fbb13ed385205644", "scanner": "scanner-primary", "fingerprint": "9bd58e46b0f23565", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6cc1c28b3fedf6ab", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/static/assets/js/dispatcher.js:6"}, "properties": {"repobilityId": "02012a322135d3b7", "scanner": "scanner-primary", "fingerprint": "6cc1c28b3fedf6ab", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0e0d865997f1c191", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/static/assets/js/babla.js:8"}, "properties": {"repobilityId": "37b56f489be0521e", "scanner": "scanner-primary", "fingerprint": "0e0d865997f1c191", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-530ebbb6b8b7d854", "level": "note", "message": {"text": "Legacy-named symbol `create_backup` in app/routers/backups.py:36"}, "properties": {"repobilityId": "f64f8732e3bd06a1", "scanner": "scanner-primary", "fingerprint": "530ebbb6b8b7d854", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "92361478fd06ef4e", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "80a24087e323a198", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "c2bd951be7f12354", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "bfdbb179e381e667", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-58711b814aef058e", "level": "error", "message": {"text": "FastAPI POST `run_now` without auth dependency \u2014 app/audit_agent.py:104"}, "properties": {"repobilityId": "9483b87a5188d0ee", "scanner": "scanner-primary", "fingerprint": "58711b814aef058e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/audit_agent.py"}, "region": {"startLine": 104}}}]}, {"ruleId": "scanner-5899930f0bd1b4ce", "level": "error", "message": {"text": "FastAPI POST `trigger_all` without auth dependency \u2014 app/main.py:154"}, "properties": {"repobilityId": "70c0d8b92d2caed9", "scanner": "scanner-primary", "fingerprint": "5899930f0bd1b4ce", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/main.py"}, "region": {"startLine": 154}}}]}, {"ruleId": "scanner-8e43d2d5199e5b40", "level": "error", "message": {"text": "FastAPI POST `trigger_agent` without auth dependency \u2014 app/main.py:160"}, "properties": {"repobilityId": "8b3001763e995b1c", "scanner": "scanner-primary", "fingerprint": "8e43d2d5199e5b40", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/main.py"}, "region": {"startLine": 160}}}]}, {"ruleId": "scanner-d2858e357b1e1040", "level": "error", "message": {"text": "FastAPI POST `save_cycle_result` without auth dependency \u2014 app/routers/education.py:217"}, "properties": {"repobilityId": "bc90a6934960f201", "scanner": "scanner-primary", "fingerprint": "d2858e357b1e1040", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/routers/education.py"}, "region": {"startLine": 217}}}]}, {"ruleId": "scanner-63159fcd8eb5725e", "level": "error", "message": {"text": "FastAPI POST `run_idea_dept` without auth dependency \u2014 app/routers/ideas_dept.py:27"}, "properties": {"repobilityId": "3b12bbe6c4e3fd34", "scanner": "scanner-primary", "fingerprint": "63159fcd8eb5725e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/routers/ideas_dept.py"}, "region": {"startLine": 27}}}]}, {"ruleId": "scanner-46b1037059fbab81", "level": "error", "message": {"text": "FastAPI POST `scribe_webhook` without auth dependency \u2014 app/routers/scribe_proxy.py:13"}, "properties": {"repobilityId": "81ea1198cb3b2edc", "scanner": "scanner-primary", "fingerprint": "46b1037059fbab81", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/routers/scribe_proxy.py"}, "region": {"startLine": 13}}}]}, {"ruleId": "scanner-e755b6364a35298c", "level": "error", "message": {"text": "FastAPI POST `run_babla` without auth dependency \u2014 app/routers/babla.py:27"}, "properties": {"repobilityId": "da8e48b8dd82ac33", "scanner": "scanner-primary", "fingerprint": "e755b6364a35298c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/routers/babla.py"}, "region": {"startLine": 27}}}]}, {"ruleId": "scanner-e07603c3c80b8e68", "level": "error", "message": {"text": "FastAPI POST `run_analytics` without auth dependency \u2014 app/routers/analytics.py:27"}, "properties": {"repobilityId": "4069d0f5c1ae5d5d", "scanner": "scanner-primary", "fingerprint": "e07603c3c80b8e68", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/routers/analytics.py"}, "region": {"startLine": 27}}}]}, {"ruleId": "scanner-a12f038b56f46a7d", "level": "error", "message": {"text": "FastAPI POST `run_projects_dept` without auth dependency \u2014 app/routers/projects_dept.py:27"}, "properties": {"repobilityId": "39c784581e0ce2a9", "scanner": "scanner-primary", "fingerprint": "a12f038b56f46a7d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/routers/projects_dept.py"}, "region": {"startLine": 27}}}]}, {"ruleId": "scanner-8f428406a0e6a513", "level": "error", "message": {"text": "FastAPI POST `run_all_readers` without auth dependency \u2014 app/routers/library_proxy.py:105"}, "properties": {"repobilityId": "b52d62e29f9fca23", "scanner": "scanner-primary", "fingerprint": "8f428406a0e6a513", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/routers/library_proxy.py"}, "region": {"startLine": 105}}}]}, {"ruleId": "scanner-871594ca6d7a287d", "level": "error", "message": {"text": "FastAPI POST `bs_create_book` without auth dependency \u2014 app/routers/book_studio_proxy.py:58"}, "properties": {"repobilityId": "140624709c6254e7", "scanner": "scanner-primary", "fingerprint": "871594ca6d7a287d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/routers/book_studio_proxy.py"}, "region": {"startLine": 58}}}]}, {"ruleId": "scanner-dd3a6560cea8bc3b", "level": "error", "message": {"text": "FastAPI POST `bs_studio_prepare` without auth dependency \u2014 app/routers/book_studio_proxy.py:63"}, "properties": {"repobilityId": "f1d8f65ae389d34c", "scanner": "scanner-primary", "fingerprint": "dd3a6560cea8bc3b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/routers/book_studio_proxy.py"}, "region": {"startLine": 63}}}]}, {"ruleId": "scanner-6011f04727ef03bd", "level": "error", "message": {"text": "FastAPI POST `bs_generate` without auth dependency \u2014 app/routers/book_studio_proxy.py:88"}, "properties": {"repobilityId": "deac853f5e1bde0f", "scanner": "scanner-primary", "fingerprint": "6011f04727ef03bd", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/routers/book_studio_proxy.py"}, "region": {"startLine": 88}}}]}, {"ruleId": "scanner-613e5b14cb51395f", "level": "error", "message": {"text": "FastAPI POST `bs_publish` without auth dependency \u2014 app/routers/book_studio_proxy.py:97"}, "properties": {"repobilityId": "808adf55e83852f0", "scanner": "scanner-primary", "fingerprint": "613e5b14cb51395f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/routers/book_studio_proxy.py"}, "region": {"startLine": 97}}}]}, {"ruleId": "scanner-79a3d4996a42e238", "level": "error", "message": {"text": "FastAPI POST `bs_feedback` without auth dependency \u2014 app/routers/book_studio_proxy.py:102"}, "properties": {"repobilityId": "970091b9136f9b5b", "scanner": "scanner-primary", "fingerprint": "79a3d4996a42e238", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/routers/book_studio_proxy.py"}, "region": {"startLine": 102}}}]}, {"ruleId": "scanner-4bc973b62086f02a", "level": "error", "message": {"text": "FastAPI POST `bs_conductor_post` without auth dependency \u2014 app/routers/book_studio_proxy.py:135"}, "properties": {"repobilityId": "a9a67d1ddaa89975", "scanner": "scanner-primary", "fingerprint": "4bc973b62086f02a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/routers/book_studio_proxy.py"}, "region": {"startLine": 135}}}]}, {"ruleId": "scanner-d4ae8218a911657b", "level": "error", "message": {"text": "FastAPI POST `bs_school_post` without auth dependency \u2014 app/routers/book_studio_proxy.py:161"}, "properties": {"repobilityId": "17409bbd3f4bafa1", "scanner": "scanner-primary", "fingerprint": "d4ae8218a911657b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/routers/book_studio_proxy.py"}, "region": {"startLine": 161}}}]}, {"ruleId": "scanner-02113ffe4d0df93c", "level": "error", "message": {"text": "FastAPI POST `bs_agent_run` without auth dependency \u2014 app/routers/book_studio_proxy.py:304"}, "properties": {"repobilityId": "c8e25cc1cff5adc5", "scanner": "scanner-primary", "fingerprint": "02113ffe4d0df93c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/routers/book_studio_proxy.py"}, "region": {"startLine": 304}}}]}, {"ruleId": "scanner-0f0977bb80e9c1f4", "level": "error", "message": {"text": "FastAPI POST `bs_next_book` without auth dependency \u2014 app/routers/book_studio_proxy.py:326"}, "properties": {"repobilityId": "e8730ee7dd71e3a2", "scanner": "scanner-primary", "fingerprint": "0f0977bb80e9c1f4", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/routers/book_studio_proxy.py"}, "region": {"startLine": 326}}}]}, {"ruleId": "scanner-a26a482f0d4acd49", "level": "error", "message": {"text": "FastAPI POST `butler_speak` without auth dependency \u2014 app/routers/butler_tts.py:49"}, "properties": {"repobilityId": "03869f22c1953d7d", "scanner": "scanner-primary", "fingerprint": "a26a482f0d4acd49", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/routers/butler_tts.py"}, "region": {"startLine": 49}}}]}, {"ruleId": "scanner-9cfa8045a26d9eca", "level": "error", "message": {"text": "FastAPI POST `butler_chat` without auth dependency \u2014 app/routers/butler.py:122"}, "properties": {"repobilityId": "591d8ae97726e6b0", "scanner": "scanner-primary", "fingerprint": "9cfa8045a26d9eca", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/routers/butler.py"}, "region": {"startLine": 122}}}]}, {"ruleId": "scanner-974d457a95bcef75", "level": "error", "message": {"text": "FastAPI POST `butler_autobrief` without auth dependency \u2014 app/routers/butler.py:204"}, "properties": {"repobilityId": "36b556c935fb0398", "scanner": "scanner-primary", "fingerprint": "974d457a95bcef75", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/routers/butler.py"}, "region": {"startLine": 204}}}]}, {"ruleId": "scanner-7977dc5a3f5f6c50", "level": "error", "message": {"text": "Dangling fetch: GET /tech/tasks?limit=50 (app/static/assets/js/technik.js:17)"}, "properties": {"repobilityId": "f68d88baa9ac68b9", "scanner": "scanner-primary", "fingerprint": "7977dc5a3f5f6c50", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-764db9caa72a893b", "level": "error", "message": {"text": "Dangling fetch: POST /tech/tasks (app/static/assets/js/technik.js:82)"}, "properties": {"repobilityId": "f7cb3adfed98fdf8", "scanner": "scanner-primary", "fingerprint": "764db9caa72a893b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bcd27835e47b9bf3", "level": "error", "message": {"text": "Dangling fetch: GET /tech/tasks?limit=50 (app/static/assets/js/technik.js:96)"}, "properties": {"repobilityId": "c910f1acc7bad46f", "scanner": "scanner-primary", "fingerprint": "bcd27835e47b9bf3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8bd1835c653e888e", "level": "error", "message": {"text": "Dangling fetch: GET /hq-world/health (app/static/assets/js/world.js:116)"}, "properties": {"repobilityId": "803c0b92663d457e", "scanner": "scanner-primary", "fingerprint": "8bd1835c653e888e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ab03125af826f267", "level": "error", "message": {"text": "Dangling fetch: GET /hq-world/brief (app/static/assets/js/world.js:117)"}, "properties": {"repobilityId": "9be3a7aaa96a4793", "scanner": "scanner-primary", "fingerprint": "ab03125af826f267", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-96b3a4ecbb9446f4", "level": "error", "message": {"text": "Dangling fetch: GET /analytics/reports/latest (app/static/assets/js/world.js:118)"}, "properties": {"repobilityId": "cfbbc18807ed3464", "scanner": "scanner-primary", "fingerprint": "96b3a4ecbb9446f4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-992064ab9366f415", "level": "error", "message": {"text": "Dangling fetch: POST /analytics/run (app/static/assets/js/world.js:129)"}, "properties": {"repobilityId": "792d232e96ed5ad4", "scanner": "scanner-primary", "fingerprint": "992064ab9366f415", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-931b1186491fa63b", "level": "error", "message": {"text": "Dangling fetch: POST /butler/speak (app/static/assets/js/butler.js:69)"}, "properties": {"repobilityId": "4339a2cf66341a7e", "scanner": "scanner-primary", "fingerprint": "931b1186491fa63b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-671af3b02b2fc649", "level": "error", "message": {"text": "Dangling fetch: POST /butler/autobrief (app/static/assets/js/butler.js:92)"}, "properties": {"repobilityId": "09015f23aa2fa858", "scanner": "scanner-primary", "fingerprint": "671af3b02b2fc649", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bc0bf2b0a19e5e30", "level": "error", "message": {"text": "Dangling fetch: POST /butler/chat (app/static/assets/js/butler.js:120)"}, "properties": {"repobilityId": "7528931ba3f80d76", "scanner": "scanner-primary", "fingerprint": "bc0bf2b0a19e5e30", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0579e1d03f26d18a", "level": "error", "message": {"text": "Dangling fetch: GET /tokens/scribe/stats (app/static/assets/js/scribe.js:11)"}, "properties": {"repobilityId": "4116dbf408d76823", "scanner": "scanner-primary", "fingerprint": "0579e1d03f26d18a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1b38b92709cbb782", "level": "error", "message": {"text": "Dangling fetch: GET /tokens/scribe/stats (app/static/assets/js/scribe.js:37)"}, "properties": {"repobilityId": "a4409cf87a86098b", "scanner": "scanner-primary", "fingerprint": "1b38b92709cbb782", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5713d51c8350db93", "level": "error", "message": {"text": "Dangling fetch: GET /library/stats (app/static/assets/js/library.js:23)"}, "properties": {"repobilityId": "3e159413d88baea2", "scanner": "scanner-primary", "fingerprint": "5713d51c8350db93", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cc7760111337b4c2", "level": "error", "message": {"text": "Dangling fetch: GET /library/readers (app/static/assets/js/library.js:61)"}, "properties": {"repobilityId": "dc3bb21f706ff22b", "scanner": "scanner-primary", "fingerprint": "cc7760111337b4c2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-993f1b02975cdbaa", "level": "error", "message": {"text": "Dangling fetch: POST /library/readers/${encodeURIComponent(readerId)}/run (app/static/assets/js/library.js:107)"}, "properties": {"repobilityId": "24c3b12b4cabcf55", "scanner": "scanner-primary", "fingerprint": "993f1b02975cdbaa", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f8f415630de5eb87", "level": "error", "message": {"text": "Dangling fetch: POST /library/readers/run-all (app/static/assets/js/library.js:134)"}, "properties": {"repobilityId": "5833ca5566ab6fd5", "scanner": "scanner-primary", "fingerprint": "f8f415630de5eb87", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ef87de0a8c889c5b", "level": "error", "message": {"text": "Dangling fetch: GET /library/recent?limit=20 (app/static/assets/js/library.js:153)"}, "properties": {"repobilityId": "da25b97a854e2bc9", "scanner": "scanner-primary", "fingerprint": "ef87de0a8c889c5b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a7f3b86fce226c44", "level": "error", "message": {"text": "Dangling fetch: GET /library/knowledge/${item.id} (app/static/assets/js/library.js:197)"}, "properties": {"repobilityId": "e25cfa12d4bb47aa", "scanner": "scanner-primary", "fingerprint": "a7f3b86fce226c44", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0b214989273c41c9", "level": "error", "message": {"text": "Dangling fetch: GET /library/search?q=${encodeURIComponent(q)}&limit=10 (app/static/assets/js/library.js:222)"}, "properties": {"repobilityId": "a28845834519da01", "scanner": "scanner-primary", "fingerprint": "0b214989273c41c9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5839d26e5bbc9873", "level": "error", "message": {"text": "Dangling fetch: GET /library/knowledge/${item.id} (app/static/assets/js/library.js:264)"}, "properties": {"repobilityId": "470cd830f64637a3", "scanner": "scanner-primary", "fingerprint": "5839d26e5bbc9873", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f6f44515b1f110f6", "level": "error", "message": {"text": "Dangling fetch: GET /civilization/agents (app/static/assets/js/home.js:39)"}, "properties": {"repobilityId": "0317a915367c14b9", "scanner": "scanner-primary", "fingerprint": "f6f44515b1f110f6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c53188ef668c2aea", "level": "error", "message": {"text": "Dangling fetch: GET /events?limit=20 (app/static/assets/js/home.js:40)"}, "properties": {"repobilityId": "ca9722ad8ccfaedf", "scanner": "scanner-primary", "fingerprint": "c53188ef668c2aea", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-18d7ee85ce40fd5a", "level": "error", "message": {"text": "Dangling fetch: GET /bs/stats (app/static/assets/js/home.js:41)"}, "properties": {"repobilityId": "43817ffe3bff91af", "scanner": "scanner-primary", "fingerprint": "18d7ee85ce40fd5a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-40c2f35858251df8", "level": "error", "message": {"text": "Dangling fetch: GET /council/sessions?limit=1 (app/static/assets/js/home.js:42)"}, "properties": {"repobilityId": "c08cac391b67f7ba", "scanner": "scanner-primary", "fingerprint": "40c2f35858251df8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-40b70545c8e9d53d", "level": "error", "message": {"text": "Dangling fetch: POST /bs/books/tolstyak/scout/all (app/static/assets/js/home.js:235)"}, "properties": {"repobilityId": "351d70727bdf5c74", "scanner": "scanner-primary", "fingerprint": "40b70545c8e9d53d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-777659ece12a64a1", "level": "error", "message": {"text": "Dangling fetch: POST /bs/books/tolstyak/conductor (app/static/assets/js/home.js:241)"}, "properties": {"repobilityId": "97d3f789a53e9128", "scanner": "scanner-primary", "fingerprint": "777659ece12a64a1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-11224883eddfee2d", "level": "error", "message": {"text": "Dangling fetch: PATCH /income/ideas/${id} (app/static/assets/js/ideas.js:70)"}, "properties": {"repobilityId": "8f7435ad5b3a3003", "scanner": "scanner-primary", "fingerprint": "11224883eddfee2d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4d025896908723bc", "level": "error", "message": {"text": "Dangling fetch: DELETE /income/ideas/${id} (app/static/assets/js/ideas.js:86)"}, "properties": {"repobilityId": "29dadc83b5f4d175", "scanner": "scanner-primary", "fingerprint": "4d025896908723bc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-97023e2d06f78708", "level": "error", "message": {"text": "Dangling fetch: GET /civilization/agents (app/static/assets/js/civilization.js:46)"}, "properties": {"repobilityId": "0307b1f3a8c82a0a", "scanner": "scanner-primary", "fingerprint": "97023e2d06f78708", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3294649cb5337f09", "level": "error", "message": {"text": "Dangling fetch: GET /civilization/proposals (app/static/assets/js/civilization.js:180)"}, "properties": {"repobilityId": "e7281b89fe5d1958", "scanner": "scanner-primary", "fingerprint": "3294649cb5337f09", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-42f5bc932ca797db", "level": "error", "message": {"text": "Dangling fetch: PATCH /civilization/proposals/${id} (app/static/assets/js/civilization.js:218)"}, "properties": {"repobilityId": "431546603671fb19", "scanner": "scanner-primary", "fingerprint": "42f5bc932ca797db", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f749ffc824088eee", "level": "error", "message": {"text": "Dangling fetch: GET /council/sessions?limit=10 (app/static/assets/js/civilization.js:238)"}, "properties": {"repobilityId": "2a9dfb7b319b1341", "scanner": "scanner-primary", "fingerprint": "f749ffc824088eee", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fffe2c6452ad78df", "level": "error", "message": {"text": "Dangling fetch: GET /council/sessions/${sessionId}/messages (app/static/assets/js/civilization.js:315)"}, "properties": {"repobilityId": "39991bf9fcb1602f", "scanner": "scanner-primary", "fingerprint": "fffe2c6452ad78df", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f405aeaa087b4602", "level": "error", "message": {"text": "Dangling fetch: DELETE /council/sessions (app/static/assets/js/civilization.js:332)"}, "properties": {"repobilityId": "23c2a78e6fbd76b1", "scanner": "scanner-primary", "fingerprint": "f405aeaa087b4602", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-442c036db5544f46", "level": "error", "message": {"text": "Dangling fetch: POST /council/sessions (app/static/assets/js/civilization.js:343)"}, "properties": {"repobilityId": "1b7b921ff1797ed6", "scanner": "scanner-primary", "fingerprint": "442c036db5544f46", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-704950f341859a26", "level": "error", "message": {"text": "Dangling fetch: GET /council/thoughts?limit=15 (app/static/assets/js/civilization.js:354)"}, "properties": {"repobilityId": "5de359fbb629dc4e", "scanner": "scanner-primary", "fingerprint": "704950f341859a26", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cb2dfa0f4347b58a", "level": "error", "message": {"text": "Dangling fetch: GET /branches (app/static/assets/js/hq.js:161)"}, "properties": {"repobilityId": "c449a9aba17a3676", "scanner": "scanner-primary", "fingerprint": "cb2dfa0f4347b58a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a028b659288066cd", "level": "error", "message": {"text": "Dangling fetch: GET /tech/tasks?limit=10 (app/static/assets/js/hq.js:202)"}, "properties": {"repobilityId": "73a3fcd79c79e010", "scanner": "scanner-primary", "fingerprint": "a028b659288066cd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ba36c76eed72d046", "level": "error", "message": {"text": "Dangling fetch: GET /income/ideas?limit=6 (app/static/assets/js/hq.js:218)"}, "properties": {"repobilityId": "a34e24d683eeabd4", "scanner": "scanner-primary", "fingerprint": "ba36c76eed72d046", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c7b1d6982888c2c8", "level": "error", "message": {"text": "Dangling fetch: GET /library/recent?limit=6 (app/static/assets/js/hq.js:234)"}, "properties": {"repobilityId": "1580debc0e86795a", "scanner": "scanner-primary", "fingerprint": "c7b1d6982888c2c8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-756a9118dc063671", "level": "error", "message": {"text": "Dangling fetch: GET /events?limit=20 (app/static/assets/js/hq.js:250)"}, "properties": {"repobilityId": "240f63928c0853b3", "scanner": "scanner-primary", "fingerprint": "756a9118dc063671", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-66c19a936e7c3211", "level": "error", "message": {"text": "Dangling fetch: GET /notes (app/static/assets/js/hq.js:315)"}, "properties": {"repobilityId": "77c16564174ed9a6", "scanner": "scanner-primary", "fingerprint": "66c19a936e7c3211", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-59be80569b29f6fa", "level": "error", "message": {"text": "Dangling fetch: POST /notes (app/static/assets/js/hq.js:352)"}, "properties": {"repobilityId": "06b0e8ad10f04f55", "scanner": "scanner-primary", "fingerprint": "59be80569b29f6fa", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-555d509e8ad6b319", "level": "error", "message": {"text": "Dangling fetch: DELETE /notes/${id} (app/static/assets/js/hq.js:365)"}, "properties": {"repobilityId": "7eef666d884a5ef9", "scanner": "scanner-primary", "fingerprint": "555d509e8ad6b319", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b12debf833c9e1c1", "level": "error", "message": {"text": "Dangling fetch: GET /civilization/agents (app/static/assets/js/hq.js:500)"}, "properties": {"repobilityId": "4e0207c3340a3947", "scanner": "scanner-primary", "fingerprint": "b12debf833c9e1c1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-700f731ec0e9da5c", "level": "error", "message": {"text": "Dangling fetch: GET /tech/tasks?status=running&limit=50 (app/static/assets/js/hq.js:517)"}, "properties": {"repobilityId": "343fa902a8204059", "scanner": "scanner-primary", "fingerprint": "700f731ec0e9da5c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-48c153cd53b02970", "level": "error", "message": {"text": "Dangling fetch: GET /flags?type=risk&status=active (app/static/assets/js/hq.js:528)"}, "properties": {"repobilityId": "9e9d9805063e74aa", "scanner": "scanner-primary", "fingerprint": "48c153cd53b02970", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-df2441adb7d4d05c", "level": "error", "message": {"text": "Dangling fetch: GET /bs/stats (app/static/assets/js/hq.js:539)"}, "properties": {"repobilityId": "0b3a4e1073057886", "scanner": "scanner-primary", "fingerprint": "df2441adb7d4d05c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6511c935c10683f2", "level": "error", "message": {"text": "Dangling fetch: GET /library/stats (app/static/assets/js/hq.js:548)"}, "properties": {"repobilityId": "c00ef56dce7a2ed7", "scanner": "scanner-primary", "fingerprint": "6511c935c10683f2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ec53bdd516e57939", "level": "error", "message": {"text": "Dangling fetch: GET /tech/tasks?limit=5 (app/static/assets/js/hq.js:714)"}, "properties": {"repobilityId": "b4dd79a8c7702372", "scanner": "scanner-primary", "fingerprint": "ec53bdd516e57939", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9999e810b06342e8", "level": "error", "message": {"text": "Dangling fetch: GET /events?branch=${encodeURIComponent(branch)}&limit=5 (app/static/assets/js/hq.js:742)"}, "properties": {"repobilityId": "86fea19d37c51527", "scanner": "scanner-primary", "fingerprint": "9999e810b06342e8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ba5f73e6c6dc2f7c", "level": "error", "message": {"text": "Dangling fetch: POST /tech/tasks (app/static/assets/js/hq.js:776)"}, "properties": {"repobilityId": "7dd3a745d4d226b9", "scanner": "scanner-primary", "fingerprint": "ba5f73e6c6dc2f7c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b47b8fb229ba2379", "level": "error", "message": {"text": "Dangling fetch: POST /civilization/agents/${agentId}/trigger (app/static/assets/js/hq.js:786)"}, "properties": {"repobilityId": "97f87d36a74fcbc6", "scanner": "scanner-primary", "fingerprint": "b47b8fb229ba2379", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-86d0763f8f6ed39c", "level": "error", "message": {"text": "Dangling fetch: GET /dispatcher-proxy/stats (app/static/assets/js/dispatcher.js:6)"}, "properties": {"repobilityId": "7057d76d77e7baa5", "scanner": "scanner-primary", "fingerprint": "86d0763f8f6ed39c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5be72d91de1f1e92", "level": "error", "message": {"text": "Dangling fetch: GET /dispatcher-proxy/health (app/static/assets/js/dispatcher.js:7)"}, "properties": {"repobilityId": "dda3dc3779e39497", "scanner": "scanner-primary", "fingerprint": "5be72d91de1f1e92", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-439e97b439ab7f45", "level": "error", "message": {"text": "Dangling fetch: GET /thomas/docs (app/static/assets/js/files.js:11)"}, "properties": {"repobilityId": "9f497c488f73f72f", "scanner": "scanner-primary", "fingerprint": "439e97b439ab7f45", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-62bc3fa2b783052a", "level": "error", "message": {"text": "Dangling fetch: GET /thomas/docs/${encodeURIComponent(path)} (app/static/assets/js/files.js:59)"}, "properties": {"repobilityId": "5637304230390e45", "scanner": "scanner-primary", "fingerprint": "62bc3fa2b783052a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b380d0548f057aa9", "level": "error", "message": {"text": "Dangling fetch: GET /babla/reports/latest (app/static/assets/js/babla.js:8)"}, "properties": {"repobilityId": "aeb78391c696ccbd", "scanner": "scanner-primary", "fingerprint": "b380d0548f057aa9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4da299541eb637ae", "level": "error", "message": {"text": "Dangling fetch: GET /income/ideas (app/static/assets/js/babla.js:9)"}, "properties": {"repobilityId": "8b2137571b5f5680", "scanner": "scanner-primary", "fingerprint": "4da299541eb637ae", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1d30eb52425f6a3c", "level": "error", "message": {"text": "Dangling fetch: GET /income/experiments (app/static/assets/js/babla.js:10)"}, "properties": {"repobilityId": "bed1543bdf679237", "scanner": "scanner-primary", "fingerprint": "1d30eb52425f6a3c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-49d1ed1a488e7d30", "level": "error", "message": {"text": "Dangling fetch: POST /babla/run (app/static/assets/js/babla.js:121)"}, "properties": {"repobilityId": "aeb5e9f59c8ddfae", "scanner": "scanner-primary", "fingerprint": "49d1ed1a488e7d30", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0c840a08748b0aa6", "level": "error", "message": {"text": "Dangling fetch: GET /branches (app/static/assets/js/map.js:45)"}, "properties": {"repobilityId": "d1ab433c045d6bb3", "scanner": "scanner-primary", "fingerprint": "0c840a08748b0aa6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-be4d311d800602d6", "level": "error", "message": {"text": "Dangling fetch: GET /flags?limit=200 (app/static/assets/js/map.js:46)"}, "properties": {"repobilityId": "74a3315b8297fc71", "scanner": "scanner-primary", "fingerprint": "be4d311d800602d6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a4a7366031a3653c", "level": "error", "message": {"text": "Dangling fetch: POST /flags (app/static/assets/js/map.js:188)"}, "properties": {"repobilityId": "e8f1cb7552b82a7f", "scanner": "scanner-primary", "fingerprint": "a4a7366031a3653c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c7f5e4fb1ba037ed", "level": "error", "message": {"text": "Dangling fetch: PATCH /flags/${id} (app/static/assets/js/map.js:204)"}, "properties": {"repobilityId": "9b4e063f9d3e780e", "scanner": "scanner-primary", "fingerprint": "c7f5e4fb1ba037ed", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8ee316a25d5608c9", "level": "error", "message": {"text": "Dangling fetch: GET /library/readers (app/static/assets/js/education.js:19)"}, "properties": {"repobilityId": "5de3a2fe2851a5a4", "scanner": "scanner-primary", "fingerprint": "8ee316a25d5608c9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-75e561fe342fcfe9", "level": "error", "message": {"text": "Dangling fetch: GET /education/scores (app/static/assets/js/education.js:33)"}, "properties": {"repobilityId": "d076f83f37fb6e83", "scanner": "scanner-primary", "fingerprint": "75e561fe342fcfe9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-511456f198fa0083", "level": "error", "message": {"text": "Dangling fetch: GET /council/prompts (app/static/assets/js/education.js:110)"}, "properties": {"repobilityId": "40e3ebf31f539024", "scanner": "scanner-primary", "fingerprint": "511456f198fa0083", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-71957c83ce7ac108", "level": "error", "message": {"text": "Dangling fetch: GET /education/scores (app/static/assets/js/education.js:144)"}, "properties": {"repobilityId": "8feac06b101523ed", "scanner": "scanner-primary", "fingerprint": "71957c83ce7ac108", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6bb71cfcfc0765c2", "level": "error", "message": {"text": "Dangling fetch: POST /tech/tasks (app/static/assets/js/education.js:171)"}, "properties": {"repobilityId": "1f54dd23f23a5b55", "scanner": "scanner-primary", "fingerprint": "6bb71cfcfc0765c2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8369fefa1705fe9a", "level": "error", "message": {"text": "Dangling fetch: GET /constitution (app/static/assets/js/constitution.js:11)"}, "properties": {"repobilityId": "9d5f7fcc31e49993", "scanner": "scanner-primary", "fingerprint": "8369fefa1705fe9a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ed3d2985854e18ee", "level": "error", "message": {"text": "Dangling fetch: PUT /constitution (app/static/assets/js/constitution.js:31)"}, "properties": {"repobilityId": "bc42f0a713278294", "scanner": "scanner-primary", "fingerprint": "ed3d2985854e18ee", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-21466bb9a917cbdc", "level": "error", "message": {"text": "Dangling fetch: POST /bs/agent-run/${d.agent}${qs} (app/static/assets/js/butler_router.js:68)"}, "properties": {"repobilityId": "49a6cd543042fc6a", "scanner": "scanner-primary", "fingerprint": "21466bb9a917cbdc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1b3f7654bfbd6716", "level": "error", "message": {"text": "Dangling fetch: GET /agent-log/${run.run_id}/tail?since=${since} (app/static/assets/js/butler_router.js:77)"}, "properties": {"repobilityId": "9ed91c6b55ba6d00", "scanner": "scanner-primary", "fingerprint": "1b3f7654bfbd6716", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-dfa2bd44121a7c9e", "level": "error", "message": {"text": "Dangling fetch: GET /build/queue (app/static/assets/js/build.js:16)"}, "properties": {"repobilityId": "4691b75549afce47", "scanner": "scanner-primary", "fingerprint": "dfa2bd44121a7c9e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-020b9326041bdb2d", "level": "error", "message": {"text": "Dangling fetch: GET /build/foreman (app/static/assets/js/build.js:32)"}, "properties": {"repobilityId": "7acc8c4c2d8a4eee", "scanner": "scanner-primary", "fingerprint": "020b9326041bdb2d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a14f68bc18c4e3a1", "level": "error", "message": {"text": "Dangling fetch: PATCH /build/queue/${id} (app/static/assets/js/build.js:144)"}, "properties": {"repobilityId": "3df88a8b577f41a6", "scanner": "scanner-primary", "fingerprint": "a14f68bc18c4e3a1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-42fd424b120351b0", "level": "error", "message": {"text": "Dangling fetch: GET /audit/status (app/static/assets/js/audit.js:10)"}, "properties": {"repobilityId": "a498e5119730fe02", "scanner": "scanner-primary", "fingerprint": "42fd424b120351b0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-eeb049ba022a1dde", "level": "error", "message": {"text": "Dangling fetch: GET /civilization/agents (app/static/assets/js/audit.js:11)"}, "properties": {"repobilityId": "5ad822273b031a9b", "scanner": "scanner-primary", "fingerprint": "eeb049ba022a1dde", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-97110c37528e0f6f", "level": "error", "message": {"text": "Dangling fetch: GET /council/sessions?limit=100 (app/static/assets/js/audit.js:12)"}, "properties": {"repobilityId": "b55a74d6b2bf0c24", "scanner": "scanner-primary", "fingerprint": "97110c37528e0f6f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1e9a304d188f9dcc", "level": "error", "message": {"text": "Dangling fetch: POST /audit/run (app/static/assets/js/audit.js:212)"}, "properties": {"repobilityId": "0be5b1ad0a3f469a", "scanner": "scanner-primary", "fingerprint": "1e9a304d188f9dcc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d4167f2630bf3aae", "level": "error", "message": {"text": "Dangling fetch: POST /trigger/professor (app/static/assets/js/audit.js:213)"}, "properties": {"repobilityId": "d8363239208da24d", "scanner": "scanner-primary", "fingerprint": "d4167f2630bf3aae", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1c713df23d5fc536", "level": "error", "message": {"text": "Dangling fetch: POST /bs/books/tolstyak/scout/all (app/static/assets/js/command_palette.js:27)"}, "properties": {"repobilityId": "2912809cb58a841b", "scanner": "scanner-primary", "fingerprint": "1c713df23d5fc536", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-60f83b93c010bf23", "level": "error", "message": {"text": "Dangling fetch: POST /bs/scout/all (app/static/assets/js/book_studio.js:150)"}, "properties": {"repobilityId": "d5de0428796f1bee", "scanner": "scanner-primary", "fingerprint": "60f83b93c010bf23", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b9fda8a8f61b137c", "level": "error", "message": {"text": "Dangling fetch: GET /agent-log/recent?limit=5 (app/static/assets/js/agent_office.js:80)"}, "properties": {"repobilityId": "8625299075fe12b4", "scanner": "scanner-primary", "fingerprint": "b9fda8a8f61b137c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b270a26675d28945", "level": "error", "message": {"text": "Dangling fetch: GET /agent-log/${d.run_id}/tail?since=${since} (app/static/assets/js/agent_office.js:106)"}, "properties": {"repobilityId": "cb178f729299d924", "scanner": "scanner-primary", "fingerprint": "b270a26675d28945", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5c713e605c7f8a9a", "level": "error", "message": {"text": "Dangling fetch: GET /civilization/agents (app/static/world/wyrd_hybrid.js:403)"}, "properties": {"repobilityId": "9a59c223f60430ff", "scanner": "scanner-primary", "fingerprint": "5c713e605c7f8a9a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4fd9662fdd79133f", "level": "error", "message": {"text": "Dangling fetch: GET /civilization/agents (app/static/world/wyrd_live.js:91)"}, "properties": {"repobilityId": "59a0e3b18789a7f9", "scanner": "scanner-primary", "fingerprint": "4fd9662fdd79133f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8f8a9cf309a6366b", "level": "error", "message": {"text": "Dangling fetch: GET /council/sessions?limit=1 (app/static/world/wyrd_live.js:92)"}, "properties": {"repobilityId": "0666d4c8e5012c49", "scanner": "scanner-primary", "fingerprint": "8f8a9cf309a6366b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-69a693dfc33637f4", "level": "note", "message": {"text": "Unused endpoint: POST /run"}, "properties": {"repobilityId": "2dceb7e6362fd6ee", "scanner": "scanner-primary", "fingerprint": "69a693dfc33637f4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "d8721f71fae1e2af", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-854974fd7784915d", "level": "note", "message": {"text": "Unused endpoint: GET /hq"}, "properties": {"repobilityId": "5b65cc4d6b89d281", "scanner": "scanner-primary", "fingerprint": "854974fd7784915d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b775129bea2b2b9a", "level": "note", "message": {"text": "Unused endpoint: GET /thomas"}, "properties": {"repobilityId": "36d369ec0f59039e", "scanner": "scanner-primary", "fingerprint": "b775129bea2b2b9a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8031a83ad375986b", "level": "note", "message": {"text": "Unused endpoint: GET /studio"}, "properties": {"repobilityId": "56020b9afa72795e", "scanner": "scanner-primary", "fingerprint": "8031a83ad375986b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2c5793a963202f52", "level": "note", "message": {"text": "Unused endpoint: GET /pulse"}, "properties": {"repobilityId": "6737f8abaa290af4", "scanner": "scanner-primary", "fingerprint": "2c5793a963202f52", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3e3c68b43cbb73af", "level": "note", "message": {"text": "Unused endpoint: GET /agent/{name}"}, "properties": {"repobilityId": "7c56ca9e8fb25641", "scanner": "scanner-primary", "fingerprint": "3e3c68b43cbb73af", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5881fad21d09723d", "level": "note", "message": {"text": "Unused endpoint: GET /manifest.json"}, "properties": {"repobilityId": "bc73336491077502", "scanner": "scanner-primary", "fingerprint": "5881fad21d09723d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8891075661fa1768", "level": "note", "message": {"text": "Unused endpoint: POST /trigger/all"}, "properties": {"repobilityId": "3aaefac9fd306540", "scanner": "scanner-primary", "fingerprint": "8891075661fa1768", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-74f9f23540e1440e", "level": "note", "message": {"text": "Unused endpoint: POST /trigger/{agent}"}, "properties": {"repobilityId": "9232bf6acfa68542", "scanner": "scanner-primary", "fingerprint": "74f9f23540e1440e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-67d28fa8cd6bb12f", "level": "note", "message": {"text": "Unused endpoint: PUT /"}, "properties": {"repobilityId": "2fb46ceb6c9fea95", "scanner": "scanner-primary", "fingerprint": "67d28fa8cd6bb12f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-af53906f953d0c4e", "level": "note", "message": {"text": "Unused endpoint: POST /cycle-result"}, "properties": {"repobilityId": "7318cac33e948c28", "scanner": "scanner-primary", "fingerprint": "af53906f953d0c4e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cbcb9b9a9dbf4265", "level": "note", "message": {"text": "Unused endpoint: GET /scores"}, "properties": {"repobilityId": "e3c0e248c34d5ade", "scanner": "scanner-primary", "fingerprint": "cbcb9b9a9dbf4265", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-304b6f2b403d93f7", "level": "note", "message": {"text": "Unused endpoint: POST /register"}, "properties": {"repobilityId": "0355a0d47ca4ba21", "scanner": "scanner-primary", "fingerprint": "304b6f2b403d93f7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c124716a4436518b", "level": "note", "message": {"text": "Unused endpoint: GET /reports"}, "properties": {"repobilityId": "449c9cf085d03f20", "scanner": "scanner-primary", "fingerprint": "c124716a4436518b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-004ed1ef171c54a7", "level": "note", "message": {"text": "Unused endpoint: GET /reports/latest"}, "properties": {"repobilityId": "6d109e0567b300c5", "scanner": "scanner-primary", "fingerprint": "004ed1ef171c54a7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3140e61d7cac5091", "level": "note", "message": {"text": "Unused endpoint: GET /agents"}, "properties": {"repobilityId": "6a1285621b019983", "scanner": "scanner-primary", "fingerprint": "3140e61d7cac5091", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2f3fa31f1e9b1b90", "level": "note", "message": {"text": "Unused endpoint: POST /agents"}, "properties": {"repobilityId": "cd38a66aa69ea060", "scanner": "scanner-primary", "fingerprint": "2f3fa31f1e9b1b90", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b30cbdd177c13681", "level": "note", "message": {"text": "Unused endpoint: GET /agents/{agent_id}"}, "properties": {"repobilityId": "28aa571cd51c351b", "scanner": "scanner-primary", "fingerprint": "b30cbdd177c13681", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-43335e6c9e96b89f", "level": "note", "message": {"text": "Unused endpoint: POST /agents/{agent_id}/trigger"}, "properties": {"repobilityId": "1b5a0d6df60be2ec", "scanner": "scanner-primary", "fingerprint": "43335e6c9e96b89f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-edd9ca52371b491b", "level": "note", "message": {"text": "Unused endpoint: POST /agents/{agent_id}/pulse"}, "properties": {"repobilityId": "4e8f40b7b910d152", "scanner": "scanner-primary", "fingerprint": "edd9ca52371b491b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-615600bf017add87", "level": "note", "message": {"text": "Unused endpoint: GET /agents/{agent_id}/prompt"}, "properties": {"repobilityId": "ceb5851d4e922ef7", "scanner": "scanner-primary", "fingerprint": "615600bf017add87", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-68f846ee827b1fba", "level": "note", "message": {"text": "Unused endpoint: PUT /agents/{agent_id}/prompt"}, "properties": {"repobilityId": "3d845ef85aa12001", "scanner": "scanner-primary", "fingerprint": "68f846ee827b1fba", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-481261cdd4cda8b6", "level": "note", "message": {"text": "Unused endpoint: GET /agents/{agent_id}/journal"}, "properties": {"repobilityId": "05be733abe158465", "scanner": "scanner-primary", "fingerprint": "481261cdd4cda8b6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6870010d866a1d4a", "level": "note", "message": {"text": "Unused endpoint: POST /agents/{agent_id}/journal"}, "properties": {"repobilityId": "6148b8d4ffae197b", "scanner": "scanner-primary", "fingerprint": "6870010d866a1d4a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4d0b75c541565cd9", "level": "note", "message": {"text": "Unused endpoint: GET /journal"}, "properties": {"repobilityId": "62989d12292c5261", "scanner": "scanner-primary", "fingerprint": "4d0b75c541565cd9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f37b4c55488c6145", "level": "note", "message": {"text": "Unused endpoint: POST /agents/{agent_id}/train"}, "properties": {"repobilityId": "c23a3ea76e3a8f89", "scanner": "scanner-primary", "fingerprint": "f37b4c55488c6145", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0661a017d8970e67", "level": "note", "message": {"text": "Unused endpoint: GET /proposals"}, "properties": {"repobilityId": "e37552107a1cfd87", "scanner": "scanner-primary", "fingerprint": "0661a017d8970e67", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bc031ab87451a9fa", "level": "note", "message": {"text": "Unused endpoint: POST /proposals"}, "properties": {"repobilityId": "9d88bc4d013b37ef", "scanner": "scanner-primary", "fingerprint": "bc031ab87451a9fa", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2d928cfddca27425", "level": "note", "message": {"text": "Unused endpoint: PATCH /proposals/{prop_id}"}, "properties": {"repobilityId": "f7faaf5d1d4ac367", "scanner": "scanner-primary", "fingerprint": "2d928cfddca27425", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cb7be80d77423fe1", "level": "note", "message": {"text": "Unused endpoint: GET /agent-reports"}, "properties": {"repobilityId": "e29f17d7fce5256e", "scanner": "scanner-primary", "fingerprint": "cb7be80d77423fe1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-55bedc79e2f4268e", "level": "note", "message": {"text": "Unused endpoint: GET /passports"}, "properties": {"repobilityId": "f528ef015def74fc", "scanner": "scanner-primary", "fingerprint": "55bedc79e2f4268e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e3ba0de7cd6007c5", "level": "note", "message": {"text": "Unused endpoint: PATCH /passports/{agent_name}/activate"}, "properties": {"repobilityId": "6589af30064d383e", "scanner": "scanner-primary", "fingerprint": "e3ba0de7cd6007c5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-362b9f4f3e4e4222", "level": "note", "message": {"text": "Unused endpoint: POST /scribe-webhook"}, "properties": {"repobilityId": "27203609f99f9daf", "scanner": "scanner-primary", "fingerprint": "362b9f4f3e4e4222", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ca4c3a6fd7d717d0", "level": "note", "message": {"text": "Unused endpoint: GET /brief"}, "properties": {"repobilityId": "1f74cdbc0511c3bc", "scanner": "scanner-primary", "fingerprint": "ca4c3a6fd7d717d0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a009b1a56794f45", "level": "note", "message": {"text": "Unused endpoint: POST /"}, "properties": {"repobilityId": "0f92424c05f71c7f", "scanner": "scanner-primary", "fingerprint": "7a009b1a56794f45", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d16e4fa529c520e9", "level": "note", "message": {"text": "Unused endpoint: GET /search"}, "properties": {"repobilityId": "9da0cd53fa95f363", "scanner": "scanner-primary", "fingerprint": "d16e4fa529c520e9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cd8dc4599ec52a08", "level": "note", "message": {"text": "Unused endpoint: GET /stats"}, "properties": {"repobilityId": "e19785063964d038", "scanner": "scanner-primary", "fingerprint": "cd8dc4599ec52a08", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-01a333a34760fca3", "level": "note", "message": {"text": "Unused endpoint: GET /prompts"}, "properties": {"repobilityId": "d17871ac8dd2513d", "scanner": "scanner-primary", "fingerprint": "01a333a34760fca3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b15d518d538de57d", "level": "note", "message": {"text": "Unused endpoint: GET /sessions"}, "properties": {"repobilityId": "6895d83fab7faf4b", "scanner": "scanner-primary", "fingerprint": "b15d518d538de57d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-92efb2dc9205e7a4", "level": "note", "message": {"text": "Unused endpoint: POST /sessions"}, "properties": {"repobilityId": "db9944402b00d8d3", "scanner": "scanner-primary", "fingerprint": "92efb2dc9205e7a4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-41c23ec3b2c0e166", "level": "note", "message": {"text": "Unused endpoint: GET /sessions/{session_id}"}, "properties": {"repobilityId": "680b33fb89a3a1eb", "scanner": "scanner-primary", "fingerprint": "41c23ec3b2c0e166", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cf67944bdc3564bd", "level": "note", "message": {"text": "Unused endpoint: GET /sessions/{session_id}/messages"}, "properties": {"repobilityId": "31999ba1c17c6ac3", "scanner": "scanner-primary", "fingerprint": "cf67944bdc3564bd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fe072aed3c22cbb1", "level": "note", "message": {"text": "Unused endpoint: GET /thoughts"}, "properties": {"repobilityId": "1cdc7a5227dca8c4", "scanner": "scanner-primary", "fingerprint": "fe072aed3c22cbb1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3949483d29cd466f", "level": "note", "message": {"text": "Unused endpoint: POST /thoughts"}, "properties": {"repobilityId": "10ab5f2462e384f6", "scanner": "scanner-primary", "fingerprint": "3949483d29cd466f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e209d54c92e512ab", "level": "note", "message": {"text": "Unused endpoint: DELETE /thoughts"}, "properties": {"repobilityId": "12484c6d44484f07", "scanner": "scanner-primary", "fingerprint": "e209d54c92e512ab", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7b52fcc22ba5e3d2", "level": "note", "message": {"text": "Unused endpoint: DELETE /sessions"}, "properties": {"repobilityId": "74ee640600ab414e", "scanner": "scanner-primary", "fingerprint": "7b52fcc22ba5e3d2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cafc7483ac57e06a", "level": "note", "message": {"text": "Unused endpoint: GET /ui"}, "properties": {"repobilityId": "f865deb6caac45f3", "scanner": "scanner-primary", "fingerprint": "cafc7483ac57e06a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-384fad3ae5a4606f", "level": "note", "message": {"text": "Unused endpoint: GET /ui/{path:path}"}, "properties": {"repobilityId": "bdc0f32d42dc7392", "scanner": "scanner-primary", "fingerprint": "384fad3ae5a4606f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-eb0428442a390121", "level": "note", "message": {"text": "Unused endpoint: GET /docs"}, "properties": {"repobilityId": "17db8022571572d7", "scanner": "scanner-primary", "fingerprint": "eb0428442a390121", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}