{"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-211801dd52cb4db1", "name": "Possibly dead Python function: list_history", "shortDescription": {"text": "Possibly dead Python function: list_history"}, "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-a75b80b9f71a0604", "name": "Possibly dead Python function: repl", "shortDescription": {"text": "Possibly dead Python function: repl"}, "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-95fb54acec39693f", "name": "Possibly dead Python function: emit_hidden_marker_text", "shortDescription": {"text": "Possibly dead Python function: emit_hidden_marker_text"}, "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-9be76f597e6fb07d", "name": "Possibly dead Python function: roundtrip_docx", "shortDescription": {"text": "Possibly dead Python function: roundtrip_docx"}, "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-241e0b732d41b172", "name": "Possibly dead Python function: build_discovery_link", "shortDescription": {"text": "Possibly dead Python function: build_discovery_link"}, "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-dbff07fe51992d6e", "name": "Possibly dead Python function: do_run_migrations", "shortDescription": {"text": "Possibly dead Python function: do_run_migrations"}, "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-a87e1004bd48ca14", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "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-a4a121ef390c3bde", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-15f2a3f538ff6709", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "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-c87c8a4420bc1ff6", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c57421adb52b7e34", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "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-d22b7110c3f41024", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9132af1a9f418247", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "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-50c867798bf11ef1", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c929891f13c19eb4", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "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-92a3a6084ab0ca0e", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4049e2751133ccef", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "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-df7a3fe8363b2c77", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6485aa6ae19aab4f", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "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-a6aac4e727af8eef", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c973a31368e4fce9", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "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-a52ffa376107d5de", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-67c90775240f7766", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "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-cc4b0659157e4594", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1fcd9d37123289c7", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "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-569055aa21a0ff63", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7ce1117f9b661946", "name": "Stray `console.log` in TS/JS \u2014 apps/web/tests/e2e/_debug-search.spec.ts:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/tests/e2e/_debug-search.spec.ts:10"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-26ad86b8f24db845", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/src/components/Highlight.tsx:8", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/src/components/Highlight.tsx:8"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8ce85156a4dda884", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/Lightbox.tsx:239", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/Lightbox.tsx:239"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-930c7ea681ce7a44", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/layout/Breadcrumb.tsx:95", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/layout/Breadcrumb.tsx:95"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ef637610f32ad4c0", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/layout/MobileNavDrawer.tsx:131", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/layout/MobileNavDrawer.tsx:131"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b71206621856eafa", "name": "\"active\" state uses light bg in a dark theme \u2014 apps/web/src/components/layout/TopBar.tsx:395", "shortDescription": {"text": "\"active\" state uses light bg in a dark theme \u2014 apps/web/src/components/layout/TopBar.tsx:395"}, "fullDescription": {"text": "A ternary like `active ? 'bg-white' : '...'` (or bg-gray-100/200) on a dark theme produces jarring white pills. Use a dark-emphasized active state instead \u2014 border + ring or slightly brighter dark bg. Example: `active ? 'bg-gray-800 border-gray-500 ring-1 ring-blue-500/30' : '\u2026'`.\n\nWhy: P-E in CHECKLIST.md \u2014 light bg in a dark theme is a class of regression.\nRule id: fq.active-light-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d747d3099f874105", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/layout/AppShell.tsx:368", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/layout/AppShell.tsx:368"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1e35b653f2e182e6", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/wiki/LinkPreview.tsx:216", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/wiki/LinkPreview.tsx:216"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-12ba8ffb019d1836", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/src/components/blocks/FlowBlock.tsx:141", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/src/components/blocks/FlowBlock.tsx:141"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-efedfc811bd8dbc0", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/blocks/CodeBlock.tsx:38", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/blocks/CodeBlock.tsx:38"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-297ee528af7d6997", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/src/lib/qr.ts:36", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/src/lib/qr.ts:36"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ede31b487e874e9d", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/Recent.tsx:76", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/Recent.tsx:76"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-38b6141cc4d3274a", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/VersionDiff.tsx:225", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/VersionDiff.tsx:225"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-988d45302951efcf", "name": "\"active\" state uses light bg in a dark theme \u2014 apps/web/src/pages/VersionDiff.tsx:252", "shortDescription": {"text": "\"active\" state uses light bg in a dark theme \u2014 apps/web/src/pages/VersionDiff.tsx:252"}, "fullDescription": {"text": "A ternary like `active ? 'bg-white' : '...'` (or bg-gray-100/200) on a dark theme produces jarring white pills. Use a dark-emphasized active state instead \u2014 border + ring or slightly brighter dark bg. Example: `active ? 'bg-gray-800 border-gray-500 ring-1 ring-blue-500/30' : '\u2026'`.\n\nWhy: P-E in CHECKLIST.md \u2014 light bg in a dark theme is a class of regression.\nRule id: fq.active-light-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-61ce6f44b4c2c476", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/WebhooksSettings.tsx:209", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/WebhooksSettings.tsx:209"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-84662778d98e33c2", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/Glossary.tsx:310", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/Glossary.tsx:310"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-23e5c2fa4778c9f6", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/TemplateManager.tsx:220", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/TemplateManager.tsx:220"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2fb675e52eff56b4", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/SeriesManager.tsx:165", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/SeriesManager.tsx:165"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f1d6a7704b5381db", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/TagPage.tsx:106", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/TagPage.tsx:106"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c8f59e4c66432e9b", "name": "TODO/FIXME marker in shipping code \u2014 apps/web/src/pages/Login.tsx:216", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 apps/web/src/pages/Login.tsx:216"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-411aa16aa873b6e9", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/SavedView.tsx:134", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/SavedView.tsx:134"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bd9171f2432b5002", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/ReadList.tsx:128", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/ReadList.tsx:128"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4290bb7c37d2dcdf", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/src/pages/TwoFactorSetup.tsx:146", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/src/pages/TwoFactorSetup.tsx:146"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9d67c7c50b95ccc5", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/Home.tsx:239", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/Home.tsx:239"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ee72446edd8b851a", "name": "\"active\" state uses light bg in a dark theme \u2014 apps/web/src/pages/CrossDocCompare.tsx:168", "shortDescription": {"text": "\"active\" state uses light bg in a dark theme \u2014 apps/web/src/pages/CrossDocCompare.tsx:168"}, "fullDescription": {"text": "A ternary like `active ? 'bg-white' : '...'` (or bg-gray-100/200) on a dark theme produces jarring white pills. Use a dark-emphasized active state instead \u2014 border + ring or slightly brighter dark bg. Example: `active ? 'bg-gray-800 border-gray-500 ring-1 ring-blue-500/30' : '\u2026'`.\n\nWhy: P-E in CHECKLIST.md \u2014 light bg in a dark theme is a class of regression.\nRule id: fq.active-light-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ded2a569777608ba", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/SnippetManager.tsx:247", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/SnippetManager.tsx:247"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b96a277614fd93d6", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/Analytics.tsx:198", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/Analytics.tsx:198"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ff58f6a6b310f28d", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/SeriesDetail.tsx:314", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/SeriesDetail.tsx:314"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0cde5508e554761c", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/upload/SmartFileDropZone.tsx:155", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/upload/SmartFileDropZone.tsx:155"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-be843d0153709109", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/upload/components/ImageDropzone.tsx:247", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/upload/components/ImageDropzone.tsx:247"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d83fae82eac75f19", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/notifications/components/NotificationDrawer.t", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/notifications/components/NotificationDrawer.tsx:211"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fd3e8405e1f71990", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/series/SeriesNav.tsx:82", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/series/SeriesNav.tsx:82"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2774a36b19e65649", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/series/AddToSeriesButton.tsx:145", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/series/AddToSeriesButton.tsx:145"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c7a8ee9a9cbc208e", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/read-receipts/ReadReceiptPanel.tsx:177", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/read-receipts/ReadReceiptPanel.tsx:177"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f2ec71f844a03571", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/templates/TemplateGallery.tsx:202", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/templates/TemplateGallery.tsx:202"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4b56b46c4e11ba5c", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/search/components/CommandPalette.tsx:807", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/search/components/CommandPalette.tsx:807"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c8147bcbad2aa673", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/src/features/search/components/CommandPalette.tsx:872", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/src/features/search/components/CommandPalette.tsx:872"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-76ad3d7dad62ce36", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/search/components/KnowledgeResults.tsx:74", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/search/components/KnowledgeResults.tsx:74"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8bade5f641ae7652", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/block-library/SnippetPicker.tsx:187", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/block-library/SnippetPicker.tsx:187"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f9c3bdbe03654aaf", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/quick-switcher/QuickSwitcher.tsx:282", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/quick-switcher/QuickSwitcher.tsx:282"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1d7676a612a195aa", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/home/components/TodayHero.tsx:96", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/home/components/TodayHero.tsx:96"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-61f73c63e0943f49", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/home/components/DomainTiles.tsx:120", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/home/components/DomainTiles.tsx:120"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ac6fcefe1650d325", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/org/components/OrgTree.tsx:336", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/org/components/OrgTree.tsx:336"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f75cd03c5df20f24", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/editor/components/BulkActionsBar.tsx:752", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/editor/components/BulkActionsBar.tsx:752"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9c3597461d0d34d8", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/editor/components/SectionLinkPicker.tsx:187", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/editor/components/SectionLinkPicker.tsx:187"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5e2fd7ee6a2a5562", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/editor/components/VersionHistoryPanel.tsx:127", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/editor/components/VersionHistoryPanel.tsx:127"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-68346e0854272e0e", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/editor/components/OnboardingTour.tsx:146", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/editor/components/OnboardingTour.tsx:146"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3d49633ff067c1f5", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/editor/components/EditorToolbar.tsx:355", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/editor/components/EditorToolbar.tsx:355"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e29ff040e5085c72", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/editor/components/WikiLinkAutocomplete.tsx:19", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/editor/components/WikiLinkAutocomplete.tsx:195"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8a73cd57fedbba7f", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/editor/components/BlockCollapseWrapper.tsx:13", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/editor/components/BlockCollapseWrapper.tsx:138"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7cc50564f836be0e", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/editor/components/ConflictMergeModal.tsx:425", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/editor/components/ConflictMergeModal.tsx:425"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-64e0147014a27c8e", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/editor/components/FindReplaceModal.tsx:229", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/editor/components/FindReplaceModal.tsx:229"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0f4117d3ce0c4595", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/editor/extensions/WikiLinkSuggestion.tsx:301", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/editor/extensions/WikiLinkSuggestion.tsx:301"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b9676bace154c2a0", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/editor/blocks/ConditionalFormattingPresetsPan", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/editor/blocks/ConditionalFormattingPresetsPanel.tsx:215"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dc90c20117b085be", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/editor/blocks/SpreadsheetBlockEditor.tsx:429", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/editor/blocks/SpreadsheetBlockEditor.tsx:429"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d4f5cc92b0f7be74", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/editor/blocks/DocLinkCardBlockEditor.tsx:140", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/editor/blocks/DocLinkCardBlockEditor.tsx:140"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ea7c5636e130b040", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/editor/blocks/ChartBlockEditor.tsx:985", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/editor/blocks/ChartBlockEditor.tsx:985"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f346ba0ba8c19886", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/saved-views/SavedViewsList.tsx:122", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/saved-views/SavedViewsList.tsx:122"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2dc5d1d042f1bb27", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/subscriptions/DigestNotification.tsx:86", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/subscriptions/DigestNotification.tsx:86"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1ea091d80df67084", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/cross-doc-diff/DiffSummary.tsx:109", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/cross-doc-diff/DiffSummary.tsx:109"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-24192e04125bfc4d", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/comments/components/MentionInput.tsx:193", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/comments/components/MentionInput.tsx:193"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-58638bcd5212e02f", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/src/features/sharing/QrShare.tsx:67", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/src/features/sharing/QrShare.tsx:67"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-41cee8a9130d46ed", "name": "Privileged port 252 in use", "shortDescription": {"text": "Privileged port 252 in use"}, "fullDescription": {"text": "Port 252 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e2b6f2dad2e5985a", "name": "Privileged port 6 in use", "shortDescription": {"text": "Privileged port 6 in use"}, "fullDescription": {"text": "Port 6 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7f26953381bfd135", "name": "Insecure pattern 'weak_hash' in apps/api/app/services/totp.py:142", "shortDescription": {"text": "Insecure pattern 'weak_hash' in apps/api/app/services/totp.py:142"}, "fullDescription": {"text": "Found a known-risky pattern (weak_hash). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8c5e038ec5d53e13", "name": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/src/main.tsx:298", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/src/main.tsx:298"}, "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-cbcf034ae95ef241", "name": "Insecure pattern 'dangerous_innerhtml' in apps/web/src/components/blocks/FlowBlock.tsx:141", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/web/src/components/blocks/FlowBlock.tsx:141"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-72714cf47ff036e3", "name": "Possible secret in apps/web/src/pages/Diag.tsx", "shortDescription": {"text": "Possible secret in apps/web/src/pages/Diag.tsx"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-98ff5da31ff30420", "name": "Possible secret in apps/web/src/pages/Login.tsx", "shortDescription": {"text": "Possible secret in apps/web/src/pages/Login.tsx"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-b319798999ef12c5", "name": "Insecure pattern 'dangerous_innerhtml' in apps/web/src/pages/TwoFactorSetup.tsx:146", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/web/src/pages/TwoFactorSetup.tsx:146"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-287fe12b84d3c012", "name": "Insecure pattern 'dangerous_innerhtml' in apps/web/src/features/search/components/CommandPalette.tsx:872", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/web/src/features/search/components/CommandPalette.tsx:872"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f520fa221cc627aa", "name": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/src/features/editor/components/InlineTextBlockEditor.tsx:103", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/src/features/editor/components/InlineTextBlockEditor.tsx:103"}, "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-bb0c4eecef8d171b", "name": "Insecure pattern 'dangerous_innerhtml' in apps/web/src/features/sharing/QrShare.tsx:67", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/web/src/features/sharing/QrShare.tsx:67"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-43f066ea7e36fd83", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/05-ideal-graph/dynamicgraph.html:519", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/05-ideal-graph/dynamicgraph.html:519"}, "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-f46e319139f0ade5", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/setup-python@v5 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4a4f7686fbf3047c", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ba1a714830c07247", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/upload-artifact@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1188e10af72c94d7", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "zaproxy/action-baseline@v0.12.0 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4d88a59e11a4a9d7", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/upload-artifact@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-65c9bd56493a81d3", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/upload-artifact@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cb639d9a10a47b23", "name": "package.json defines install-time lifecycle scripts", "shortDescription": {"text": "package.json defines install-time lifecycle scripts"}, "fullDescription": {"text": "preinstall/install/postinstall/prepare scripts execute during dependency installation. Review them carefully for network calls, obfuscation, shell execution, or credential access."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b0a50056beae21bd", "name": "Very large file: apps/api/app/services/document_service.py (2034 lines)", "shortDescription": {"text": "Very large file: apps/api/app/services/document_service.py (2034 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-10580330e73932fe", "name": "Very large file: apps/api/app/services/pptx_export.py (1635 lines)", "shortDescription": {"text": "Very large file: apps/api/app/services/pptx_export.py (1635 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-32c40a6638f2bc72", "name": "Very large file: apps/api/app/services/docx_import.py (2303 lines)", "shortDescription": {"text": "Very large file: apps/api/app/services/docx_import.py (2303 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-48701adfa9f4b90b", "name": "Very large file: apps/api/app/services/widget_markers.py (1991 lines)", "shortDescription": {"text": "Very large file: apps/api/app/services/widget_markers.py (1991 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-273c27d3c9ad78d1", "name": "Very large file: apps/api/app/services/docx_export.py (1795 lines)", "shortDescription": {"text": "Very large file: apps/api/app/services/docx_export.py (1795 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8397fd90ac73da8f", "name": "Very large file: apps/api/app/services/html_renderer.py (1402 lines)", "shortDescription": {"text": "Very large file: apps/api/app/services/html_renderer.py (1402 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bd696ca8c2f6ce9d", "name": "Very large file: apps/api/app/schemas/document.py (2738 lines)", "shortDescription": {"text": "Very large file: apps/api/app/schemas/document.py (2738 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0827a301ebe50b6c", "name": "Very large file: apps/web/src/lib/i18n/ko.ts (1084 lines)", "shortDescription": {"text": "Very large file: apps/web/src/lib/i18n/ko.ts (1084 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8e255830711d1346", "name": "Very large file: apps/web/src/features/editor/blocks/ChartBlockEditor.tsx (2065 lines)", "shortDescription": {"text": "Very large file: apps/web/src/features/editor/blocks/ChartBlockEditor.tsx (2065 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5d0f655c7d0a4372", "name": "Very large file: apps/web/src/features/graph/components/KnowledgeGraph.tsx (1344 lines)", "shortDescription": {"text": "Very large file: apps/web/src/features/graph/components/KnowledgeGraph.tsx (1344 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-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-4a9eb7dc7c6e3880", "name": "Node manifest has dependencies but no lockfile: apps/web/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: apps/web/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2699d5f16ae11282", "name": "Node manifest has dependencies but no lockfile: packages/shared/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: packages/shared/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 169 console/debugger/print-style debug statements in non-test source. This is a common fast-generation residue before production cleanup."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 405 placeholder/mock markers across 151 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, lockfile. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "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, lockfile. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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-921eb829a3f639c6", "name": "Legacy-named symbol `skipped_old` in integrations/aidatahub/aidatahub_sync.py:329", "shortDescription": {"text": "Legacy-named symbol `skipped_old` in integrations/aidatahub/aidatahub_sync.py:329"}, "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-110dfd4c05b1150c", "name": "Legacy-named symbol `run_backup` in apps/api/tests/test_backups.py:1", "shortDescription": {"text": "Legacy-named symbol `run_backup` in apps/api/tests/test_backups.py:1"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-47850eccfad7215f", "name": "Legacy-named symbol `allow_backup` in apps/api/tests/test_totp.py:394", "shortDescription": {"text": "Legacy-named symbol `allow_backup` in apps/api/tests/test_totp.py:394"}, "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-3d8790551248a973", "name": "Legacy-named symbol `list_objects_v2` in apps/api/tests/test_uploads.py:63", "shortDescription": {"text": "Legacy-named symbol `list_objects_v2` in apps/api/tests/test_uploads.py:63"}, "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-ebdf5c45b9542b1f", "name": "Commented-code block (6 lines) in apps/api/tests/test_h8_h9_perf.py:176", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/tests/test_h8_h9_perf.py:176"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fd0678671f0c9184", "name": "Legacy-named symbol `test_select_versions_keeps_head_and_v1` in apps/api/tests/test_maintenance.py:60", "shortDescription": {"text": "Legacy-named symbol `test_select_versions_keeps_head_and_v1` in apps/api/tests/test_maintenance.py:60"}, "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-aad7547986465a11", "name": "Legacy-named symbol `token_old` in apps/api/tests/test_api_tokens.py:182", "shortDescription": {"text": "Legacy-named symbol `token_old` in apps/api/tests/test_api_tokens.py:182"}, "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-337bb4639e0b8897", "name": "Legacy-named symbol `r_login_old` in apps/api/tests/test_auth_flows.py:327", "shortDescription": {"text": "Legacy-named symbol `r_login_old` in apps/api/tests/test_auth_flows.py:327"}, "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-0d0907e99acad319", "name": "Commented-code block (8 lines) in apps/api/app/middleware/security.py:165", "shortDescription": {"text": "Commented-code block (8 lines) in apps/api/app/middleware/security.py:165"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1acecb622591cff9", "name": "Commented-code block (9 lines) in apps/api/app/search/meili_indexer.py:30", "shortDescription": {"text": "Commented-code block (9 lines) in apps/api/app/search/meili_indexer.py:30"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6ca61ea735615883", "name": "Legacy-named symbol `run_backup` in apps/api/app/services/backup_runner.py:148", "shortDescription": {"text": "Legacy-named symbol `run_backup` in apps/api/app/services/backup_runner.py:148"}, "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-12526db7cc4a34ed", "name": "Commented-code block (5 lines) in apps/api/app/services/css_sanitizer.py:43", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/app/services/css_sanitizer.py:43"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-10783c05a05c77a4", "name": "Commented-code block (5 lines) in apps/api/app/services/docx_import.py:124", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/app/services/docx_import.py:124"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6b35583ec05dbc66", "name": "Legacy-named symbol `list_objects_v2` in apps/api/app/services/upload_service.py:369", "shortDescription": {"text": "Legacy-named symbol `list_objects_v2` in apps/api/app/services/upload_service.py:369"}, "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-98804c85bdc8d483", "name": "Stub function `_noop` (body is just `pass`/`return`) \u2014 apps/api/app/services/pptx_import.py:362", "shortDescription": {"text": "Stub function `_noop` (body is just `pass`/`return`) \u2014 apps/api/app/services/pptx_import.py:362"}, "fullDescription": {"text": "Likely an AI scaffold that was never filled in. Remove or implement."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a6573894c8b0fb9a", "name": "Commented-code block (5 lines) in apps/api/app/services/signup_service.py:136", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/app/services/signup_service.py:136"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-78b1abaad17cd18e", "name": "Commented-code block (5 lines) in apps/api/app/services/widget_markers.py:650", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/app/services/widget_markers.py:650"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-470e697059fd9d12", "name": "Commented-code block (5 lines) in apps/api/app/services/docx_export.py:335", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/app/services/docx_export.py:335"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-21141644bf0bd7cc", "name": "Commented-code block (5 lines) in apps/api/app/services/html_renderer.py:129", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/app/services/html_renderer.py:129"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-384c28d0b52a7a6e", "name": "Commented-code block (7 lines) in apps/api/app/services/automation_cron.py:188", "shortDescription": {"text": "Commented-code block (7 lines) in apps/api/app/services/automation_cron.py:188"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fd543ff5ecd22a80", "name": "Commented-code block (5 lines) in apps/api/app/core/config.py:46", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/app/core/config.py:46"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9de8c47863bb802d", "name": "Commented-code block (5 lines) in apps/api/app/routers/widgets.py:169", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/app/routers/widgets.py:169"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d08cd96de1475150", "name": "Legacy-named symbol `list_objects_v2` in apps/api/app/routers/health_dashboard.py:120", "shortDescription": {"text": "Legacy-named symbol `list_objects_v2` in apps/api/app/routers/health_dashboard.py:120"}, "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-2dda80bc544cca22", "name": "Commented-code block (5 lines) in apps/api/app/routers/auth.py:41", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/app/routers/auth.py:41"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5c4e41fafb6ff8f0", "name": "Legacy-named symbol `run_backup` in apps/api/app/routers/backups.py:35", "shortDescription": {"text": "Legacy-named symbol `run_backup` in apps/api/app/routers/backups.py:35"}, "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-4f0e624b3a5c0ea1", "name": "Commented-code block (5 lines) in apps/api/app/routers/documents.py:460", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/app/routers/documents.py:460"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-99e538cc99540acc", "name": "Commented-code block (6 lines) in apps/api/app/routers/imports.py:816", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/app/routers/imports.py:816"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3033c6fc54ed79ec", "name": "Commented-code block (6 lines) in apps/api/app/routers/doc_templates.py:489", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/app/routers/doc_templates.py:489"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-26ec43c02c4408a3", "name": "Commented-code block (6 lines) in apps/api/app/routers/approvals.py:473", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/app/routers/approvals.py:473"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bb05038944e6a2c5", "name": "Legacy-named symbol `code_or_backup` in apps/api/app/routers/two_factor.py:17", "shortDescription": {"text": "Legacy-named symbol `code_or_backup` in apps/api/app/routers/two_factor.py:17"}, "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-a11a98acdbccac84", "name": "Commented-code block (5 lines) in apps/web/vite.config.ts:57", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/vite.config.ts:57"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e1a0c9a18b189160", "name": "Commented-code block (7 lines) in apps/web/tailwind.config.js:26", "shortDescription": {"text": "Commented-code block (7 lines) in apps/web/tailwind.config.js:26"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2fb9c77c48092274", "name": "Commented-code block (11 lines) in apps/web/eslint.config.js:4", "shortDescription": {"text": "Commented-code block (11 lines) in apps/web/eslint.config.js:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9ed2632222489c3f", "name": "Commented-code block (5 lines) in apps/web/tests/e2e/navigate-and-read.spec.ts:10", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/tests/e2e/navigate-and-read.spec.ts:10"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-54c96ff7e409d744", "name": "Commented-code block (6 lines) in apps/web/tests/e2e/create-and-edit.spec.ts:16", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/tests/e2e/create-and-edit.spec.ts:16"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-524c0e189455279b", "name": "Commented-code block (5 lines) in apps/web/src/components/WikiArticle.tsx:101", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/components/WikiArticle.tsx:101"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3a3d7cbbc6e243bd", "name": "Commented-code block (5 lines) in apps/web/src/components/SectionRenderer.tsx:82", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/components/SectionRenderer.tsx:82"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3e83616c4acc7c6d", "name": "Commented-code block (6 lines) in apps/web/src/components/layout/TopBar.tsx:80", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/src/components/layout/TopBar.tsx:80"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0acc15ba982e843f", "name": "Commented-code block (5 lines) in apps/web/src/components/wiki/WikiLink.tsx:111", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/components/wiki/WikiLink.tsx:111"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4e454eb3bee18034", "name": "Commented-code block (5 lines) in apps/web/src/components/wiki/Inline.tsx:227", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/components/wiki/Inline.tsx:227"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ab98a0d2c533ca2a", "name": "Commented-code block (6 lines) in apps/web/src/components/wiki/__tests__/LinkPreview.test.tsx:109", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/src/components/wiki/__tests__/LinkPreview.test.tsx:109"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2d52dd621880bc20", "name": "Commented-code block (9 lines) in apps/web/src/components/blocks/BlockRenderer.tsx:193", "shortDescription": {"text": "Commented-code block (9 lines) in apps/web/src/components/blocks/BlockRenderer.tsx:193"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ce17e27d69745c68", "name": "Commented-code block (6 lines) in apps/web/src/components/blocks/PivotTableBlock.tsx:37", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/src/components/blocks/PivotTableBlock.tsx:37"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ee34f0fcfe9df3de", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/components/blocks/WidgetExportMenu.tsx:85", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/components/blocks/WidgetExportMenu.tsx:85"}, "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-ae19cdbdbf36b9bd", "name": "Commented-code block (5 lines) in apps/web/src/components/blocks/pivotEngine.ts:349", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/components/blocks/pivotEngine.ts:349"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-87f11fc4faaf215c", "name": "Commented-code block (5 lines) in apps/web/src/components/blocks/ChartBlock.tsx:213", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/components/blocks/ChartBlock.tsx:213"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d9fb2b98b9fb64d5", "name": "Commented-code block (7 lines) in apps/web/src/components/blocks/__tests__/AllBlocksDarkmode.test.ts:42", "shortDescription": {"text": "Commented-code block (7 lines) in apps/web/src/components/blocks/__tests__/AllBlocksDarkmode.test.ts:42"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0f62c86f5eb42e3f", "name": "Commented-code block (5 lines) in apps/web/src/components/blocks/__tests__/DrillExportControls.test.tsx:89", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/components/blocks/__tests__/DrillExportControls.test.tsx:89"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d85647738f7fc0d2", "name": "Commented-code block (5 lines) in apps/web/src/lib/urlDetect.ts:79", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/lib/urlDetect.ts:79"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d9eaabfcde23efb9", "name": "Commented-code block (5 lines) in apps/web/src/pages/AdminGlossaryPending.tsx:170", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/pages/AdminGlossaryPending.tsx:170"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5382fea513190b1c", "name": "Commented-code block (5 lines) in apps/web/src/pages/Presentation.tsx:120", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/pages/Presentation.tsx:120"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a4bf468cabeb5dd9", "name": "Commented-code block (5 lines) in apps/web/src/pages/Login.tsx:79", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/pages/Login.tsx:79"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2f9fe61c6c41d96f", "name": "Commented-code block (5 lines) in apps/web/src/pages/__tests__/SharedDocView.test.tsx:47", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/pages/__tests__/SharedDocView.test.tsx:47"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-26be609158a4b48f", "name": "Commented-code block (5 lines) in apps/web/src/pages/__tests__/Settings.test.tsx:145", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/pages/__tests__/Settings.test.tsx:145"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c5056b5bb77f7a0e", "name": "Commented-code block (5 lines) in apps/web/src/features/search/components/CommandPalette.tsx:72", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/features/search/components/CommandPalette.tsx:72"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-14d1eea6c7f03f2e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/features/search/hooks/useSearch.ts:32", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/features/search/hooks/useSearch.ts:32"}, "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-2ff67a9bcfdc9564", "name": "Commented-code block (5 lines) in apps/web/src/features/editor/connectionStore.ts:79", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/features/editor/connectionStore.ts:79"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-603327147c7914f9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/features/editor/connectionStore.ts:84", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/features/editor/connectionStore.ts:84"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-63eb61ae8b0c7b8d", "name": "Commented-code block (7 lines) in apps/web/src/features/editor/state.ts:230", "shortDescription": {"text": "Commented-code block (7 lines) in apps/web/src/features/editor/state.ts:230"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1075af2e75e593e2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/features/editor/paste/imageRehydrate.ts:79", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/features/editor/paste/imageRehydrate.ts:79"}, "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-ba14c49a03450030", "name": "Commented-code block (5 lines) in apps/web/src/features/editor/components/SlashCommandMenu.tsx:36", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/features/editor/components/SlashCommandMenu.tsx:36"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ac96989ba9daeef0", "name": "Commented-code block (5 lines) in apps/web/src/features/editor/components/OutlinePanel.tsx:137", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/features/editor/components/OutlinePanel.tsx:137"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-076f8bcd97dc3924", "name": "Commented-code block (6 lines) in apps/web/src/features/editor/components/InlineTextBlockEditor.tsx:83", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/src/features/editor/components/InlineTextBlockEditor.tsx:83"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c8cea5a0aad748fa", "name": "Commented-code block (11 lines) in apps/web/src/features/editor/components/SimpleStackEditor.tsx:422", "shortDescription": {"text": "Commented-code block (11 lines) in apps/web/src/features/editor/components/SimpleStackEditor.tsx:422"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e42a12afbec7ca6d", "name": "Commented-code block (6 lines) in apps/web/src/features/editor/components/BlockInsertPalette.tsx:492", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/src/features/editor/components/BlockInsertPalette.tsx:492"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fce0240947888c1d", "name": "Commented-code block (7 lines) in apps/web/src/features/editor/components/ConflictMergeModal.tsx:82", "shortDescription": {"text": "Commented-code block (7 lines) in apps/web/src/features/editor/components/ConflictMergeModal.tsx:82"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a0e18b8ebbb56618", "name": "Commented-code block (10 lines) in apps/web/src/features/editor/components/__tests__/LazyBlockSlot.test.tsx:69", "shortDescription": {"text": "Commented-code block (10 lines) in apps/web/src/features/editor/components/__tests__/LazyBlockSlot.test.tsx:69"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cff2bbff9cb7a609", "name": "Commented-code block (5 lines) in apps/web/src/features/editor/hooks/useAutoSave.ts:280", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/features/editor/hooks/useAutoSave.ts:280"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8d251196bd6b9e66", "name": "Commented-code block (7 lines) in apps/web/src/features/editor/blocks/ImageAnnotationBlockEditor.tsx:385", "shortDescription": {"text": "Commented-code block (7 lines) in apps/web/src/features/editor/blocks/ImageAnnotationBlockEditor.tsx:385"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-95500d7e13d8020a", "name": "Commented-code block (5 lines) in apps/web/src/features/editor/blocks/zebra.ts:37", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/features/editor/blocks/zebra.ts:37"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-54445c0f149d4ac4", "name": "Commented-code block (6 lines) in apps/web/src/features/editor/blocks/TableBlockEditor.tsx:223", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/src/features/editor/blocks/TableBlockEditor.tsx:223"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b8f5bf3937ae9632", "name": "Commented-code block (5 lines) in apps/web/src/features/editor/blocks/__tests__/tableCells.test.ts:52", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/features/editor/blocks/__tests__/tableCells.test.ts:52"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e7c85d52a2b09950", "name": "Commented-code block (6 lines) in apps/web/src/features/editor/blocks/__tests__/CellBlockEditor.test.tsx:16", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/src/features/editor/blocks/__tests__/CellBlockEditor.test.tsx:16"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-eab112eff1204af6", "name": "Commented-code block (5 lines) in apps/web/src/features/editor/blocks/spreadsheet/__tests__/referenceShift.test.ts:201", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/features/editor/blocks/spreadsheet/__tests__/referenceShift.test.ts:201"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c2a55e8a1daca37b", "name": "Commented-code block (10 lines) in apps/web/src/features/presentation/slideMachine.ts:67", "shortDescription": {"text": "Commented-code block (10 lines) in apps/web/src/features/presentation/slideMachine.ts:67"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-002aca384297149a", "name": "Commented-code block (5 lines) in apps/web/src/features/graph/components/KnowledgeGraph.tsx:753", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/features/graph/components/KnowledgeGraph.tsx:753"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e5e77b304fa206ca", "name": "Commented-code block (5 lines) in packages/shared/codegen/generate-ts.mjs:33", "shortDescription": {"text": "Commented-code block (5 lines) in packages/shared/codegen/generate-ts.mjs:33"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-34fa285f792c4e9f", "name": "Legacy-named symbol `pydantic_v2` in packages/shared/codegen/generate-py.py:51", "shortDescription": {"text": "Legacy-named symbol `pydantic_v2` in packages/shared/codegen/generate-py.py:51"}, "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-4a43436ac453a4ee", "name": "Commented-code block (7 lines) in packages/shared/codegen/generate-py.py:33", "shortDescription": {"text": "Commented-code block (7 lines) in packages/shared/codegen/generate-py.py:33"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2d970e577cdcd040", "name": "Network/subprocess call without timeout or try/except \u2014 examples/namu-archive-bulk/post-link.py:219", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 examples/namu-archive-bulk/post-link.py:219"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9a82cf7d16234d20", "name": "21 env vars used in code but missing from .env.example", "shortDescription": {"text": "21 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `AIDH_DEAD_LETTER_DIR`, `BASE_URL`, `BOOTSTRAP_ADMIN_EMAIL`, `BOOTSTRAP_ADMIN_NAME`, `BOOTSTRAP_ADMIN_PASSWORD`, `CI`, `DEV`, `MODE` + 13 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\napps/api/app/middleware/security.py:dispatch, apps/api/app/middleware/security.py:dispatch\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-02525d39071dd2c7", "name": "Near-duplicate function bodies in 5 places", "shortDescription": {"text": "Near-duplicate function bodies in 5 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\napps/api/app/scripts/seed_more_facts.py:main, apps/api/app/scripts/seed_widget_facts.py:main, apps/api/app/scripts/seed_form_quiz_defs.py:main, apps/api/app/scripts/seed_glossary.py:main\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-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:\napps/api/app/routers/retention.py:get_policy, apps/api/app/routers/retention.py:dry_run_policy, apps/api/app/routers/retention.py:run_policy_now\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-9ffd3da9e6da7990", "name": "Frontend route `/auth/verify` has no Link/navigate to it \u2014 apps/web/src/pages/__tests__/EmailVerify.test.tsx", "shortDescription": {"text": "Frontend route `/auth/verify` has no Link/navigate to it \u2014 apps/web/src/pages/__tests__/EmailVerify.test.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-21ccc24f176f3d5a", "name": "Frontend route `/auth/reset` has no Link/navigate to it \u2014 apps/web/src/pages/__tests__/ResetPassword.test.tsx", "shortDescription": {"text": "Frontend route `/auth/reset` has no Link/navigate to it \u2014 apps/web/src/pages/__tests__/ResetPassword.test.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cb8165b9e443f504", "name": "Frontend route `/share/:token` has no Link/navigate to it \u2014 apps/web/src/pages/__tests__/SharedDocView.test.tsx", "shortDescription": {"text": "Frontend route `/share/:token` has no Link/navigate to it \u2014 apps/web/src/pages/__tests__/SharedDocView.test.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8de2276b5efcc024", "name": "Frontend route `/present/:slug` has no Link/navigate to it \u2014 apps/web/src/features/presentation/__tests__/Presentation.t", "shortDescription": {"text": "Frontend route `/present/:slug` has no Link/navigate to it \u2014 apps/web/src/features/presentation/__tests__/Presentation.theme.test.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-63531e7df488aae0", "name": "Frontend route `/present/:slug/notes` has no Link/navigate to it \u2014 apps/web/src/features/presentation/__tests__/Presente", "shortDescription": {"text": "Frontend route `/present/:slug/notes` has no Link/navigate to it \u2014 apps/web/src/features/presentation/__tests__/PresenterView.test.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-de87aa6d75afd154", "name": "Frontend route `docs/new` has no Link/navigate to it \u2014 apps/web/src/main.tsx", "shortDescription": {"text": "Frontend route `docs/new` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-78157d97fe4e4f0f", "name": "Frontend route `docs/import` has no Link/navigate to it \u2014 apps/web/src/main.tsx", "shortDescription": {"text": "Frontend route `docs/import` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ed3520a5b7456cdc", "name": "Frontend route `docs/:slug` has no Link/navigate to it \u2014 apps/web/src/main.tsx", "shortDescription": {"text": "Frontend route `docs/:slug` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f71549796697bf5b", "name": "Frontend route `docs/:slug/variables` has no Link/navigate to it \u2014 apps/web/src/main.tsx", "shortDescription": {"text": "Frontend route `docs/:slug/variables` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ca20c673f1d23121", "name": "Frontend route `docs/:slug/custom-css` has no Link/navigate to it \u2014 apps/web/src/main.tsx", "shortDescription": {"text": "Frontend route `docs/:slug/custom-css` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-00b37faddfc4a6d8", "name": "Frontend route `docs/:slug/versions/:from/diff/:to` has no Link/navigate to it \u2014 apps/web/src/main.tsx", "shortDescription": {"text": "Frontend route `docs/:slug/versions/:from/diff/:to` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cdfbbb88e8b483fc", "name": "Frontend route `compare` has no Link/navigate to it \u2014 apps/web/src/main.tsx", "shortDescription": {"text": "Frontend route `compare` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0da99fa0cbdb7c98", "name": "Frontend route `orgs` has no Link/navigate to it \u2014 apps/web/src/main.tsx", "shortDescription": {"text": "Frontend route `orgs` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b0e14e6e13ccd2d1", "name": "Frontend route `glossary` has no Link/navigate to it \u2014 apps/web/src/main.tsx", "shortDescription": {"text": "Frontend route `glossary` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d5a0e4d81273cf33", "name": "Frontend route `admin/orgs` has no Link/navigate to it \u2014 apps/web/src/main.tsx", "shortDescription": {"text": "Frontend route `admin/orgs` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ad0b372eaa51af96", "name": "Frontend route `admin/dashboard` has no Link/navigate to it \u2014 apps/web/src/main.tsx", "shortDescription": {"text": "Frontend route `admin/dashboard` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-502e7529291cba72", "name": "Frontend route `admin/health` has no Link/navigate to it \u2014 apps/web/src/main.tsx", "shortDescription": {"text": "Frontend route `admin/health` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d355536906fdfe80", "name": "Frontend route `admin/import-csv` has no Link/navigate to it \u2014 apps/web/src/main.tsx", "shortDescription": {"text": "Frontend route `admin/import-csv` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3f62e8ce7cf4981e", "name": "Frontend route `admin/archive` has no Link/navigate to it \u2014 apps/web/src/main.tsx", "shortDescription": {"text": "Frontend route `admin/archive` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f5d48488176bea43", "name": "Frontend route `admin/audit` has no Link/navigate to it \u2014 apps/web/src/main.tsx", "shortDescription": {"text": "Frontend route `admin/audit` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e8c43fce81dfbbe4", "name": "Frontend route `admin/audit-retention` has no Link/navigate to it \u2014 apps/web/src/main.tsx", "shortDescription": {"text": "Frontend route `admin/audit-retention` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-466c769f300d969c", "name": "Frontend route `admin/backups` has no Link/navigate to it \u2014 apps/web/src/main.tsx", "shortDescription": {"text": "Frontend route `admin/backups` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-37d86ff59063bf03", "name": "Frontend route `admin/tags` has no Link/navigate to it \u2014 apps/web/src/main.tsx", "shortDescription": {"text": "Frontend route `admin/tags` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fc230f6c896d08bb", "name": "Frontend route `admin/templates` has no Link/navigate to it \u2014 apps/web/src/main.tsx", "shortDescription": {"text": "Frontend route `admin/templates` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c9bc8d959c28aaa1", "name": "Frontend route `admin/webhooks` has no Link/navigate to it \u2014 apps/web/src/main.tsx", "shortDescription": {"text": "Frontend route `admin/webhooks` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-69c5301e0753432b", "name": "Frontend route `admin/automation` has no Link/navigate to it \u2014 apps/web/src/main.tsx", "shortDescription": {"text": "Frontend route `admin/automation` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-076ff8441e2f4143", "name": "Frontend route `admin/workflow-chains` has no Link/navigate to it \u2014 apps/web/src/main.tsx", "shortDescription": {"text": "Frontend route `admin/workflow-chains` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-82472b0d16f36321", "name": "Frontend route `admin/sso` has no Link/navigate to it \u2014 apps/web/src/main.tsx", "shortDescription": {"text": "Frontend route `admin/sso` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-404189a127142c06", "name": "Frontend route `admin/retention` has no Link/navigate to it \u2014 apps/web/src/main.tsx", "shortDescription": {"text": "Frontend route `admin/retention` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5d04b44c73d507d8", "name": "Frontend route `admin/glossary-pending` has no Link/navigate to it \u2014 apps/web/src/main.tsx", "shortDescription": {"text": "Frontend route `admin/glossary-pending` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-75618a374a5bccf0", "name": "Frontend route `analytics` has no Link/navigate to it \u2014 apps/web/src/main.tsx", "shortDescription": {"text": "Frontend route `analytics` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7639e53eeefef008", "name": "Frontend route `recent` has no Link/navigate to it \u2014 apps/web/src/main.tsx", "shortDescription": {"text": "Frontend route `recent` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-90482bd7841185c8", "name": "Frontend route `activity` has no Link/navigate to it \u2014 apps/web/src/main.tsx", "shortDescription": {"text": "Frontend route `activity` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c15aa2b9a0c7ad22", "name": "Frontend route `reads` has no Link/navigate to it \u2014 apps/web/src/main.tsx", "shortDescription": {"text": "Frontend route `reads` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6a2651d18bccdd5f", "name": "Frontend route `reviews` has no Link/navigate to it \u2014 apps/web/src/main.tsx", "shortDescription": {"text": "Frontend route `reviews` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e4131c07c231f3d6", "name": "Frontend route `subscriptions` has no Link/navigate to it \u2014 apps/web/src/main.tsx", "shortDescription": {"text": "Frontend route `subscriptions` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-acc7be723b7f3093", "name": "Frontend route `reminders` has no Link/navigate to it \u2014 apps/web/src/main.tsx", "shortDescription": {"text": "Frontend route `reminders` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0b2237ec0a4431ac", "name": "Frontend route `views/:id` has no Link/navigate to it \u2014 apps/web/src/main.tsx", "shortDescription": {"text": "Frontend route `views/:id` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c6f1dbc54e4ba9aa", "name": "Frontend route `settings` has no Link/navigate to it \u2014 apps/web/src/main.tsx", "shortDescription": {"text": "Frontend route `settings` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3a595f3f7b19043f", "name": "Frontend route `me/api-tokens` has no Link/navigate to it \u2014 apps/web/src/main.tsx", "shortDescription": {"text": "Frontend route `me/api-tokens` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-87026913a5f5c2dd", "name": "Frontend route `me/2fa` has no Link/navigate to it \u2014 apps/web/src/main.tsx", "shortDescription": {"text": "Frontend route `me/2fa` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6097316d98fafb64", "name": "Frontend route `snippets` has no Link/navigate to it \u2014 apps/web/src/main.tsx", "shortDescription": {"text": "Frontend route `snippets` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-336fb3624e56541f", "name": "Frontend route `series` has no Link/navigate to it \u2014 apps/web/src/main.tsx", "shortDescription": {"text": "Frontend route `series` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c9810c588cdb0cc7", "name": "Frontend route `series/:slug` has no Link/navigate to it \u2014 apps/web/src/main.tsx", "shortDescription": {"text": "Frontend route `series/:slug` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6fe6f217bb314638", "name": "Frontend route `graph` has no Link/navigate to it \u2014 apps/web/src/main.tsx", "shortDescription": {"text": "Frontend route `graph` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-71fef1791f7ff980", "name": "Frontend route `graph/all` has no Link/navigate to it \u2014 apps/web/src/main.tsx", "shortDescription": {"text": "Frontend route `graph/all` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-15fbed879843d116", "name": "Frontend route `graph/:slug` has no Link/navigate to it \u2014 apps/web/src/main.tsx", "shortDescription": {"text": "Frontend route `graph/:slug` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bf375b3cdf6a9a32", "name": "Frontend route `dep-graph` has no Link/navigate to it \u2014 apps/web/src/main.tsx", "shortDescription": {"text": "Frontend route `dep-graph` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e84fceb9ef4df493", "name": "Frontend route `sigma-demo` has no Link/navigate to it \u2014 apps/web/src/main.tsx", "shortDescription": {"text": "Frontend route `sigma-demo` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-12f74081494f76c6", "name": "Frontend route `tags/:tag` has no Link/navigate to it \u2014 apps/web/src/main.tsx", "shortDescription": {"text": "Frontend route `tags/:tag` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6cefca095706516d", "name": "Frontend route `category/:cat` has no Link/navigate to it \u2014 apps/web/src/main.tsx", "shortDescription": {"text": "Frontend route `category/:cat` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-edbb5ecb3f02fd24", "name": "Frontend route `/*` has no Link/navigate to it \u2014 apps/web/src/components/__tests__/AuthGuard.test.tsx", "shortDescription": {"text": "Frontend route `/*` has no Link/navigate to it \u2014 apps/web/src/components/__tests__/AuthGuard.test.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-777c8c8afc943c4c", "name": "Frontend route `/docs/:slug/variables` has no Link/navigate to it \u2014 apps/web/src/pages/__tests__/DocumentVariables.test.", "shortDescription": {"text": "Frontend route `/docs/:slug/variables` has no Link/navigate to it \u2014 apps/web/src/pages/__tests__/DocumentVariables.test.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e5e999ceab4f5d99", "name": "Frontend route `/views/:id` has no Link/navigate to it \u2014 apps/web/src/pages/__tests__/SavedView.test.tsx", "shortDescription": {"text": "Frontend route `/views/:id` has no Link/navigate to it \u2014 apps/web/src/pages/__tests__/SavedView.test.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d163ce9d7e1ea586", "name": "Frontend route `/me/2fa` has no Link/navigate to it \u2014 apps/web/src/pages/__tests__/TwoFactorSetup.test.tsx", "shortDescription": {"text": "Frontend route `/me/2fa` has no Link/navigate to it \u2014 apps/web/src/pages/__tests__/TwoFactorSetup.test.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a21e387a2b40ff46", "name": "Frontend route `/docs/*` has no Link/navigate to it \u2014 apps/web/src/pages/__tests__/Login.test.tsx", "shortDescription": {"text": "Frontend route `/docs/*` has no Link/navigate to it \u2014 apps/web/src/pages/__tests__/Login.test.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1a7efbbb5b4ffda9", "name": "Frontend route `/docs/:slug/versions/:from/diff/:to` has no Link/navigate to it \u2014 apps/web/src/pages/__tests__/VersionDi", "shortDescription": {"text": "Frontend route `/docs/:slug/versions/:from/diff/:to` has no Link/navigate to it \u2014 apps/web/src/pages/__tests__/VersionDiff.test.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a3c2a444b0a1c97b", "name": "Frontend route `/series/:slug` has no Link/navigate to it \u2014 apps/web/src/pages/__tests__/SeriesDetail.test.tsx", "shortDescription": {"text": "Frontend route `/series/:slug` has no Link/navigate to it \u2014 apps/web/src/pages/__tests__/SeriesDetail.test.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a810a345a36538bf", "name": "FastAPI POST `portal_callback` without auth dependency \u2014 apps/api/app/routers/portal_sso.py:157", "shortDescription": {"text": "FastAPI POST `portal_callback` without auth dependency \u2014 apps/api/app/routers/portal_sso.py:157"}, "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-af6acfb8c807f9f6", "name": "FastAPI POST `create_share_link` without auth dependency \u2014 apps/api/app/routers/sharing.py:128", "shortDescription": {"text": "FastAPI POST `create_share_link` without auth dependency \u2014 apps/api/app/routers/sharing.py:128"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-687dfb1effe5c545", "name": "FastAPI POST `refresh` without auth dependency \u2014 apps/api/app/routers/auth.py:293", "shortDescription": {"text": "FastAPI POST `refresh` without auth dependency \u2014 apps/api/app/routers/auth.py:293"}, "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-13e03512c3bfeacf", "name": "FastAPI POST `export_pptx` without auth dependency \u2014 apps/api/app/routers/exports.py:193", "shortDescription": {"text": "FastAPI POST `export_pptx` without auth dependency \u2014 apps/api/app/routers/exports.py:193"}, "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-cfa063a6db145852", "name": "FastAPI POST `<anonymous>` without auth dependency \u2014 apps/api/app/routers/exports.py:277", "shortDescription": {"text": "FastAPI POST `<anonymous>` without auth dependency \u2014 apps/api/app/routers/exports.py:277"}, "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-1e617faca420fb3b", "name": "FastAPI POST `verify_email` without auth dependency \u2014 apps/api/app/routers/auth_flows.py:172", "shortDescription": {"text": "FastAPI POST `verify_email` without auth dependency \u2014 apps/api/app/routers/auth_flows.py:172"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b3d5adf05b306655", "name": "FastAPI POST `forgot_password` without auth dependency \u2014 apps/api/app/routers/auth_flows.py:195", "shortDescription": {"text": "FastAPI POST `forgot_password` without auth dependency \u2014 apps/api/app/routers/auth_flows.py:195"}, "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-228a4dc48c8555ef", "name": "FastAPI POST `reset_password` without auth dependency \u2014 apps/api/app/routers/auth_flows.py:235", "shortDescription": {"text": "FastAPI POST `reset_password` without auth dependency \u2014 apps/api/app/routers/auth_flows.py:235"}, "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-59cd96cc8bfcaf1d", "name": "FastAPI POST `create_document` without auth dependency \u2014 apps/api/app/routers/documents.py:355", "shortDescription": {"text": "FastAPI POST `create_document` without auth dependency \u2014 apps/api/app/routers/documents.py:355"}, "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-214752daf6b5b1df", "name": "FastAPI PUT `replace_document` without auth dependency \u2014 apps/api/app/routers/documents.py:397", "shortDescription": {"text": "FastAPI PUT `replace_document` without auth dependency \u2014 apps/api/app/routers/documents.py:397"}, "fullDescription": {"text": "`@router.put` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a2aa4f58838e5dc4", "name": "FastAPI PATCH `patch_title` without auth dependency \u2014 apps/api/app/routers/documents.py:561", "shortDescription": {"text": "FastAPI PATCH `patch_title` without auth dependency \u2014 apps/api/app/routers/documents.py:561"}, "fullDescription": {"text": "`@router.patch` 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-c4bc8ee80a3ff2f7", "name": "FastAPI PATCH `patch_infobox` without auth dependency \u2014 apps/api/app/routers/documents.py:610", "shortDescription": {"text": "FastAPI PATCH `patch_infobox` without auth dependency \u2014 apps/api/app/routers/documents.py:610"}, "fullDescription": {"text": "`@router.patch` 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-413b666f194a79b8", "name": "FastAPI PATCH `patch_variables` without auth dependency \u2014 apps/api/app/routers/documents.py:653", "shortDescription": {"text": "FastAPI PATCH `patch_variables` without auth dependency \u2014 apps/api/app/routers/documents.py:653"}, "fullDescription": {"text": "`@router.patch` 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-8eebb305867764ef", "name": "FastAPI PATCH `patch_custom_css` without auth dependency \u2014 apps/api/app/routers/documents.py:695", "shortDescription": {"text": "FastAPI PATCH `patch_custom_css` without auth dependency \u2014 apps/api/app/routers/documents.py:695"}, "fullDescription": {"text": "`@router.patch` 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-e703515b471cb31a", "name": "FastAPI PATCH `patch_section` without auth dependency \u2014 apps/api/app/routers/documents.py:741", "shortDescription": {"text": "FastAPI PATCH `patch_section` without auth dependency \u2014 apps/api/app/routers/documents.py:741"}, "fullDescription": {"text": "`@router.patch` 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-e873b3020ee389f1", "name": "FastAPI PATCH `patch_block` without auth dependency \u2014 apps/api/app/routers/documents.py:782", "shortDescription": {"text": "FastAPI PATCH `patch_block` without auth dependency \u2014 apps/api/app/routers/documents.py:782"}, "fullDescription": {"text": "`@router.patch` 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-561a0c2faaf80433", "name": "FastAPI POST `insert_block` without auth dependency \u2014 apps/api/app/routers/documents.py:822", "shortDescription": {"text": "FastAPI POST `insert_block` without auth dependency \u2014 apps/api/app/routers/documents.py:822"}, "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-94d319ef1a0604cf", "name": "FastAPI POST `move_block` without auth dependency \u2014 apps/api/app/routers/documents.py:897", "shortDescription": {"text": "FastAPI POST `move_block` without auth dependency \u2014 apps/api/app/routers/documents.py:897"}, "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-1144e6c254791217", "name": "FastAPI POST `reorder_sections` without auth dependency \u2014 apps/api/app/routers/documents.py:945", "shortDescription": {"text": "FastAPI POST `reorder_sections` without auth dependency \u2014 apps/api/app/routers/documents.py:945"}, "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-6b72dc84a0510fed", "name": "FastAPI POST `roundtrip_docx_endpoint` without auth dependency \u2014 apps/api/app/routers/imports.py:395", "shortDescription": {"text": "FastAPI POST `roundtrip_docx_endpoint` without auth dependency \u2014 apps/api/app/routers/imports.py:395"}, "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-102d0b1e6bc07c76", "name": "FastAPI POST `import_csv` without auth dependency \u2014 apps/api/app/routers/imports.py:754", "shortDescription": {"text": "FastAPI POST `import_csv` without auth dependency \u2014 apps/api/app/routers/imports.py:754"}, "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-e51dc4162dd91707", "name": "Unused endpoint: GET /api/v1/healthz", "shortDescription": {"text": "Unused endpoint: GET /api/v1/healthz"}, "fullDescription": {"text": "`apps/api/app/main.py` declares `GET /api/v1/healthz` 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": "`apps/api/app/routers/notifications.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-41ceaf31df46f630", "name": "Unused endpoint: POST /{nid}/read", "shortDescription": {"text": "Unused endpoint: POST /{nid}/read"}, "fullDescription": {"text": "`apps/api/app/routers/notifications.py` declares `POST /{nid}/read` 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-ed9dddf7a9fcd5ff", "name": "Unused endpoint: GET /admin/audit-retention", "shortDescription": {"text": "Unused endpoint: GET /admin/audit-retention"}, "fullDescription": {"text": "`apps/api/app/routers/audit_retention.py` declares `GET /admin/audit-retention` 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-a7c6955e9653f3b9", "name": "Unused endpoint: PATCH /admin/audit-retention", "shortDescription": {"text": "Unused endpoint: PATCH /admin/audit-retention"}, "fullDescription": {"text": "`apps/api/app/routers/audit_retention.py` declares `PATCH /admin/audit-retention` 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-04878ddb98c19ca0", "name": "Unused endpoint: POST /admin/audit-retention/prune-now", "shortDescription": {"text": "Unused endpoint: POST /admin/audit-retention/prune-now"}, "fullDescription": {"text": "`apps/api/app/routers/audit_retention.py` declares `POST /admin/audit-retention/prune-now` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f7d09660dd5f4516", "name": "Unused endpoint: POST /admin/retention-policies", "shortDescription": {"text": "Unused endpoint: POST /admin/retention-policies"}, "fullDescription": {"text": "`apps/api/app/routers/retention.py` declares `POST /admin/retention-policies` 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-3aa07520913ffe38", "name": "Unused endpoint: GET /admin/retention-policies", "shortDescription": {"text": "Unused endpoint: GET /admin/retention-policies"}, "fullDescription": {"text": "`apps/api/app/routers/retention.py` declares `GET /admin/retention-policies` 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-58d901b2f06daf24", "name": "Unused endpoint: GET /admin/retention-policies/{policy_id}", "shortDescription": {"text": "Unused endpoint: GET /admin/retention-policies/{policy_id}"}, "fullDescription": {"text": "`apps/api/app/routers/retention.py` declares `GET /admin/retention-policies/{policy_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-ecbe2884b38c571d", "name": "Unused endpoint: PATCH /admin/retention-policies/{policy_id}", "shortDescription": {"text": "Unused endpoint: PATCH /admin/retention-policies/{policy_id}"}, "fullDescription": {"text": "`apps/api/app/routers/retention.py` declares `PATCH /admin/retention-policies/{policy_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-24c4a6edc7167590", "name": "Unused endpoint: DELETE /admin/retention-policies/{policy_id}", "shortDescription": {"text": "Unused endpoint: DELETE /admin/retention-policies/{policy_id}"}, "fullDescription": {"text": "`apps/api/app/routers/retention.py` declares `DELETE /admin/retention-policies/{policy_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-738ed66a6785fa16", "name": "Unused endpoint: POST /admin/retention-policies/{policy_id}/dry-run", "shortDescription": {"text": "Unused endpoint: POST /admin/retention-policies/{policy_id}/dry-run"}, "fullDescription": {"text": "`apps/api/app/routers/retention.py` declares `POST /admin/retention-policies/{policy_id}/dry-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-e77fed0d7e45b801", "name": "Unused endpoint: POST /admin/retention-policies/{policy_id}/run", "shortDescription": {"text": "Unused endpoint: POST /admin/retention-policies/{policy_id}/run"}, "fullDescription": {"text": "`apps/api/app/routers/retention.py` declares `POST /admin/retention-policies/{policy_id}/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-d585f36aef259b97", "name": "Unused endpoint: GET /admin/retention-policies/{policy_id}/runs", "shortDescription": {"text": "Unused endpoint: GET /admin/retention-policies/{policy_id}/runs"}, "fullDescription": {"text": "`apps/api/app/routers/retention.py` declares `GET /admin/retention-policies/{policy_id}/runs` 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-359f35937bed4935", "name": "Unused endpoint: GET /registry", "shortDescription": {"text": "Unused endpoint: GET /registry"}, "fullDescription": {"text": "`apps/api/app/routers/widgets.py` declares `GET /registry` 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-4a8a5c643de598ea", "name": "Unused endpoint: GET /kpi/{key:path}", "shortDescription": {"text": "Unused endpoint: GET /kpi/{key:path}"}, "fullDescription": {"text": "`apps/api/app/routers/widgets.py` declares `GET /kpi/{key: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-085b2a56bd4f702d", "name": "Unused endpoint: GET /kpi-finance-daily-summary", "shortDescription": {"text": "Unused endpoint: GET /kpi-finance-daily-summary"}, "fullDescription": {"text": "`apps/api/app/routers/widgets.py` declares `GET /kpi-finance-daily-summary` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1a1f8d3f2f343b75", "name": "Unused endpoint: GET /chart/sales-trend", "shortDescription": {"text": "Unused endpoint: GET /chart/sales-trend"}, "fullDescription": {"text": "`apps/api/app/routers/widgets.py` declares `GET /chart/sales-trend` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bb2eb1011315e6f1", "name": "Unused endpoint: GET /chart/month-end-progress", "shortDescription": {"text": "Unused endpoint: GET /chart/month-end-progress"}, "fullDescription": {"text": "`apps/api/app/routers/widgets.py` declares `GET /chart/month-end-progress` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bf8e5ccafb0477ec", "name": "Unused endpoint: GET /table/region-breakdown", "shortDescription": {"text": "Unused endpoint: GET /table/region-breakdown"}, "fullDescription": {"text": "`apps/api/app/routers/widgets.py` declares `GET /table/region-breakdown` 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-e87c0ee955911afe", "name": "Unused endpoint: GET /table/sales-summary", "shortDescription": {"text": "Unused endpoint: GET /table/sales-summary"}, "fullDescription": {"text": "`apps/api/app/routers/widgets.py` declares `GET /table/sales-summary` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8a2fb1c3ddfe52c3", "name": "Unused endpoint: GET /launch/{program}/tasks", "shortDescription": {"text": "Unused endpoint: GET /launch/{program}/tasks"}, "fullDescription": {"text": "`apps/api/app/routers/widgets.py` declares `GET /launch/{program}/tasks` 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-6c45efa3d97c971e", "name": "Unused endpoint: GET /launch/{program}/timeline", "shortDescription": {"text": "Unused endpoint: GET /launch/{program}/timeline"}, "fullDescription": {"text": "`apps/api/app/routers/widgets.py` declares `GET /launch/{program}/timeline` 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-2a551dbd405fa748", "name": "Unused endpoint: GET /launch/{program}/forecast", "shortDescription": {"text": "Unused endpoint: GET /launch/{program}/forecast"}, "fullDescription": {"text": "`apps/api/app/routers/widgets.py` declares `GET /launch/{program}/forecast` 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-f5320327a862fe7b", "name": "Unused endpoint: GET /chart/team-share", "shortDescription": {"text": "Unused endpoint: GET /chart/team-share"}, "fullDescription": {"text": "`apps/api/app/routers/widgets.py` declares `GET /chart/team-share` 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-beefd8f227b24326", "name": "Unused endpoint: GET /chart/region-share", "shortDescription": {"text": "Unused endpoint: GET /chart/region-share"}, "fullDescription": {"text": "`apps/api/app/routers/widgets.py` declares `GET /chart/region-share` 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-4434a0f55a1fe231", "name": "Unused endpoint: GET /chart/cohort-retention", "shortDescription": {"text": "Unused endpoint: GET /chart/cohort-retention"}, "fullDescription": {"text": "`apps/api/app/routers/widgets.py` declares `GET /chart/cohort-retention` 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-64d91c29a89e5efd", "name": "Unused endpoint: GET /chart/funnel-conversion", "shortDescription": {"text": "Unused endpoint: GET /chart/funnel-conversion"}, "fullDescription": {"text": "`apps/api/app/routers/widgets.py` declares `GET /chart/funnel-conversion` 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-3925d19e457f6be1", "name": "Unused endpoint: GET /chart/audit-volume", "shortDescription": {"text": "Unused endpoint: GET /chart/audit-volume"}, "fullDescription": {"text": "`apps/api/app/routers/widgets.py` declares `GET /chart/audit-volume` 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-9a0004a15d044700", "name": "Unused endpoint: GET /table/incidents-recent", "shortDescription": {"text": "Unused endpoint: GET /table/incidents-recent"}, "fullDescription": {"text": "`apps/api/app/routers/widgets.py` declares `GET /table/incidents-recent` 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-238545e728c215a8", "name": "Unused endpoint: GET /table/campaigns-active", "shortDescription": {"text": "Unused endpoint: GET /table/campaigns-active"}, "fullDescription": {"text": "`apps/api/app/routers/widgets.py` declares `GET /table/campaigns-active` 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-7b6c61dc14354019", "name": "Unused endpoint: GET /table/documents-top", "shortDescription": {"text": "Unused endpoint: GET /table/documents-top"}, "fullDescription": {"text": "`apps/api/app/routers/widgets.py` declares `GET /table/documents-top` 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-a0cdcea8adcc79dd", "name": "Unused endpoint: GET /table/glossary-top", "shortDescription": {"text": "Unused endpoint: GET /table/glossary-top"}, "fullDescription": {"text": "`apps/api/app/routers/widgets.py` declares `GET /table/glossary-top` 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-6bf46ae4d72e2d1e", "name": "Unused endpoint: GET /{kind}/{widget_id:path}", "shortDescription": {"text": "Unused endpoint: GET /{kind}/{widget_id:path}"}, "fullDescription": {"text": "`apps/api/app/routers/widgets.py` declares `GET /{kind}/{widget_id: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-37f768eb73a4eacc", "name": "Unused endpoint: GET /definitions", "shortDescription": {"text": "Unused endpoint: GET /definitions"}, "fullDescription": {"text": "`apps/api/app/routers/quiz.py` declares `GET /definitions` 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-617a169972fe45df", "name": "Unused endpoint: GET /definitions/{quiz_id:path}", "shortDescription": {"text": "Unused endpoint: GET /definitions/{quiz_id:path}"}, "fullDescription": {"text": "`apps/api/app/routers/quiz.py` declares `GET /definitions/{quiz_id: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-7528ed4ad35fc8fc", "name": "Unused endpoint: POST /{slug}/{block_id}/attempts", "shortDescription": {"text": "Unused endpoint: POST /{slug}/{block_id}/attempts"}, "fullDescription": {"text": "`apps/api/app/routers/quiz.py` declares `POST /{slug}/{block_id}/attempts` 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-8fe85db916205049", "name": "Unused endpoint: GET /{slug}/{block_id}/attempts", "shortDescription": {"text": "Unused endpoint: GET /{slug}/{block_id}/attempts"}, "fullDescription": {"text": "`apps/api/app/routers/quiz.py` declares `GET /{slug}/{block_id}/attempts` 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-db9b5661b0e65293", "name": "Unused endpoint: GET /{slug}/{block_id}/leaderboard", "shortDescription": {"text": "Unused endpoint: GET /{slug}/{block_id}/leaderboard"}, "fullDescription": {"text": "`apps/api/app/routers/quiz.py` declares `GET /{slug}/{block_id}/leaderboard` 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-10e7266bcd07230d", "name": "Unused endpoint: GET /me/{slug}/{block_id}", "shortDescription": {"text": "Unused endpoint: GET /me/{slug}/{block_id}"}, "fullDescription": {"text": "`apps/api/app/routers/quiz.py` declares `GET /me/{slug}/{block_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-9f06b1725695147b", "name": "Unused endpoint: GET /admin/health-dashboard", "shortDescription": {"text": "Unused endpoint: GET /admin/health-dashboard"}, "fullDescription": {"text": "`apps/api/app/routers/health_dashboard.py` declares `GET /admin/health-dashboard` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-11067f3f963489e2", "name": "Unused endpoint: GET /glossary", "shortDescription": {"text": "Unused endpoint: GET /glossary"}, "fullDescription": {"text": "`apps/api/app/routers/glossary.py` declares `GET /glossary` 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-9a2b20570840759e", "name": "Unused endpoint: GET /glossary/term/{term}", "shortDescription": {"text": "Unused endpoint: GET /glossary/term/{term}"}, "fullDescription": {"text": "`apps/api/app/routers/glossary.py` declares `GET /glossary/term/{term}` 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-4f1fb035a6560187", "name": "Unused endpoint: POST /glossary/propose", "shortDescription": {"text": "Unused endpoint: POST /glossary/propose"}, "fullDescription": {"text": "`apps/api/app/routers/glossary.py` declares `POST /glossary/propose` 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-7d021dab23203a82", "name": "Unused endpoint: GET /glossary/pending", "shortDescription": {"text": "Unused endpoint: GET /glossary/pending"}, "fullDescription": {"text": "`apps/api/app/routers/glossary.py` declares `GET /glossary/pending` 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-333bc911e3945fd9", "name": "Unused endpoint: POST /glossary/{term_id}/approve", "shortDescription": {"text": "Unused endpoint: POST /glossary/{term_id}/approve"}, "fullDescription": {"text": "`apps/api/app/routers/glossary.py` declares `POST /glossary/{term_id}/approve` 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-78fed4f4fe79fb37", "name": "Unused endpoint: POST /glossary/{term_id}/reject", "shortDescription": {"text": "Unused endpoint: POST /glossary/{term_id}/reject"}, "fullDescription": {"text": "`apps/api/app/routers/glossary.py` declares `POST /glossary/{term_id}/reject` 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-b392dfe50da98d26", "name": "Unused endpoint: PATCH /glossary/{term_id}", "shortDescription": {"text": "Unused endpoint: PATCH /glossary/{term_id}"}, "fullDescription": {"text": "`apps/api/app/routers/glossary.py` declares `PATCH /glossary/{term_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-67f3390656a13a93", "name": "Unused endpoint: PATCH /glossary/proposals/{term_id}", "shortDescription": {"text": "Unused endpoint: PATCH /glossary/proposals/{term_id}"}, "fullDescription": {"text": "`apps/api/app/routers/glossary.py` declares `PATCH /glossary/proposals/{term_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-bc44e5c122f0b8c4", "name": "Unused endpoint: DELETE /glossary/proposals/{term_id}", "shortDescription": {"text": "Unused endpoint: DELETE /glossary/proposals/{term_id}"}, "fullDescription": {"text": "`apps/api/app/routers/glossary.py` declares `DELETE /glossary/proposals/{term_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}}]}}, "automationDetails": {"id": "repobility/20178"}, "properties": {"repository": "squall321/MXWhitePaper", "repoUrl": "https://github.com/squall321/MXWhitePaper", "branch": "main"}, "results": [{"ruleId": "scanner-211801dd52cb4db1", "level": "note", "message": {"text": "Possibly dead Python function: list_history"}, "properties": {"repobilityId": "e296e3d1e5fd8615", "scanner": "scanner-primary", "fingerprint": "211801dd52cb4db1", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/app/repos/glossary_repo.py:387"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a75b80b9f71a0604", "level": "note", "message": {"text": "Possibly dead Python function: repl"}, "properties": {"repobilityId": "6f5d3779bbb8be8b", "scanner": "scanner-primary", "fingerprint": "a75b80b9f71a0604", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/app/services/variables.py:39"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-95fb54acec39693f", "level": "note", "message": {"text": "Possibly dead Python function: emit_hidden_marker_text"}, "properties": {"repobilityId": "9ed404d3b4f0401e", "scanner": "scanner-primary", "fingerprint": "95fb54acec39693f", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/app/services/widget_markers.py:136"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9be76f597e6fb07d", "level": "note", "message": {"text": "Possibly dead Python function: roundtrip_docx"}, "properties": {"repobilityId": "200bf0a4867d4d0d", "scanner": "scanner-primary", "fingerprint": "9be76f597e6fb07d", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/app/services/docx_roundtrip.py:26"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-241e0b732d41b172", "level": "note", "message": {"text": "Possibly dead Python function: build_discovery_link"}, "properties": {"repobilityId": "e282faee353bf5d7", "scanner": "scanner-primary", "fingerprint": "241e0b732d41b172", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/app/routers/oembed.py:383"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-dbff07fe51992d6e", "level": "note", "message": {"text": "Possibly dead Python function: do_run_migrations"}, "properties": {"repobilityId": "087acb17722cfd2f", "scanner": "scanner-primary", "fingerprint": "dbff07fe51992d6e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/alembic/env.py:34"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a87e1004bd48ca14", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "a87e1004bd48ca14", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/alembic/versions/0010_snippets.py:31"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a4a121ef390c3bde", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "a4a121ef390c3bde", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/alembic/versions/0010_snippets.py:50"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-15f2a3f538ff6709", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "15f2a3f538ff6709", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/alembic/versions/0044_more_facts.py:22"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c87c8a4420bc1ff6", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "c87c8a4420bc1ff6", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/alembic/versions/0044_more_facts.py:82"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c57421adb52b7e34", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "c57421adb52b7e34", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/alembic/versions/0016_anchor_samples.py:32"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d22b7110c3f41024", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "d22b7110c3f41024", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/alembic/versions/0016_anchor_samples.py:53"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9132af1a9f418247", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "9132af1a9f418247", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/alembic/versions/0026_auth_tokens.py:23"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-50c867798bf11ef1", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "50c867798bf11ef1", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/alembic/versions/0026_auth_tokens.py:48"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c929891f13c19eb4", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "c929891f13c19eb4", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/alembic/versions/0023_api_tokens.py:31"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-92a3a6084ab0ca0e", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "92a3a6084ab0ca0e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/alembic/versions/0023_api_tokens.py:51"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4049e2751133ccef", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "4049e2751133ccef", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/alembic/versions/0043_export_artifacts.py:19"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-df7a3fe8363b2c77", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "df7a3fe8363b2c77", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/alembic/versions/0043_export_artifacts.py:41"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6485aa6ae19aab4f", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "6485aa6ae19aab4f", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/alembic/versions/0033_version_tags.py:46"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a6aac4e727af8eef", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "a6aac4e727af8eef", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/alembic/versions/0033_version_tags.py:68"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c973a31368e4fce9", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "c973a31368e4fce9", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/alembic/versions/0019_notification_prefs.py:21"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a52ffa376107d5de", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "a52ffa376107d5de", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/alembic/versions/0019_notification_prefs.py:28"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-67c90775240f7766", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "67c90775240f7766", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/alembic/versions/0037_cron_timezone.py:35"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-cc4b0659157e4594", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "cc4b0659157e4594", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/alembic/versions/0037_cron_timezone.py:42"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1fcd9d37123289c7", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "1fcd9d37123289c7", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/alembic/versions/0021_reactions.py:25"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-569055aa21a0ff63", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "569055aa21a0ff63", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/alembic/versions/0021_reactions.py:73"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7ce1117f9b661946", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/tests/e2e/_debug-search.spec.ts:10"}, "properties": {"repobilityId": "b47d7fdfe168f02e", "scanner": "scanner-primary", "fingerprint": "7ce1117f9b661946", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-26ad86b8f24db845", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/src/components/Highlight.tsx:8"}, "properties": {"repobilityId": "03d0cb300c80f459", "scanner": "scanner-primary", "fingerprint": "26ad86b8f24db845", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-8ce85156a4dda884", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/Lightbox.tsx:239"}, "properties": {"repobilityId": "020abfd90b9fd1f2", "scanner": "scanner-primary", "fingerprint": "8ce85156a4dda884", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-930c7ea681ce7a44", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/layout/Breadcrumb.tsx:95"}, "properties": {"repobilityId": "da45f765528bfc72", "scanner": "scanner-primary", "fingerprint": "930c7ea681ce7a44", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ef637610f32ad4c0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/layout/MobileNavDrawer.tsx:131"}, "properties": {"repobilityId": "2ed483862294e936", "scanner": "scanner-primary", "fingerprint": "ef637610f32ad4c0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b71206621856eafa", "level": "note", "message": {"text": "\"active\" state uses light bg in a dark theme \u2014 apps/web/src/components/layout/TopBar.tsx:395"}, "properties": {"repobilityId": "67e599e3ad459091", "scanner": "scanner-primary", "fingerprint": "b71206621856eafa", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.active-light-bg"]}}, {"ruleId": "scanner-d747d3099f874105", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/layout/AppShell.tsx:368"}, "properties": {"repobilityId": "ec822a0f91e80898", "scanner": "scanner-primary", "fingerprint": "d747d3099f874105", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1e35b653f2e182e6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/wiki/LinkPreview.tsx:216"}, "properties": {"repobilityId": "dfa3af5e45ee6fdb", "scanner": "scanner-primary", "fingerprint": "1e35b653f2e182e6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-12ba8ffb019d1836", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/src/components/blocks/FlowBlock.tsx:141"}, "properties": {"repobilityId": "9856036f0b7494fb", "scanner": "scanner-primary", "fingerprint": "12ba8ffb019d1836", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-efedfc811bd8dbc0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/blocks/CodeBlock.tsx:38"}, "properties": {"repobilityId": "cd8a4e08d58c23bc", "scanner": "scanner-primary", "fingerprint": "efedfc811bd8dbc0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-297ee528af7d6997", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/src/lib/qr.ts:36"}, "properties": {"repobilityId": "272157ab1b26b8a2", "scanner": "scanner-primary", "fingerprint": "297ee528af7d6997", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-ede31b487e874e9d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/Recent.tsx:76"}, "properties": {"repobilityId": "7efb5d3987f27a06", "scanner": "scanner-primary", "fingerprint": "ede31b487e874e9d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-38b6141cc4d3274a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/VersionDiff.tsx:225"}, "properties": {"repobilityId": "694644056e1c13e8", "scanner": "scanner-primary", "fingerprint": "38b6141cc4d3274a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-988d45302951efcf", "level": "note", "message": {"text": "\"active\" state uses light bg in a dark theme \u2014 apps/web/src/pages/VersionDiff.tsx:252"}, "properties": {"repobilityId": "36d7e22d7951ff78", "scanner": "scanner-primary", "fingerprint": "988d45302951efcf", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.active-light-bg"]}}, {"ruleId": "scanner-61ce6f44b4c2c476", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/WebhooksSettings.tsx:209"}, "properties": {"repobilityId": "fc03454f9afbef4f", "scanner": "scanner-primary", "fingerprint": "61ce6f44b4c2c476", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-84662778d98e33c2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/Glossary.tsx:310"}, "properties": {"repobilityId": "ac35dd14d4f59c57", "scanner": "scanner-primary", "fingerprint": "84662778d98e33c2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-23e5c2fa4778c9f6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/TemplateManager.tsx:220"}, "properties": {"repobilityId": "26a3ccd91156e99c", "scanner": "scanner-primary", "fingerprint": "23e5c2fa4778c9f6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2fb675e52eff56b4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/SeriesManager.tsx:165"}, "properties": {"repobilityId": "fb8de7149b1efb0e", "scanner": "scanner-primary", "fingerprint": "2fb675e52eff56b4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f1d6a7704b5381db", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/TagPage.tsx:106"}, "properties": {"repobilityId": "4b322c357540e86a", "scanner": "scanner-primary", "fingerprint": "f1d6a7704b5381db", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c8f59e4c66432e9b", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 apps/web/src/pages/Login.tsx:216"}, "properties": {"repobilityId": "425c1548e40ab701", "scanner": "scanner-primary", "fingerprint": "c8f59e4c66432e9b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-411aa16aa873b6e9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/SavedView.tsx:134"}, "properties": {"repobilityId": "6b2eca0bc755d3fa", "scanner": "scanner-primary", "fingerprint": "411aa16aa873b6e9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bd9171f2432b5002", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/ReadList.tsx:128"}, "properties": {"repobilityId": "e11a9632b15594f3", "scanner": "scanner-primary", "fingerprint": "bd9171f2432b5002", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4290bb7c37d2dcdf", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/src/pages/TwoFactorSetup.tsx:146"}, "properties": {"repobilityId": "be0c61c1714988c9", "scanner": "scanner-primary", "fingerprint": "4290bb7c37d2dcdf", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-9d67c7c50b95ccc5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/Home.tsx:239"}, "properties": {"repobilityId": "3643cb4dacc4e061", "scanner": "scanner-primary", "fingerprint": "9d67c7c50b95ccc5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ee72446edd8b851a", "level": "note", "message": {"text": "\"active\" state uses light bg in a dark theme \u2014 apps/web/src/pages/CrossDocCompare.tsx:168"}, "properties": {"repobilityId": "c4101b0b13bc6c40", "scanner": "scanner-primary", "fingerprint": "ee72446edd8b851a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.active-light-bg"]}}, {"ruleId": "scanner-ded2a569777608ba", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/SnippetManager.tsx:247"}, "properties": {"repobilityId": "0a61ed175c47b2e8", "scanner": "scanner-primary", "fingerprint": "ded2a569777608ba", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b96a277614fd93d6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/Analytics.tsx:198"}, "properties": {"repobilityId": "6c3c8a33e10dd71a", "scanner": "scanner-primary", "fingerprint": "b96a277614fd93d6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ff58f6a6b310f28d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/SeriesDetail.tsx:314"}, "properties": {"repobilityId": "1d72228d39828150", "scanner": "scanner-primary", "fingerprint": "ff58f6a6b310f28d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0cde5508e554761c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/upload/SmartFileDropZone.tsx:155"}, "properties": {"repobilityId": "226472bddbd4bf04", "scanner": "scanner-primary", "fingerprint": "0cde5508e554761c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-be843d0153709109", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/upload/components/ImageDropzone.tsx:247"}, "properties": {"repobilityId": "aab049468f9968b1", "scanner": "scanner-primary", "fingerprint": "be843d0153709109", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d83fae82eac75f19", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/notifications/components/NotificationDrawer.tsx:211"}, "properties": {"repobilityId": "6b8214ba980199b2", "scanner": "scanner-primary", "fingerprint": "d83fae82eac75f19", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fd3e8405e1f71990", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/series/SeriesNav.tsx:82"}, "properties": {"repobilityId": "2ec1074415a35801", "scanner": "scanner-primary", "fingerprint": "fd3e8405e1f71990", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2774a36b19e65649", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/series/AddToSeriesButton.tsx:145"}, "properties": {"repobilityId": "e409634daf012949", "scanner": "scanner-primary", "fingerprint": "2774a36b19e65649", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c7a8ee9a9cbc208e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/read-receipts/ReadReceiptPanel.tsx:177"}, "properties": {"repobilityId": "e1eec73f0c69021e", "scanner": "scanner-primary", "fingerprint": "c7a8ee9a9cbc208e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f2ec71f844a03571", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/templates/TemplateGallery.tsx:202"}, "properties": {"repobilityId": "f222a20b2f1bfbcc", "scanner": "scanner-primary", "fingerprint": "f2ec71f844a03571", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4b56b46c4e11ba5c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/search/components/CommandPalette.tsx:807"}, "properties": {"repobilityId": "203af51d00dc30ca", "scanner": "scanner-primary", "fingerprint": "4b56b46c4e11ba5c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c8147bcbad2aa673", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/src/features/search/components/CommandPalette.tsx:872"}, "properties": {"repobilityId": "ead98490c923c7f4", "scanner": "scanner-primary", "fingerprint": "c8147bcbad2aa673", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-76ad3d7dad62ce36", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/search/components/KnowledgeResults.tsx:74"}, "properties": {"repobilityId": "a64f59a260d4b326", "scanner": "scanner-primary", "fingerprint": "76ad3d7dad62ce36", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8bade5f641ae7652", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/block-library/SnippetPicker.tsx:187"}, "properties": {"repobilityId": "a89de2fc996c2d6f", "scanner": "scanner-primary", "fingerprint": "8bade5f641ae7652", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f9c3bdbe03654aaf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/quick-switcher/QuickSwitcher.tsx:282"}, "properties": {"repobilityId": "958e7e5b62d4d73c", "scanner": "scanner-primary", "fingerprint": "f9c3bdbe03654aaf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1d7676a612a195aa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/home/components/TodayHero.tsx:96"}, "properties": {"repobilityId": "0f38cd44c4ee0381", "scanner": "scanner-primary", "fingerprint": "1d7676a612a195aa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-61f73c63e0943f49", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/home/components/DomainTiles.tsx:120"}, "properties": {"repobilityId": "b3398e205dfd5d09", "scanner": "scanner-primary", "fingerprint": "61f73c63e0943f49", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ac6fcefe1650d325", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/org/components/OrgTree.tsx:336"}, "properties": {"repobilityId": "a76093acfa5f9735", "scanner": "scanner-primary", "fingerprint": "ac6fcefe1650d325", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f75cd03c5df20f24", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/editor/components/BulkActionsBar.tsx:752"}, "properties": {"repobilityId": "2fff9d57a237c376", "scanner": "scanner-primary", "fingerprint": "f75cd03c5df20f24", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9c3597461d0d34d8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/editor/components/SectionLinkPicker.tsx:187"}, "properties": {"repobilityId": "212a854f4ba67d5d", "scanner": "scanner-primary", "fingerprint": "9c3597461d0d34d8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5e2fd7ee6a2a5562", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/editor/components/VersionHistoryPanel.tsx:127"}, "properties": {"repobilityId": "25185aad9c03d6cb", "scanner": "scanner-primary", "fingerprint": "5e2fd7ee6a2a5562", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-68346e0854272e0e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/editor/components/OnboardingTour.tsx:146"}, "properties": {"repobilityId": "6392465dd39363fa", "scanner": "scanner-primary", "fingerprint": "68346e0854272e0e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3d49633ff067c1f5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/editor/components/EditorToolbar.tsx:355"}, "properties": {"repobilityId": "78b4469a7eea7d3f", "scanner": "scanner-primary", "fingerprint": "3d49633ff067c1f5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e29ff040e5085c72", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/editor/components/WikiLinkAutocomplete.tsx:195"}, "properties": {"repobilityId": "df3114fac146fce2", "scanner": "scanner-primary", "fingerprint": "e29ff040e5085c72", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8a73cd57fedbba7f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/editor/components/BlockCollapseWrapper.tsx:138"}, "properties": {"repobilityId": "036e2b702b49baaf", "scanner": "scanner-primary", "fingerprint": "8a73cd57fedbba7f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7cc50564f836be0e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/editor/components/ConflictMergeModal.tsx:425"}, "properties": {"repobilityId": "d5d2801c9fa67c3b", "scanner": "scanner-primary", "fingerprint": "7cc50564f836be0e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-64e0147014a27c8e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/editor/components/FindReplaceModal.tsx:229"}, "properties": {"repobilityId": "fd49f75a56d6e3b9", "scanner": "scanner-primary", "fingerprint": "64e0147014a27c8e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0f4117d3ce0c4595", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/editor/extensions/WikiLinkSuggestion.tsx:301"}, "properties": {"repobilityId": "cad9340024fe734b", "scanner": "scanner-primary", "fingerprint": "0f4117d3ce0c4595", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b9676bace154c2a0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/editor/blocks/ConditionalFormattingPresetsPanel.tsx:215"}, "properties": {"repobilityId": "a06c9a6411d446ef", "scanner": "scanner-primary", "fingerprint": "b9676bace154c2a0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dc90c20117b085be", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/editor/blocks/SpreadsheetBlockEditor.tsx:429"}, "properties": {"repobilityId": "0d743ab83aef9857", "scanner": "scanner-primary", "fingerprint": "dc90c20117b085be", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d4f5cc92b0f7be74", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/editor/blocks/DocLinkCardBlockEditor.tsx:140"}, "properties": {"repobilityId": "5ac3ecebba7d1f7d", "scanner": "scanner-primary", "fingerprint": "d4f5cc92b0f7be74", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ea7c5636e130b040", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/editor/blocks/ChartBlockEditor.tsx:985"}, "properties": {"repobilityId": "aa01c66a637a140d", "scanner": "scanner-primary", "fingerprint": "ea7c5636e130b040", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f346ba0ba8c19886", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/saved-views/SavedViewsList.tsx:122"}, "properties": {"repobilityId": "75a74cd25dc00f37", "scanner": "scanner-primary", "fingerprint": "f346ba0ba8c19886", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2dc5d1d042f1bb27", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/subscriptions/DigestNotification.tsx:86"}, "properties": {"repobilityId": "a859372b11a03327", "scanner": "scanner-primary", "fingerprint": "2dc5d1d042f1bb27", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1ea091d80df67084", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/cross-doc-diff/DiffSummary.tsx:109"}, "properties": {"repobilityId": "b4557100feef6f6f", "scanner": "scanner-primary", "fingerprint": "1ea091d80df67084", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-24192e04125bfc4d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/comments/components/MentionInput.tsx:193"}, "properties": {"repobilityId": "960c897ba4533b2a", "scanner": "scanner-primary", "fingerprint": "24192e04125bfc4d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-58638bcd5212e02f", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/src/features/sharing/QrShare.tsx:67"}, "properties": {"repobilityId": "eb6280cd36f2ca72", "scanner": "scanner-primary", "fingerprint": "58638bcd5212e02f", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-41cee8a9130d46ed", "level": "warning", "message": {"text": "Privileged port 252 in use"}, "properties": {"repobilityId": "44fc507a66442f8b", "scanner": "scanner-primary", "fingerprint": "41cee8a9130d46ed", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/bootstrap-host.sh"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e2b6f2dad2e5985a", "level": "warning", "message": {"text": "Privileged port 6 in use"}, "properties": {"repobilityId": "888a3c205ea7334c", "scanner": "scanner-primary", "fingerprint": "e2b6f2dad2e5985a", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/restore-drill.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7f26953381bfd135", "level": "warning", "message": {"text": "Insecure pattern 'weak_hash' in apps/api/app/services/totp.py:142"}, "properties": {"repobilityId": "ca72e733f3344f49", "scanner": "scanner-primary", "fingerprint": "7f26953381bfd135", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "weak_hash"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/app/services/totp.py"}, "region": {"startLine": 142}}}]}, {"ruleId": "scanner-8c5e038ec5d53e13", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/src/main.tsx:298"}, "properties": {"repobilityId": "0c15b34f8c9085f0", "scanner": "scanner-primary", "fingerprint": "8c5e038ec5d53e13", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/src/main.tsx"}, "region": {"startLine": 298}}}]}, {"ruleId": "scanner-cbcf034ae95ef241", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/web/src/components/blocks/FlowBlock.tsx:141"}, "properties": {"repobilityId": "3522d4fac19b4c97", "scanner": "scanner-primary", "fingerprint": "cbcf034ae95ef241", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/src/components/blocks/FlowBlock.tsx"}, "region": {"startLine": 141}}}]}, {"ruleId": "scanner-72714cf47ff036e3", "level": "error", "message": {"text": "Possible secret in apps/web/src/pages/Diag.tsx"}, "properties": {"repobilityId": "9bbca2f2ae5adec5", "scanner": "scanner-primary", "fingerprint": "72714cf47ff036e3", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/src/pages/Diag.tsx"}, "region": {"startLine": 169}}}]}, {"ruleId": "scanner-98ff5da31ff30420", "level": "error", "message": {"text": "Possible secret in apps/web/src/pages/Login.tsx"}, "properties": {"repobilityId": "7bc8a54b1b477896", "scanner": "scanner-primary", "fingerprint": "98ff5da31ff30420", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/src/pages/Login.tsx"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-b319798999ef12c5", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/web/src/pages/TwoFactorSetup.tsx:146"}, "properties": {"repobilityId": "d3ac31db7115e107", "scanner": "scanner-primary", "fingerprint": "b319798999ef12c5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/src/pages/TwoFactorSetup.tsx"}, "region": {"startLine": 146}}}]}, {"ruleId": "scanner-287fe12b84d3c012", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/web/src/features/search/components/CommandPalette.tsx:872"}, "properties": {"repobilityId": "36515da4ede465d0", "scanner": "scanner-primary", "fingerprint": "287fe12b84d3c012", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/src/features/search/components/CommandPalette.tsx"}, "region": {"startLine": 872}}}]}, {"ruleId": "scanner-f520fa221cc627aa", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/src/features/editor/components/InlineTextBlockEditor.tsx:103"}, "properties": {"repobilityId": "0bdb8ffc6334d2c4", "scanner": "scanner-primary", "fingerprint": "f520fa221cc627aa", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/src/features/editor/components/InlineTextBlockEditor.tsx"}, "region": {"startLine": 103}}}]}, {"ruleId": "scanner-bb0c4eecef8d171b", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/web/src/features/sharing/QrShare.tsx:67"}, "properties": {"repobilityId": "8b6a6d05b3131c32", "scanner": "scanner-primary", "fingerprint": "bb0c4eecef8d171b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/src/features/sharing/QrShare.tsx"}, "region": {"startLine": 67}}}]}, {"ruleId": "scanner-43f066ea7e36fd83", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/05-ideal-graph/dynamicgraph.html:519"}, "properties": {"repobilityId": "b303c3984f5c40c2", "scanner": "scanner-primary", "fingerprint": "43f066ea7e36fd83", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/05-ideal-graph/dynamicgraph.html"}, "region": {"startLine": 519}}}]}, {"ruleId": "scanner-f46e319139f0ade5", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "7ff08766e8e5cf32", "scanner": "scanner-primary", "fingerprint": "f46e319139f0ade5", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/llm-docx-toolkit.yml"}, "region": {"startLine": 51}}}]}, {"ruleId": "scanner-f46e319139f0ade5", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "7ff08766e8e5cf32", "scanner": "scanner-primary", "fingerprint": "f46e319139f0ade5", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/llm-docx-toolkit.yml"}, "region": {"startLine": 112}}}]}, {"ruleId": "scanner-f46e319139f0ade5", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "f157a04fc261bf78", "scanner": "scanner-primary", "fingerprint": "f46e319139f0ade5", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/llm-docx-toolkit.yml"}, "region": {"startLine": 185}}}]}, {"ruleId": "scanner-f46e319139f0ade5", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "f157a04fc261bf78", "scanner": "scanner-primary", "fingerprint": "f46e319139f0ade5", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/llm-docx-toolkit.yml"}, "region": {"startLine": 271}}}]}, {"ruleId": "scanner-f46e319139f0ade5", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "423d62d05dbcaef8", "scanner": "scanner-primary", "fingerprint": "f46e319139f0ade5", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/llm-docx-toolkit.yml"}, "region": {"startLine": 279}}}]}, {"ruleId": "scanner-4a4f7686fbf3047c", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "0a324548f2a6ad23", "scanner": "scanner-primary", "fingerprint": "4a4f7686fbf3047c", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/llm-docx-toolkit.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ba1a714830c07247", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "fa6e9d531b99a253", "scanner": "scanner-primary", "fingerprint": "ba1a714830c07247", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/restore-drill.yml"}, "region": {"startLine": 178}}}]}, {"ruleId": "scanner-1188e10af72c94d7", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "d3f3e59a73c79d9b", "scanner": "scanner-primary", "fingerprint": "1188e10af72c94d7", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/zap.yml"}, "region": {"startLine": 35}}}]}, {"ruleId": "scanner-4d88a59e11a4a9d7", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "bba2dc4f932bfe3e", "scanner": "scanner-primary", "fingerprint": "4d88a59e11a4a9d7", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/apptainer-build.yml"}, "region": {"startLine": 40}}}]}, {"ruleId": "scanner-65c9bd56493a81d3", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "8e879d8d5d310b9f", "scanner": "scanner-primary", "fingerprint": "65c9bd56493a81d3", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/e2e.yml"}, "region": {"startLine": 120}}}]}, {"ruleId": "scanner-65c9bd56493a81d3", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "8e879d8d5d310b9f", "scanner": "scanner-primary", "fingerprint": "65c9bd56493a81d3", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/e2e.yml"}, "region": {"startLine": 129}}}]}, {"ruleId": "scanner-cb639d9a10a47b23", "level": "note", "message": {"text": "package.json defines install-time lifecycle scripts"}, "properties": {"repobilityId": "b86179956da3a4a8", "scanner": "scanner-primary", "fingerprint": "cb639d9a10a47b23", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "npm", "install-scripts"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b0a50056beae21bd", "level": "note", "message": {"text": "Very large file: apps/api/app/services/document_service.py (2034 lines)"}, "properties": {"repobilityId": "cdf4cd074ac37cdc", "scanner": "scanner-primary", "fingerprint": "b0a50056beae21bd", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-10580330e73932fe", "level": "note", "message": {"text": "Very large file: apps/api/app/services/pptx_export.py (1635 lines)"}, "properties": {"repobilityId": "00a4542b43ab81a7", "scanner": "scanner-primary", "fingerprint": "10580330e73932fe", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-32c40a6638f2bc72", "level": "note", "message": {"text": "Very large file: apps/api/app/services/docx_import.py (2303 lines)"}, "properties": {"repobilityId": "7ddbeb966bffb16d", "scanner": "scanner-primary", "fingerprint": "32c40a6638f2bc72", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-48701adfa9f4b90b", "level": "note", "message": {"text": "Very large file: apps/api/app/services/widget_markers.py (1991 lines)"}, "properties": {"repobilityId": "e779a1231aa00d3f", "scanner": "scanner-primary", "fingerprint": "48701adfa9f4b90b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-273c27d3c9ad78d1", "level": "note", "message": {"text": "Very large file: apps/api/app/services/docx_export.py (1795 lines)"}, "properties": {"repobilityId": "538e4276b9a1d838", "scanner": "scanner-primary", "fingerprint": "273c27d3c9ad78d1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-8397fd90ac73da8f", "level": "note", "message": {"text": "Very large file: apps/api/app/services/html_renderer.py (1402 lines)"}, "properties": {"repobilityId": "c684f965124ed62a", "scanner": "scanner-primary", "fingerprint": "8397fd90ac73da8f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-bd696ca8c2f6ce9d", "level": "note", "message": {"text": "Very large file: apps/api/app/schemas/document.py (2738 lines)"}, "properties": {"repobilityId": "0d554525d42b9545", "scanner": "scanner-primary", "fingerprint": "bd696ca8c2f6ce9d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-0827a301ebe50b6c", "level": "note", "message": {"text": "Very large file: apps/web/src/lib/i18n/ko.ts (1084 lines)"}, "properties": {"repobilityId": "8389925170efdaf6", "scanner": "scanner-primary", "fingerprint": "0827a301ebe50b6c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-8e255830711d1346", "level": "note", "message": {"text": "Very large file: apps/web/src/features/editor/blocks/ChartBlockEditor.tsx (2065 lines)"}, "properties": {"repobilityId": "05d851ca79df655d", "scanner": "scanner-primary", "fingerprint": "8e255830711d1346", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-5d0f655c7d0a4372", "level": "note", "message": {"text": "Very large file: apps/web/src/features/graph/components/KnowledgeGraph.tsx (1344 lines)"}, "properties": {"repobilityId": "34d04488c3b1e685", "scanner": "scanner-primary", "fingerprint": "5d0f655c7d0a4372", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "b939a2cb5d37764f", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-4a9eb7dc7c6e3880", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: apps/web/package.json"}, "properties": {"repobilityId": "6c1704bf24cf19ac", "scanner": "scanner-primary", "fingerprint": "4a9eb7dc7c6e3880", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2699d5f16ae11282", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: packages/shared/package.json"}, "properties": {"repobilityId": "37ac218a4ef9b430", "scanner": "scanner-primary", "fingerprint": "2699d5f16ae11282", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/shared/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "02045ac6088f973f", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "73f245cbae0e1ab4", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "f7796cbf2b2fd2d4", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "a02e1b82ecf4c389", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "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": "5533c5b8951b30d8", "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": "dc9a15217a0ef450", "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": "be4bd73f6805380e", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-921eb829a3f639c6", "level": "note", "message": {"text": "Legacy-named symbol `skipped_old` in integrations/aidatahub/aidatahub_sync.py:329"}, "properties": {"repobilityId": "4b7375acdfb74fc6", "scanner": "scanner-primary", "fingerprint": "921eb829a3f639c6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-110dfd4c05b1150c", "level": "note", "message": {"text": "Legacy-named symbol `run_backup` in apps/api/tests/test_backups.py:1"}, "properties": {"repobilityId": "7867b9420c42d467", "scanner": "scanner-primary", "fingerprint": "110dfd4c05b1150c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-47850eccfad7215f", "level": "note", "message": {"text": "Legacy-named symbol `allow_backup` in apps/api/tests/test_totp.py:394"}, "properties": {"repobilityId": "d120640a0e351c36", "scanner": "scanner-primary", "fingerprint": "47850eccfad7215f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-3d8790551248a973", "level": "note", "message": {"text": "Legacy-named symbol `list_objects_v2` in apps/api/tests/test_uploads.py:63"}, "properties": {"repobilityId": "3cd0a34bcc5fb7c3", "scanner": "scanner-primary", "fingerprint": "3d8790551248a973", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ebdf5c45b9542b1f", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/tests/test_h8_h9_perf.py:176"}, "properties": {"repobilityId": "8919413e1fcc6a8a", "scanner": "scanner-primary", "fingerprint": "ebdf5c45b9542b1f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fd0678671f0c9184", "level": "note", "message": {"text": "Legacy-named symbol `test_select_versions_keeps_head_and_v1` in apps/api/tests/test_maintenance.py:60"}, "properties": {"repobilityId": "2ed366f5dd797bb1", "scanner": "scanner-primary", "fingerprint": "fd0678671f0c9184", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-aad7547986465a11", "level": "note", "message": {"text": "Legacy-named symbol `token_old` in apps/api/tests/test_api_tokens.py:182"}, "properties": {"repobilityId": "abf023159514c0bc", "scanner": "scanner-primary", "fingerprint": "aad7547986465a11", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-337bb4639e0b8897", "level": "note", "message": {"text": "Legacy-named symbol `r_login_old` in apps/api/tests/test_auth_flows.py:327"}, "properties": {"repobilityId": "3f4d787f8d038b68", "scanner": "scanner-primary", "fingerprint": "337bb4639e0b8897", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-0d0907e99acad319", "level": "none", "message": {"text": "Commented-code block (8 lines) in apps/api/app/middleware/security.py:165"}, "properties": {"repobilityId": "3b22c1cba6680603", "scanner": "scanner-primary", "fingerprint": "0d0907e99acad319", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1acecb622591cff9", "level": "none", "message": {"text": "Commented-code block (9 lines) in apps/api/app/search/meili_indexer.py:30"}, "properties": {"repobilityId": "6c11133b9f7b6380", "scanner": "scanner-primary", "fingerprint": "1acecb622591cff9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6ca61ea735615883", "level": "note", "message": {"text": "Legacy-named symbol `run_backup` in apps/api/app/services/backup_runner.py:148"}, "properties": {"repobilityId": "6c29be55165e8505", "scanner": "scanner-primary", "fingerprint": "6ca61ea735615883", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-12526db7cc4a34ed", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/app/services/css_sanitizer.py:43"}, "properties": {"repobilityId": "03d0c4191adfa683", "scanner": "scanner-primary", "fingerprint": "12526db7cc4a34ed", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-10783c05a05c77a4", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/app/services/docx_import.py:124"}, "properties": {"repobilityId": "872a444314c7fde7", "scanner": "scanner-primary", "fingerprint": "10783c05a05c77a4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6b35583ec05dbc66", "level": "note", "message": {"text": "Legacy-named symbol `list_objects_v2` in apps/api/app/services/upload_service.py:369"}, "properties": {"repobilityId": "34094a2855802842", "scanner": "scanner-primary", "fingerprint": "6b35583ec05dbc66", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-98804c85bdc8d483", "level": "note", "message": {"text": "Stub function `_noop` (body is just `pass`/`return`) \u2014 apps/api/app/services/pptx_import.py:362"}, "properties": {"repobilityId": "57ce6ffec129b73d", "scanner": "scanner-primary", "fingerprint": "98804c85bdc8d483", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "empty-handler", "dead-code"]}}, {"ruleId": "scanner-a6573894c8b0fb9a", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/app/services/signup_service.py:136"}, "properties": {"repobilityId": "edcd1421fce933cd", "scanner": "scanner-primary", "fingerprint": "a6573894c8b0fb9a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-78b1abaad17cd18e", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/app/services/widget_markers.py:650"}, "properties": {"repobilityId": "09eba849b44430b0", "scanner": "scanner-primary", "fingerprint": "78b1abaad17cd18e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-470e697059fd9d12", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/app/services/docx_export.py:335"}, "properties": {"repobilityId": "193a29ae1c5fe11b", "scanner": "scanner-primary", "fingerprint": "470e697059fd9d12", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-21141644bf0bd7cc", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/app/services/html_renderer.py:129"}, "properties": {"repobilityId": "03a966c5070470ca", "scanner": "scanner-primary", "fingerprint": "21141644bf0bd7cc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-384c28d0b52a7a6e", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/api/app/services/automation_cron.py:188"}, "properties": {"repobilityId": "af7d822bffbbd973", "scanner": "scanner-primary", "fingerprint": "384c28d0b52a7a6e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fd543ff5ecd22a80", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/app/core/config.py:46"}, "properties": {"repobilityId": "d17c6bb584e3f5e5", "scanner": "scanner-primary", "fingerprint": "fd543ff5ecd22a80", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9de8c47863bb802d", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/app/routers/widgets.py:169"}, "properties": {"repobilityId": "83c865900c55af52", "scanner": "scanner-primary", "fingerprint": "9de8c47863bb802d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d08cd96de1475150", "level": "note", "message": {"text": "Legacy-named symbol `list_objects_v2` in apps/api/app/routers/health_dashboard.py:120"}, "properties": {"repobilityId": "66b8bf3e1d26af69", "scanner": "scanner-primary", "fingerprint": "d08cd96de1475150", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-2dda80bc544cca22", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/app/routers/auth.py:41"}, "properties": {"repobilityId": "b02ef0d2a5bc0140", "scanner": "scanner-primary", "fingerprint": "2dda80bc544cca22", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5c4e41fafb6ff8f0", "level": "note", "message": {"text": "Legacy-named symbol `run_backup` in apps/api/app/routers/backups.py:35"}, "properties": {"repobilityId": "1118b4b37b598b76", "scanner": "scanner-primary", "fingerprint": "5c4e41fafb6ff8f0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-4f0e624b3a5c0ea1", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/app/routers/documents.py:460"}, "properties": {"repobilityId": "1518c4e7d1e95c71", "scanner": "scanner-primary", "fingerprint": "4f0e624b3a5c0ea1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-99e538cc99540acc", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/app/routers/imports.py:816"}, "properties": {"repobilityId": "8ae26ef5378f1352", "scanner": "scanner-primary", "fingerprint": "99e538cc99540acc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3033c6fc54ed79ec", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/app/routers/doc_templates.py:489"}, "properties": {"repobilityId": "e9580ac3059f7cbe", "scanner": "scanner-primary", "fingerprint": "3033c6fc54ed79ec", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-26ec43c02c4408a3", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/app/routers/approvals.py:473"}, "properties": {"repobilityId": "296c95a2e6cecbc1", "scanner": "scanner-primary", "fingerprint": "26ec43c02c4408a3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bb05038944e6a2c5", "level": "note", "message": {"text": "Legacy-named symbol `code_or_backup` in apps/api/app/routers/two_factor.py:17"}, "properties": {"repobilityId": "ed7648b597879ceb", "scanner": "scanner-primary", "fingerprint": "bb05038944e6a2c5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a11a98acdbccac84", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/vite.config.ts:57"}, "properties": {"repobilityId": "b2e8f6fc557827ce", "scanner": "scanner-primary", "fingerprint": "a11a98acdbccac84", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e1a0c9a18b189160", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/web/tailwind.config.js:26"}, "properties": {"repobilityId": "9a23183578bec792", "scanner": "scanner-primary", "fingerprint": "e1a0c9a18b189160", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2fb9c77c48092274", "level": "none", "message": {"text": "Commented-code block (11 lines) in apps/web/eslint.config.js:4"}, "properties": {"repobilityId": "9f4b330db106260a", "scanner": "scanner-primary", "fingerprint": "2fb9c77c48092274", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9ed2632222489c3f", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/tests/e2e/navigate-and-read.spec.ts:10"}, "properties": {"repobilityId": "e612d83793cdc13c", "scanner": "scanner-primary", "fingerprint": "9ed2632222489c3f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-54c96ff7e409d744", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/tests/e2e/create-and-edit.spec.ts:16"}, "properties": {"repobilityId": "81df8b69379ae3f5", "scanner": "scanner-primary", "fingerprint": "54c96ff7e409d744", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-524c0e189455279b", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/components/WikiArticle.tsx:101"}, "properties": {"repobilityId": "34ea91ec56b6fe1f", "scanner": "scanner-primary", "fingerprint": "524c0e189455279b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3a3d7cbbc6e243bd", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/components/SectionRenderer.tsx:82"}, "properties": {"repobilityId": "c2a8bc972600d0d1", "scanner": "scanner-primary", "fingerprint": "3a3d7cbbc6e243bd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3e83616c4acc7c6d", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/src/components/layout/TopBar.tsx:80"}, "properties": {"repobilityId": "0e12d8d5daf46d67", "scanner": "scanner-primary", "fingerprint": "3e83616c4acc7c6d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0acc15ba982e843f", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/components/wiki/WikiLink.tsx:111"}, "properties": {"repobilityId": "ad4e886cdc3f6fa2", "scanner": "scanner-primary", "fingerprint": "0acc15ba982e843f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4e454eb3bee18034", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/components/wiki/Inline.tsx:227"}, "properties": {"repobilityId": "02edcc5b7deda66c", "scanner": "scanner-primary", "fingerprint": "4e454eb3bee18034", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ab98a0d2c533ca2a", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/src/components/wiki/__tests__/LinkPreview.test.tsx:109"}, "properties": {"repobilityId": "e58b2333dafa81b5", "scanner": "scanner-primary", "fingerprint": "ab98a0d2c533ca2a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2d52dd621880bc20", "level": "none", "message": {"text": "Commented-code block (9 lines) in apps/web/src/components/blocks/BlockRenderer.tsx:193"}, "properties": {"repobilityId": "5c71c61519993aaf", "scanner": "scanner-primary", "fingerprint": "2d52dd621880bc20", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ce17e27d69745c68", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/src/components/blocks/PivotTableBlock.tsx:37"}, "properties": {"repobilityId": "59eb466b0a7a17a4", "scanner": "scanner-primary", "fingerprint": "ce17e27d69745c68", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ee34f0fcfe9df3de", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/components/blocks/WidgetExportMenu.tsx:85"}, "properties": {"repobilityId": "a4670b9f34e89112", "scanner": "scanner-primary", "fingerprint": "ee34f0fcfe9df3de", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ae19cdbdbf36b9bd", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/components/blocks/pivotEngine.ts:349"}, "properties": {"repobilityId": "bd49a01cc955d6d1", "scanner": "scanner-primary", "fingerprint": "ae19cdbdbf36b9bd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-87f11fc4faaf215c", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/components/blocks/ChartBlock.tsx:213"}, "properties": {"repobilityId": "e028741b317cc34b", "scanner": "scanner-primary", "fingerprint": "87f11fc4faaf215c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d9fb2b98b9fb64d5", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/web/src/components/blocks/__tests__/AllBlocksDarkmode.test.ts:42"}, "properties": {"repobilityId": "dbb5d1cd0cb01a5e", "scanner": "scanner-primary", "fingerprint": "d9fb2b98b9fb64d5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0f62c86f5eb42e3f", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/components/blocks/__tests__/DrillExportControls.test.tsx:89"}, "properties": {"repobilityId": "6067604c207765de", "scanner": "scanner-primary", "fingerprint": "0f62c86f5eb42e3f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d85647738f7fc0d2", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/lib/urlDetect.ts:79"}, "properties": {"repobilityId": "ab6f9442c7594f12", "scanner": "scanner-primary", "fingerprint": "d85647738f7fc0d2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d9eaabfcde23efb9", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/pages/AdminGlossaryPending.tsx:170"}, "properties": {"repobilityId": "c2aaa182475abea2", "scanner": "scanner-primary", "fingerprint": "d9eaabfcde23efb9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5382fea513190b1c", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/pages/Presentation.tsx:120"}, "properties": {"repobilityId": "902b744673210563", "scanner": "scanner-primary", "fingerprint": "5382fea513190b1c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a4bf468cabeb5dd9", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/pages/Login.tsx:79"}, "properties": {"repobilityId": "d6277ace3566ea9f", "scanner": "scanner-primary", "fingerprint": "a4bf468cabeb5dd9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2f9fe61c6c41d96f", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/pages/__tests__/SharedDocView.test.tsx:47"}, "properties": {"repobilityId": "14825e21b220a9bd", "scanner": "scanner-primary", "fingerprint": "2f9fe61c6c41d96f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-26be609158a4b48f", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/pages/__tests__/Settings.test.tsx:145"}, "properties": {"repobilityId": "ebc7c6ec3665e92c", "scanner": "scanner-primary", "fingerprint": "26be609158a4b48f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c5056b5bb77f7a0e", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/features/search/components/CommandPalette.tsx:72"}, "properties": {"repobilityId": "190f98fe98f9c034", "scanner": "scanner-primary", "fingerprint": "c5056b5bb77f7a0e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-14d1eea6c7f03f2e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/features/search/hooks/useSearch.ts:32"}, "properties": {"repobilityId": "641f144a1d4d6687", "scanner": "scanner-primary", "fingerprint": "14d1eea6c7f03f2e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2ff67a9bcfdc9564", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/features/editor/connectionStore.ts:79"}, "properties": {"repobilityId": "401af71a6758c9c0", "scanner": "scanner-primary", "fingerprint": "2ff67a9bcfdc9564", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-603327147c7914f9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/features/editor/connectionStore.ts:84"}, "properties": {"repobilityId": "5532b917a75673d7", "scanner": "scanner-primary", "fingerprint": "603327147c7914f9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-63eb61ae8b0c7b8d", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/web/src/features/editor/state.ts:230"}, "properties": {"repobilityId": "c59f2919347dc629", "scanner": "scanner-primary", "fingerprint": "63eb61ae8b0c7b8d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1075af2e75e593e2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/features/editor/paste/imageRehydrate.ts:79"}, "properties": {"repobilityId": "d22eec49c1f07b12", "scanner": "scanner-primary", "fingerprint": "1075af2e75e593e2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ba14c49a03450030", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/features/editor/components/SlashCommandMenu.tsx:36"}, "properties": {"repobilityId": "59377003b46bb286", "scanner": "scanner-primary", "fingerprint": "ba14c49a03450030", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ac96989ba9daeef0", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/features/editor/components/OutlinePanel.tsx:137"}, "properties": {"repobilityId": "9d51e476ef6d8a08", "scanner": "scanner-primary", "fingerprint": "ac96989ba9daeef0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-076f8bcd97dc3924", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/src/features/editor/components/InlineTextBlockEditor.tsx:83"}, "properties": {"repobilityId": "4dad7c5b195dc43f", "scanner": "scanner-primary", "fingerprint": "076f8bcd97dc3924", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c8cea5a0aad748fa", "level": "none", "message": {"text": "Commented-code block (11 lines) in apps/web/src/features/editor/components/SimpleStackEditor.tsx:422"}, "properties": {"repobilityId": "eab88a1ad1b672a3", "scanner": "scanner-primary", "fingerprint": "c8cea5a0aad748fa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e42a12afbec7ca6d", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/src/features/editor/components/BlockInsertPalette.tsx:492"}, "properties": {"repobilityId": "29fca9d78a01b97a", "scanner": "scanner-primary", "fingerprint": "e42a12afbec7ca6d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fce0240947888c1d", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/web/src/features/editor/components/ConflictMergeModal.tsx:82"}, "properties": {"repobilityId": "220865615f5745e1", "scanner": "scanner-primary", "fingerprint": "fce0240947888c1d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a0e18b8ebbb56618", "level": "none", "message": {"text": "Commented-code block (10 lines) in apps/web/src/features/editor/components/__tests__/LazyBlockSlot.test.tsx:69"}, "properties": {"repobilityId": "1e3ed69ddeb322a6", "scanner": "scanner-primary", "fingerprint": "a0e18b8ebbb56618", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cff2bbff9cb7a609", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/features/editor/hooks/useAutoSave.ts:280"}, "properties": {"repobilityId": "6f54a2eef1914151", "scanner": "scanner-primary", "fingerprint": "cff2bbff9cb7a609", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8d251196bd6b9e66", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/web/src/features/editor/blocks/ImageAnnotationBlockEditor.tsx:385"}, "properties": {"repobilityId": "10f6bd47bea05b90", "scanner": "scanner-primary", "fingerprint": "8d251196bd6b9e66", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-95500d7e13d8020a", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/features/editor/blocks/zebra.ts:37"}, "properties": {"repobilityId": "7122e711fcbaa8a8", "scanner": "scanner-primary", "fingerprint": "95500d7e13d8020a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-54445c0f149d4ac4", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/src/features/editor/blocks/TableBlockEditor.tsx:223"}, "properties": {"repobilityId": "e9edb331e4822344", "scanner": "scanner-primary", "fingerprint": "54445c0f149d4ac4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b8f5bf3937ae9632", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/features/editor/blocks/__tests__/tableCells.test.ts:52"}, "properties": {"repobilityId": "6c095846f2f319f0", "scanner": "scanner-primary", "fingerprint": "b8f5bf3937ae9632", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e7c85d52a2b09950", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/src/features/editor/blocks/__tests__/CellBlockEditor.test.tsx:16"}, "properties": {"repobilityId": "91b740995d5ea267", "scanner": "scanner-primary", "fingerprint": "e7c85d52a2b09950", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-eab112eff1204af6", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/features/editor/blocks/spreadsheet/__tests__/referenceShift.test.ts:201"}, "properties": {"repobilityId": "0e1cded367c1573d", "scanner": "scanner-primary", "fingerprint": "eab112eff1204af6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c2a55e8a1daca37b", "level": "none", "message": {"text": "Commented-code block (10 lines) in apps/web/src/features/presentation/slideMachine.ts:67"}, "properties": {"repobilityId": "1f1850acc473b533", "scanner": "scanner-primary", "fingerprint": "c2a55e8a1daca37b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-002aca384297149a", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/features/graph/components/KnowledgeGraph.tsx:753"}, "properties": {"repobilityId": "bc01ad86d1eef7f3", "scanner": "scanner-primary", "fingerprint": "002aca384297149a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e5e77b304fa206ca", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/shared/codegen/generate-ts.mjs:33"}, "properties": {"repobilityId": "537ffa9ff9a7e70c", "scanner": "scanner-primary", "fingerprint": "e5e77b304fa206ca", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-34fa285f792c4e9f", "level": "note", "message": {"text": "Legacy-named symbol `pydantic_v2` in packages/shared/codegen/generate-py.py:51"}, "properties": {"repobilityId": "28ae4d820b246d09", "scanner": "scanner-primary", "fingerprint": "34fa285f792c4e9f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-4a43436ac453a4ee", "level": "none", "message": {"text": "Commented-code block (7 lines) in packages/shared/codegen/generate-py.py:33"}, "properties": {"repobilityId": "29a246db98ae84f2", "scanner": "scanner-primary", "fingerprint": "4a43436ac453a4ee", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2d970e577cdcd040", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 examples/namu-archive-bulk/post-link.py:219"}, "properties": {"repobilityId": "2dfb067188ea7e6e", "scanner": "scanner-primary", "fingerprint": "2d970e577cdcd040", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9a82cf7d16234d20", "level": "note", "message": {"text": "21 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "2fad2cbef136ee78", "scanner": "scanner-primary", "fingerprint": "9a82cf7d16234d20", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "bcaa5bac60cbae33", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-02525d39071dd2c7", "level": "note", "message": {"text": "Near-duplicate function bodies in 5 places"}, "properties": {"repobilityId": "fa84a6d350015601", "scanner": "scanner-primary", "fingerprint": "02525d39071dd2c7", "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": "6e23e2ed9888bf2a", "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": "2b27abe5f529d41c", "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": "c28191427842df06", "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": "760ece3ac21433d3", "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": "8f853e48c128798a", "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": "245cc350ffe823c6", "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": "a8d1470ea03889da", "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": "42d9b8114cc2cbd7", "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": "efab3e74c8f65a55", "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": "c9a2dd0500baca74", "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": "16b09af778196262", "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": "a019808ae1d0cf84", "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": "df97faef759e3b03", "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": "f5fa0a67561b1db6", "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": "f83ff2d37e127320", "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": "66f50beef5e47cf2", "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": "46f6e7828923f179", "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": "4fc2a9dbe738eb29", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-9ffd3da9e6da7990", "level": "warning", "message": {"text": "Frontend route `/auth/verify` has no Link/navigate to it \u2014 apps/web/src/pages/__tests__/EmailVerify.test.tsx"}, "properties": {"repobilityId": "68f106948ce94a8a", "scanner": "scanner-primary", "fingerprint": "9ffd3da9e6da7990", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-21ccc24f176f3d5a", "level": "warning", "message": {"text": "Frontend route `/auth/reset` has no Link/navigate to it \u2014 apps/web/src/pages/__tests__/ResetPassword.test.tsx"}, "properties": {"repobilityId": "882b164ce87eceb9", "scanner": "scanner-primary", "fingerprint": "21ccc24f176f3d5a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-cb8165b9e443f504", "level": "warning", "message": {"text": "Frontend route `/share/:token` has no Link/navigate to it \u2014 apps/web/src/pages/__tests__/SharedDocView.test.tsx"}, "properties": {"repobilityId": "ed218a2d9dd5e03b", "scanner": "scanner-primary", "fingerprint": "cb8165b9e443f504", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-8de2276b5efcc024", "level": "warning", "message": {"text": "Frontend route `/present/:slug` has no Link/navigate to it \u2014 apps/web/src/features/presentation/__tests__/Presentation.theme.test.tsx"}, "properties": {"repobilityId": "e6e3fba9a214ed88", "scanner": "scanner-primary", "fingerprint": "8de2276b5efcc024", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-63531e7df488aae0", "level": "warning", "message": {"text": "Frontend route `/present/:slug/notes` has no Link/navigate to it \u2014 apps/web/src/features/presentation/__tests__/PresenterView.test.tsx"}, "properties": {"repobilityId": "67354eea5342992d", "scanner": "scanner-primary", "fingerprint": "63531e7df488aae0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-de87aa6d75afd154", "level": "warning", "message": {"text": "Frontend route `docs/new` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "properties": {"repobilityId": "17241993d7febbe3", "scanner": "scanner-primary", "fingerprint": "de87aa6d75afd154", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-78157d97fe4e4f0f", "level": "warning", "message": {"text": "Frontend route `docs/import` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "properties": {"repobilityId": "ec7f1faa35bd45dd", "scanner": "scanner-primary", "fingerprint": "78157d97fe4e4f0f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-ed3520a5b7456cdc", "level": "warning", "message": {"text": "Frontend route `docs/:slug` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "properties": {"repobilityId": "cc4d40abcb6be61c", "scanner": "scanner-primary", "fingerprint": "ed3520a5b7456cdc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f71549796697bf5b", "level": "warning", "message": {"text": "Frontend route `docs/:slug/variables` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "properties": {"repobilityId": "602064b8e273c36c", "scanner": "scanner-primary", "fingerprint": "f71549796697bf5b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-ca20c673f1d23121", "level": "warning", "message": {"text": "Frontend route `docs/:slug/custom-css` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "properties": {"repobilityId": "d9b7fab2bede66dc", "scanner": "scanner-primary", "fingerprint": "ca20c673f1d23121", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-00b37faddfc4a6d8", "level": "warning", "message": {"text": "Frontend route `docs/:slug/versions/:from/diff/:to` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "properties": {"repobilityId": "026cd2ff9ba9bdd2", "scanner": "scanner-primary", "fingerprint": "00b37faddfc4a6d8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-cdfbbb88e8b483fc", "level": "warning", "message": {"text": "Frontend route `compare` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "properties": {"repobilityId": "59889e36527ca3fe", "scanner": "scanner-primary", "fingerprint": "cdfbbb88e8b483fc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-0da99fa0cbdb7c98", "level": "warning", "message": {"text": "Frontend route `orgs` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "properties": {"repobilityId": "bf92b999acd876db", "scanner": "scanner-primary", "fingerprint": "0da99fa0cbdb7c98", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-b0e14e6e13ccd2d1", "level": "warning", "message": {"text": "Frontend route `glossary` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "properties": {"repobilityId": "6be8ae0c5e68f054", "scanner": "scanner-primary", "fingerprint": "b0e14e6e13ccd2d1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d5a0e4d81273cf33", "level": "warning", "message": {"text": "Frontend route `admin/orgs` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "properties": {"repobilityId": "bcc6f4a932d4606b", "scanner": "scanner-primary", "fingerprint": "d5a0e4d81273cf33", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-ad0b372eaa51af96", "level": "warning", "message": {"text": "Frontend route `admin/dashboard` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "properties": {"repobilityId": "58d5632f1c3a1149", "scanner": "scanner-primary", "fingerprint": "ad0b372eaa51af96", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-502e7529291cba72", "level": "warning", "message": {"text": "Frontend route `admin/health` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "properties": {"repobilityId": "253628bf8ad7a54a", "scanner": "scanner-primary", "fingerprint": "502e7529291cba72", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d355536906fdfe80", "level": "warning", "message": {"text": "Frontend route `admin/import-csv` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "properties": {"repobilityId": "5489eeeb9600bac6", "scanner": "scanner-primary", "fingerprint": "d355536906fdfe80", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-3f62e8ce7cf4981e", "level": "warning", "message": {"text": "Frontend route `admin/archive` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "properties": {"repobilityId": "c9f340d0918063ad", "scanner": "scanner-primary", "fingerprint": "3f62e8ce7cf4981e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f5d48488176bea43", "level": "warning", "message": {"text": "Frontend route `admin/audit` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "properties": {"repobilityId": "8bd327aab0dcd0d6", "scanner": "scanner-primary", "fingerprint": "f5d48488176bea43", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e8c43fce81dfbbe4", "level": "warning", "message": {"text": "Frontend route `admin/audit-retention` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "properties": {"repobilityId": "605a4f4f46e8dacc", "scanner": "scanner-primary", "fingerprint": "e8c43fce81dfbbe4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-466c769f300d969c", "level": "warning", "message": {"text": "Frontend route `admin/backups` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "properties": {"repobilityId": "0e8460ae6755605a", "scanner": "scanner-primary", "fingerprint": "466c769f300d969c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-37d86ff59063bf03", "level": "warning", "message": {"text": "Frontend route `admin/tags` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "properties": {"repobilityId": "12f7127854d023ca", "scanner": "scanner-primary", "fingerprint": "37d86ff59063bf03", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-fc230f6c896d08bb", "level": "warning", "message": {"text": "Frontend route `admin/templates` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "properties": {"repobilityId": "ff971ddda196184a", "scanner": "scanner-primary", "fingerprint": "fc230f6c896d08bb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c9bc8d959c28aaa1", "level": "warning", "message": {"text": "Frontend route `admin/webhooks` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "properties": {"repobilityId": "85d297c683339377", "scanner": "scanner-primary", "fingerprint": "c9bc8d959c28aaa1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-69c5301e0753432b", "level": "warning", "message": {"text": "Frontend route `admin/automation` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "properties": {"repobilityId": "35f8de02cdd93238", "scanner": "scanner-primary", "fingerprint": "69c5301e0753432b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-076ff8441e2f4143", "level": "warning", "message": {"text": "Frontend route `admin/workflow-chains` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "properties": {"repobilityId": "d3fdd16cf1c91180", "scanner": "scanner-primary", "fingerprint": "076ff8441e2f4143", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-82472b0d16f36321", "level": "warning", "message": {"text": "Frontend route `admin/sso` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "properties": {"repobilityId": "ad812d4863e43dc9", "scanner": "scanner-primary", "fingerprint": "82472b0d16f36321", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-404189a127142c06", "level": "warning", "message": {"text": "Frontend route `admin/retention` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "properties": {"repobilityId": "aa22ffb9c068035d", "scanner": "scanner-primary", "fingerprint": "404189a127142c06", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-5d04b44c73d507d8", "level": "warning", "message": {"text": "Frontend route `admin/glossary-pending` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "properties": {"repobilityId": "1723153cdb3c8a52", "scanner": "scanner-primary", "fingerprint": "5d04b44c73d507d8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-75618a374a5bccf0", "level": "warning", "message": {"text": "Frontend route `analytics` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "properties": {"repobilityId": "6586b5a8498d8f2c", "scanner": "scanner-primary", "fingerprint": "75618a374a5bccf0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-7639e53eeefef008", "level": "warning", "message": {"text": "Frontend route `recent` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "properties": {"repobilityId": "34595686d6fee530", "scanner": "scanner-primary", "fingerprint": "7639e53eeefef008", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-90482bd7841185c8", "level": "warning", "message": {"text": "Frontend route `activity` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "properties": {"repobilityId": "501d94b2b37ccd94", "scanner": "scanner-primary", "fingerprint": "90482bd7841185c8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c15aa2b9a0c7ad22", "level": "warning", "message": {"text": "Frontend route `reads` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "properties": {"repobilityId": "691592cee68dfd40", "scanner": "scanner-primary", "fingerprint": "c15aa2b9a0c7ad22", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-6a2651d18bccdd5f", "level": "warning", "message": {"text": "Frontend route `reviews` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "properties": {"repobilityId": "12a19b3f33b6a35a", "scanner": "scanner-primary", "fingerprint": "6a2651d18bccdd5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e4131c07c231f3d6", "level": "warning", "message": {"text": "Frontend route `subscriptions` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "properties": {"repobilityId": "7d73f85ed7bb86ac", "scanner": "scanner-primary", "fingerprint": "e4131c07c231f3d6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-acc7be723b7f3093", "level": "warning", "message": {"text": "Frontend route `reminders` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "properties": {"repobilityId": "3f23a031c904d39e", "scanner": "scanner-primary", "fingerprint": "acc7be723b7f3093", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-0b2237ec0a4431ac", "level": "warning", "message": {"text": "Frontend route `views/:id` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "properties": {"repobilityId": "1c08c56802fa33da", "scanner": "scanner-primary", "fingerprint": "0b2237ec0a4431ac", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c6f1dbc54e4ba9aa", "level": "warning", "message": {"text": "Frontend route `settings` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "properties": {"repobilityId": "8a6ddd0ebe79d6ac", "scanner": "scanner-primary", "fingerprint": "c6f1dbc54e4ba9aa", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-3a595f3f7b19043f", "level": "warning", "message": {"text": "Frontend route `me/api-tokens` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "properties": {"repobilityId": "b349c66af20880cf", "scanner": "scanner-primary", "fingerprint": "3a595f3f7b19043f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-87026913a5f5c2dd", "level": "warning", "message": {"text": "Frontend route `me/2fa` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "properties": {"repobilityId": "03dbbd34473d7826", "scanner": "scanner-primary", "fingerprint": "87026913a5f5c2dd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-6097316d98fafb64", "level": "warning", "message": {"text": "Frontend route `snippets` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "properties": {"repobilityId": "ea466d36e5fd42be", "scanner": "scanner-primary", "fingerprint": "6097316d98fafb64", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-336fb3624e56541f", "level": "warning", "message": {"text": "Frontend route `series` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "properties": {"repobilityId": "2c4bc979240ca3b8", "scanner": "scanner-primary", "fingerprint": "336fb3624e56541f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c9810c588cdb0cc7", "level": "warning", "message": {"text": "Frontend route `series/:slug` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "properties": {"repobilityId": "1570a96e65b9f5b9", "scanner": "scanner-primary", "fingerprint": "c9810c588cdb0cc7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-6fe6f217bb314638", "level": "warning", "message": {"text": "Frontend route `graph` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "properties": {"repobilityId": "530fdf9405c02512", "scanner": "scanner-primary", "fingerprint": "6fe6f217bb314638", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-71fef1791f7ff980", "level": "warning", "message": {"text": "Frontend route `graph/all` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "properties": {"repobilityId": "26caf178ba9d0fe1", "scanner": "scanner-primary", "fingerprint": "71fef1791f7ff980", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-15fbed879843d116", "level": "warning", "message": {"text": "Frontend route `graph/:slug` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "properties": {"repobilityId": "0d9dda8d9fd61be4", "scanner": "scanner-primary", "fingerprint": "15fbed879843d116", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-bf375b3cdf6a9a32", "level": "warning", "message": {"text": "Frontend route `dep-graph` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "properties": {"repobilityId": "3c307f5e4aa2cfb4", "scanner": "scanner-primary", "fingerprint": "bf375b3cdf6a9a32", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e84fceb9ef4df493", "level": "warning", "message": {"text": "Frontend route `sigma-demo` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "properties": {"repobilityId": "9bfad7851717fba3", "scanner": "scanner-primary", "fingerprint": "e84fceb9ef4df493", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-12f74081494f76c6", "level": "warning", "message": {"text": "Frontend route `tags/:tag` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "properties": {"repobilityId": "e56e55f7b1cf2af9", "scanner": "scanner-primary", "fingerprint": "12f74081494f76c6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-6cefca095706516d", "level": "warning", "message": {"text": "Frontend route `category/:cat` has no Link/navigate to it \u2014 apps/web/src/main.tsx"}, "properties": {"repobilityId": "79a99a832dcd38c7", "scanner": "scanner-primary", "fingerprint": "6cefca095706516d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-edbb5ecb3f02fd24", "level": "warning", "message": {"text": "Frontend route `/*` has no Link/navigate to it \u2014 apps/web/src/components/__tests__/AuthGuard.test.tsx"}, "properties": {"repobilityId": "a75d6a967cfb8059", "scanner": "scanner-primary", "fingerprint": "edbb5ecb3f02fd24", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-777c8c8afc943c4c", "level": "warning", "message": {"text": "Frontend route `/docs/:slug/variables` has no Link/navigate to it \u2014 apps/web/src/pages/__tests__/DocumentVariables.test.tsx"}, "properties": {"repobilityId": "605e3a4e942d61b2", "scanner": "scanner-primary", "fingerprint": "777c8c8afc943c4c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e5e999ceab4f5d99", "level": "warning", "message": {"text": "Frontend route `/views/:id` has no Link/navigate to it \u2014 apps/web/src/pages/__tests__/SavedView.test.tsx"}, "properties": {"repobilityId": "a4e378ff0ac35bf6", "scanner": "scanner-primary", "fingerprint": "e5e999ceab4f5d99", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d163ce9d7e1ea586", "level": "warning", "message": {"text": "Frontend route `/me/2fa` has no Link/navigate to it \u2014 apps/web/src/pages/__tests__/TwoFactorSetup.test.tsx"}, "properties": {"repobilityId": "6cdf52620941549f", "scanner": "scanner-primary", "fingerprint": "d163ce9d7e1ea586", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a21e387a2b40ff46", "level": "warning", "message": {"text": "Frontend route `/docs/*` has no Link/navigate to it \u2014 apps/web/src/pages/__tests__/Login.test.tsx"}, "properties": {"repobilityId": "2d305aa4211d7142", "scanner": "scanner-primary", "fingerprint": "a21e387a2b40ff46", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-1a7efbbb5b4ffda9", "level": "warning", "message": {"text": "Frontend route `/docs/:slug/versions/:from/diff/:to` has no Link/navigate to it \u2014 apps/web/src/pages/__tests__/VersionDiff.test.tsx"}, "properties": {"repobilityId": "3aa764fca08f06d7", "scanner": "scanner-primary", "fingerprint": "1a7efbbb5b4ffda9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a3c2a444b0a1c97b", "level": "warning", "message": {"text": "Frontend route `/series/:slug` has no Link/navigate to it \u2014 apps/web/src/pages/__tests__/SeriesDetail.test.tsx"}, "properties": {"repobilityId": "830a302610b6d4cc", "scanner": "scanner-primary", "fingerprint": "a3c2a444b0a1c97b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a810a345a36538bf", "level": "error", "message": {"text": "FastAPI POST `portal_callback` without auth dependency \u2014 apps/api/app/routers/portal_sso.py:157"}, "properties": {"repobilityId": "603e5fd557578ddc", "scanner": "scanner-primary", "fingerprint": "a810a345a36538bf", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/app/routers/portal_sso.py"}, "region": {"startLine": 157}}}]}, {"ruleId": "scanner-af6acfb8c807f9f6", "level": "error", "message": {"text": "FastAPI POST `create_share_link` without auth dependency \u2014 apps/api/app/routers/sharing.py:128"}, "properties": {"repobilityId": "5468d9280673d508", "scanner": "scanner-primary", "fingerprint": "af6acfb8c807f9f6", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/app/routers/sharing.py"}, "region": {"startLine": 128}}}]}, {"ruleId": "scanner-687dfb1effe5c545", "level": "error", "message": {"text": "FastAPI POST `refresh` without auth dependency \u2014 apps/api/app/routers/auth.py:293"}, "properties": {"repobilityId": "7683c66cbcc4178c", "scanner": "scanner-primary", "fingerprint": "687dfb1effe5c545", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/app/routers/auth.py"}, "region": {"startLine": 293}}}]}, {"ruleId": "scanner-13e03512c3bfeacf", "level": "error", "message": {"text": "FastAPI POST `export_pptx` without auth dependency \u2014 apps/api/app/routers/exports.py:193"}, "properties": {"repobilityId": "1e6f9361f5f13202", "scanner": "scanner-primary", "fingerprint": "13e03512c3bfeacf", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/app/routers/exports.py"}, "region": {"startLine": 193}}}]}, {"ruleId": "scanner-cfa063a6db145852", "level": "error", "message": {"text": "FastAPI POST `<anonymous>` without auth dependency \u2014 apps/api/app/routers/exports.py:277"}, "properties": {"repobilityId": "9d0bdbd6c0e273d1", "scanner": "scanner-primary", "fingerprint": "cfa063a6db145852", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/app/routers/exports.py"}, "region": {"startLine": 277}}}]}, {"ruleId": "scanner-1e617faca420fb3b", "level": "error", "message": {"text": "FastAPI POST `verify_email` without auth dependency \u2014 apps/api/app/routers/auth_flows.py:172"}, "properties": {"repobilityId": "1852ac224ac4f45c", "scanner": "scanner-primary", "fingerprint": "1e617faca420fb3b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/app/routers/auth_flows.py"}, "region": {"startLine": 172}}}]}, {"ruleId": "scanner-b3d5adf05b306655", "level": "error", "message": {"text": "FastAPI POST `forgot_password` without auth dependency \u2014 apps/api/app/routers/auth_flows.py:195"}, "properties": {"repobilityId": "082d36d76bf13dfb", "scanner": "scanner-primary", "fingerprint": "b3d5adf05b306655", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/app/routers/auth_flows.py"}, "region": {"startLine": 195}}}]}, {"ruleId": "scanner-228a4dc48c8555ef", "level": "error", "message": {"text": "FastAPI POST `reset_password` without auth dependency \u2014 apps/api/app/routers/auth_flows.py:235"}, "properties": {"repobilityId": "5e7202153f6c2ddd", "scanner": "scanner-primary", "fingerprint": "228a4dc48c8555ef", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/app/routers/auth_flows.py"}, "region": {"startLine": 235}}}]}, {"ruleId": "scanner-59cd96cc8bfcaf1d", "level": "error", "message": {"text": "FastAPI POST `create_document` without auth dependency \u2014 apps/api/app/routers/documents.py:355"}, "properties": {"repobilityId": "d9f69972909fbd36", "scanner": "scanner-primary", "fingerprint": "59cd96cc8bfcaf1d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/app/routers/documents.py"}, "region": {"startLine": 355}}}]}, {"ruleId": "scanner-214752daf6b5b1df", "level": "error", "message": {"text": "FastAPI PUT `replace_document` without auth dependency \u2014 apps/api/app/routers/documents.py:397"}, "properties": {"repobilityId": "ec4e3ebd8fc7ae3c", "scanner": "scanner-primary", "fingerprint": "214752daf6b5b1df", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/app/routers/documents.py"}, "region": {"startLine": 397}}}]}, {"ruleId": "scanner-a2aa4f58838e5dc4", "level": "error", "message": {"text": "FastAPI PATCH `patch_title` without auth dependency \u2014 apps/api/app/routers/documents.py:561"}, "properties": {"repobilityId": "457937903c4be773", "scanner": "scanner-primary", "fingerprint": "a2aa4f58838e5dc4", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/app/routers/documents.py"}, "region": {"startLine": 561}}}]}, {"ruleId": "scanner-c4bc8ee80a3ff2f7", "level": "error", "message": {"text": "FastAPI PATCH `patch_infobox` without auth dependency \u2014 apps/api/app/routers/documents.py:610"}, "properties": {"repobilityId": "978b519f1f546a98", "scanner": "scanner-primary", "fingerprint": "c4bc8ee80a3ff2f7", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/app/routers/documents.py"}, "region": {"startLine": 610}}}]}, {"ruleId": "scanner-413b666f194a79b8", "level": "error", "message": {"text": "FastAPI PATCH `patch_variables` without auth dependency \u2014 apps/api/app/routers/documents.py:653"}, "properties": {"repobilityId": "8c6727e1066c423e", "scanner": "scanner-primary", "fingerprint": "413b666f194a79b8", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/app/routers/documents.py"}, "region": {"startLine": 653}}}]}, {"ruleId": "scanner-8eebb305867764ef", "level": "error", "message": {"text": "FastAPI PATCH `patch_custom_css` without auth dependency \u2014 apps/api/app/routers/documents.py:695"}, "properties": {"repobilityId": "0b1f77a0390d8d00", "scanner": "scanner-primary", "fingerprint": "8eebb305867764ef", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/app/routers/documents.py"}, "region": {"startLine": 695}}}]}, {"ruleId": "scanner-e703515b471cb31a", "level": "error", "message": {"text": "FastAPI PATCH `patch_section` without auth dependency \u2014 apps/api/app/routers/documents.py:741"}, "properties": {"repobilityId": "e41f1288dd04aacc", "scanner": "scanner-primary", "fingerprint": "e703515b471cb31a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/app/routers/documents.py"}, "region": {"startLine": 741}}}]}, {"ruleId": "scanner-e873b3020ee389f1", "level": "error", "message": {"text": "FastAPI PATCH `patch_block` without auth dependency \u2014 apps/api/app/routers/documents.py:782"}, "properties": {"repobilityId": "4b40febd930d827a", "scanner": "scanner-primary", "fingerprint": "e873b3020ee389f1", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/app/routers/documents.py"}, "region": {"startLine": 782}}}]}, {"ruleId": "scanner-561a0c2faaf80433", "level": "error", "message": {"text": "FastAPI POST `insert_block` without auth dependency \u2014 apps/api/app/routers/documents.py:822"}, "properties": {"repobilityId": "c1967b3c3ce628db", "scanner": "scanner-primary", "fingerprint": "561a0c2faaf80433", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/app/routers/documents.py"}, "region": {"startLine": 822}}}]}, {"ruleId": "scanner-94d319ef1a0604cf", "level": "error", "message": {"text": "FastAPI POST `move_block` without auth dependency \u2014 apps/api/app/routers/documents.py:897"}, "properties": {"repobilityId": "2db141abeb557afa", "scanner": "scanner-primary", "fingerprint": "94d319ef1a0604cf", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/app/routers/documents.py"}, "region": {"startLine": 897}}}]}, {"ruleId": "scanner-1144e6c254791217", "level": "error", "message": {"text": "FastAPI POST `reorder_sections` without auth dependency \u2014 apps/api/app/routers/documents.py:945"}, "properties": {"repobilityId": "9353c331fbc8b787", "scanner": "scanner-primary", "fingerprint": "1144e6c254791217", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/app/routers/documents.py"}, "region": {"startLine": 945}}}]}, {"ruleId": "scanner-6b72dc84a0510fed", "level": "error", "message": {"text": "FastAPI POST `roundtrip_docx_endpoint` without auth dependency \u2014 apps/api/app/routers/imports.py:395"}, "properties": {"repobilityId": "4d7ee4cfb42d2e22", "scanner": "scanner-primary", "fingerprint": "6b72dc84a0510fed", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/app/routers/imports.py"}, "region": {"startLine": 395}}}]}, {"ruleId": "scanner-102d0b1e6bc07c76", "level": "error", "message": {"text": "FastAPI POST `import_csv` without auth dependency \u2014 apps/api/app/routers/imports.py:754"}, "properties": {"repobilityId": "3df6b3825ae7f409", "scanner": "scanner-primary", "fingerprint": "102d0b1e6bc07c76", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/app/routers/imports.py"}, "region": {"startLine": 754}}}]}, {"ruleId": "scanner-e51dc4162dd91707", "level": "note", "message": {"text": "Unused endpoint: GET /api/v1/healthz"}, "properties": {"repobilityId": "11cd56cabec2e0e5", "scanner": "scanner-primary", "fingerprint": "e51dc4162dd91707", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "218e2ec754a132b8", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-41ceaf31df46f630", "level": "note", "message": {"text": "Unused endpoint: POST /{nid}/read"}, "properties": {"repobilityId": "cef63c0d041d3d0f", "scanner": "scanner-primary", "fingerprint": "41ceaf31df46f630", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ed9dddf7a9fcd5ff", "level": "note", "message": {"text": "Unused endpoint: GET /admin/audit-retention"}, "properties": {"repobilityId": "6849b90c3b16b22b", "scanner": "scanner-primary", "fingerprint": "ed9dddf7a9fcd5ff", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a7c6955e9653f3b9", "level": "note", "message": {"text": "Unused endpoint: PATCH /admin/audit-retention"}, "properties": {"repobilityId": "d9f25efd8f06621b", "scanner": "scanner-primary", "fingerprint": "a7c6955e9653f3b9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-04878ddb98c19ca0", "level": "note", "message": {"text": "Unused endpoint: POST /admin/audit-retention/prune-now"}, "properties": {"repobilityId": "1b734aef0657dd09", "scanner": "scanner-primary", "fingerprint": "04878ddb98c19ca0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f7d09660dd5f4516", "level": "note", "message": {"text": "Unused endpoint: POST /admin/retention-policies"}, "properties": {"repobilityId": "45d36992ae13e7ac", "scanner": "scanner-primary", "fingerprint": "f7d09660dd5f4516", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3aa07520913ffe38", "level": "note", "message": {"text": "Unused endpoint: GET /admin/retention-policies"}, "properties": {"repobilityId": "ae197ede1a792f6f", "scanner": "scanner-primary", "fingerprint": "3aa07520913ffe38", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-58d901b2f06daf24", "level": "note", "message": {"text": "Unused endpoint: GET /admin/retention-policies/{policy_id}"}, "properties": {"repobilityId": "0da2b48c859e32be", "scanner": "scanner-primary", "fingerprint": "58d901b2f06daf24", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ecbe2884b38c571d", "level": "note", "message": {"text": "Unused endpoint: PATCH /admin/retention-policies/{policy_id}"}, "properties": {"repobilityId": "383052198fac39d9", "scanner": "scanner-primary", "fingerprint": "ecbe2884b38c571d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-24c4a6edc7167590", "level": "note", "message": {"text": "Unused endpoint: DELETE /admin/retention-policies/{policy_id}"}, "properties": {"repobilityId": "a8d17049724c8c3c", "scanner": "scanner-primary", "fingerprint": "24c4a6edc7167590", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-738ed66a6785fa16", "level": "note", "message": {"text": "Unused endpoint: POST /admin/retention-policies/{policy_id}/dry-run"}, "properties": {"repobilityId": "e860314e5c23c9b9", "scanner": "scanner-primary", "fingerprint": "738ed66a6785fa16", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e77fed0d7e45b801", "level": "note", "message": {"text": "Unused endpoint: POST /admin/retention-policies/{policy_id}/run"}, "properties": {"repobilityId": "f48ea7032c792cb6", "scanner": "scanner-primary", "fingerprint": "e77fed0d7e45b801", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d585f36aef259b97", "level": "note", "message": {"text": "Unused endpoint: GET /admin/retention-policies/{policy_id}/runs"}, "properties": {"repobilityId": "af5486360071bff4", "scanner": "scanner-primary", "fingerprint": "d585f36aef259b97", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-359f35937bed4935", "level": "note", "message": {"text": "Unused endpoint: GET /registry"}, "properties": {"repobilityId": "18c86f671d322102", "scanner": "scanner-primary", "fingerprint": "359f35937bed4935", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4a8a5c643de598ea", "level": "note", "message": {"text": "Unused endpoint: GET /kpi/{key:path}"}, "properties": {"repobilityId": "5a7c22f1599ddd3e", "scanner": "scanner-primary", "fingerprint": "4a8a5c643de598ea", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-085b2a56bd4f702d", "level": "note", "message": {"text": "Unused endpoint: GET /kpi-finance-daily-summary"}, "properties": {"repobilityId": "0181afdbd3f2f9a2", "scanner": "scanner-primary", "fingerprint": "085b2a56bd4f702d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1a1f8d3f2f343b75", "level": "note", "message": {"text": "Unused endpoint: GET /chart/sales-trend"}, "properties": {"repobilityId": "a915fcf8c7632861", "scanner": "scanner-primary", "fingerprint": "1a1f8d3f2f343b75", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bb2eb1011315e6f1", "level": "note", "message": {"text": "Unused endpoint: GET /chart/month-end-progress"}, "properties": {"repobilityId": "42a8be726bbf072a", "scanner": "scanner-primary", "fingerprint": "bb2eb1011315e6f1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bf8e5ccafb0477ec", "level": "note", "message": {"text": "Unused endpoint: GET /table/region-breakdown"}, "properties": {"repobilityId": "079c841088e6be45", "scanner": "scanner-primary", "fingerprint": "bf8e5ccafb0477ec", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e87c0ee955911afe", "level": "note", "message": {"text": "Unused endpoint: GET /table/sales-summary"}, "properties": {"repobilityId": "1bdcc2c97b363944", "scanner": "scanner-primary", "fingerprint": "e87c0ee955911afe", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8a2fb1c3ddfe52c3", "level": "note", "message": {"text": "Unused endpoint: GET /launch/{program}/tasks"}, "properties": {"repobilityId": "7fa403a0cffd32f2", "scanner": "scanner-primary", "fingerprint": "8a2fb1c3ddfe52c3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6c45efa3d97c971e", "level": "note", "message": {"text": "Unused endpoint: GET /launch/{program}/timeline"}, "properties": {"repobilityId": "5d76ffdc6356d743", "scanner": "scanner-primary", "fingerprint": "6c45efa3d97c971e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2a551dbd405fa748", "level": "note", "message": {"text": "Unused endpoint: GET /launch/{program}/forecast"}, "properties": {"repobilityId": "422127eee8ab6ad3", "scanner": "scanner-primary", "fingerprint": "2a551dbd405fa748", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f5320327a862fe7b", "level": "note", "message": {"text": "Unused endpoint: GET /chart/team-share"}, "properties": {"repobilityId": "e4d24a1930ccaf5e", "scanner": "scanner-primary", "fingerprint": "f5320327a862fe7b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-beefd8f227b24326", "level": "note", "message": {"text": "Unused endpoint: GET /chart/region-share"}, "properties": {"repobilityId": "7fba0277c650ac08", "scanner": "scanner-primary", "fingerprint": "beefd8f227b24326", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4434a0f55a1fe231", "level": "note", "message": {"text": "Unused endpoint: GET /chart/cohort-retention"}, "properties": {"repobilityId": "a6f85079b6d882e7", "scanner": "scanner-primary", "fingerprint": "4434a0f55a1fe231", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-64d91c29a89e5efd", "level": "note", "message": {"text": "Unused endpoint: GET /chart/funnel-conversion"}, "properties": {"repobilityId": "91d66576a2618762", "scanner": "scanner-primary", "fingerprint": "64d91c29a89e5efd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3925d19e457f6be1", "level": "note", "message": {"text": "Unused endpoint: GET /chart/audit-volume"}, "properties": {"repobilityId": "d95957c66b57f598", "scanner": "scanner-primary", "fingerprint": "3925d19e457f6be1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9a0004a15d044700", "level": "note", "message": {"text": "Unused endpoint: GET /table/incidents-recent"}, "properties": {"repobilityId": "df6b112b512437c4", "scanner": "scanner-primary", "fingerprint": "9a0004a15d044700", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-238545e728c215a8", "level": "note", "message": {"text": "Unused endpoint: GET /table/campaigns-active"}, "properties": {"repobilityId": "8f189cd218bf600f", "scanner": "scanner-primary", "fingerprint": "238545e728c215a8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7b6c61dc14354019", "level": "note", "message": {"text": "Unused endpoint: GET /table/documents-top"}, "properties": {"repobilityId": "3914b0ec406b6c3c", "scanner": "scanner-primary", "fingerprint": "7b6c61dc14354019", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a0cdcea8adcc79dd", "level": "note", "message": {"text": "Unused endpoint: GET /table/glossary-top"}, "properties": {"repobilityId": "198ff1607ea623d4", "scanner": "scanner-primary", "fingerprint": "a0cdcea8adcc79dd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6bf46ae4d72e2d1e", "level": "note", "message": {"text": "Unused endpoint: GET /{kind}/{widget_id:path}"}, "properties": {"repobilityId": "641970df97757e31", "scanner": "scanner-primary", "fingerprint": "6bf46ae4d72e2d1e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-37f768eb73a4eacc", "level": "note", "message": {"text": "Unused endpoint: GET /definitions"}, "properties": {"repobilityId": "6c5eba12aaf44c74", "scanner": "scanner-primary", "fingerprint": "37f768eb73a4eacc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-617a169972fe45df", "level": "note", "message": {"text": "Unused endpoint: GET /definitions/{quiz_id:path}"}, "properties": {"repobilityId": "ffb09ee694c44619", "scanner": "scanner-primary", "fingerprint": "617a169972fe45df", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7528ed4ad35fc8fc", "level": "note", "message": {"text": "Unused endpoint: POST /{slug}/{block_id}/attempts"}, "properties": {"repobilityId": "c44adc9c0ae46c78", "scanner": "scanner-primary", "fingerprint": "7528ed4ad35fc8fc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8fe85db916205049", "level": "note", "message": {"text": "Unused endpoint: GET /{slug}/{block_id}/attempts"}, "properties": {"repobilityId": "e78aa9a4143b4b8d", "scanner": "scanner-primary", "fingerprint": "8fe85db916205049", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-db9b5661b0e65293", "level": "note", "message": {"text": "Unused endpoint: GET /{slug}/{block_id}/leaderboard"}, "properties": {"repobilityId": "e4b5f24023d20da3", "scanner": "scanner-primary", "fingerprint": "db9b5661b0e65293", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-10e7266bcd07230d", "level": "note", "message": {"text": "Unused endpoint: GET /me/{slug}/{block_id}"}, "properties": {"repobilityId": "317c540e45b0a0d1", "scanner": "scanner-primary", "fingerprint": "10e7266bcd07230d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9f06b1725695147b", "level": "note", "message": {"text": "Unused endpoint: GET /admin/health-dashboard"}, "properties": {"repobilityId": "a2039e9de705da2c", "scanner": "scanner-primary", "fingerprint": "9f06b1725695147b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-11067f3f963489e2", "level": "note", "message": {"text": "Unused endpoint: GET /glossary"}, "properties": {"repobilityId": "a20ad7316d387344", "scanner": "scanner-primary", "fingerprint": "11067f3f963489e2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9a2b20570840759e", "level": "note", "message": {"text": "Unused endpoint: GET /glossary/term/{term}"}, "properties": {"repobilityId": "228719062830a820", "scanner": "scanner-primary", "fingerprint": "9a2b20570840759e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4f1fb035a6560187", "level": "note", "message": {"text": "Unused endpoint: POST /glossary/propose"}, "properties": {"repobilityId": "68366ec5493abbfc", "scanner": "scanner-primary", "fingerprint": "4f1fb035a6560187", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7d021dab23203a82", "level": "note", "message": {"text": "Unused endpoint: GET /glossary/pending"}, "properties": {"repobilityId": "916498485cb3d46e", "scanner": "scanner-primary", "fingerprint": "7d021dab23203a82", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-333bc911e3945fd9", "level": "note", "message": {"text": "Unused endpoint: POST /glossary/{term_id}/approve"}, "properties": {"repobilityId": "b4d95f0755768f4a", "scanner": "scanner-primary", "fingerprint": "333bc911e3945fd9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-78fed4f4fe79fb37", "level": "note", "message": {"text": "Unused endpoint: POST /glossary/{term_id}/reject"}, "properties": {"repobilityId": "acceb6f66ae73517", "scanner": "scanner-primary", "fingerprint": "78fed4f4fe79fb37", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b392dfe50da98d26", "level": "note", "message": {"text": "Unused endpoint: PATCH /glossary/{term_id}"}, "properties": {"repobilityId": "931aa5f36821d7c8", "scanner": "scanner-primary", "fingerprint": "b392dfe50da98d26", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-67f3390656a13a93", "level": "note", "message": {"text": "Unused endpoint: PATCH /glossary/proposals/{term_id}"}, "properties": {"repobilityId": "b1edabae712a13cc", "scanner": "scanner-primary", "fingerprint": "67f3390656a13a93", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bc44e5c122f0b8c4", "level": "note", "message": {"text": "Unused endpoint: DELETE /glossary/proposals/{term_id}"}, "properties": {"repobilityId": "76f5d435ef03c225", "scanner": "scanner-primary", "fingerprint": "bc44e5c122f0b8c4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}