{"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-0a292d99187a2993", "name": "Icon-only button without accessible name \u2014 apps/web/components/LaunchModal.tsx:245", "shortDescription": {"text": "Icon-only button without accessible name \u2014 apps/web/components/LaunchModal.tsx:245"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7e380e218df84647", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/LaunchModal.tsx:379", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/LaunchModal.tsx:379"}, "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-ca0122b62ca5ce55", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/components/ShikiCode.tsx:52", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/components/ShikiCode.tsx:52"}, "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-021566aca93925a3", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/Waterfall.tsx:196", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/Waterfall.tsx:196"}, "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-955cd2c36334583c", "name": "Icon-only button without accessible name \u2014 apps/web/components/PlanModal.tsx:137", "shortDescription": {"text": "Icon-only button without accessible name \u2014 apps/web/components/PlanModal.tsx:137"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3bad1f74d7035fb0", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/ToolCallCard.tsx:41", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/ToolCallCard.tsx:41"}, "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-749a8dc28d296f64", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/FileTree.tsx:85", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/FileTree.tsx:85"}, "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-4dfeb8a394749e7b", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/FlowGraph.tsx:118", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/FlowGraph.tsx:118"}, "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-6ce27a749121e284", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/ChatSessionList.tsx:65", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/ChatSessionList.tsx:65"}, "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-fa4f4c6030bbfbbc", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/ui.tsx:424", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/ui.tsx:424"}, "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-696041f59b3bb47c", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/SearchResultCard.tsx:18", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/SearchResultCard.tsx:18"}, "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-89f2735b2e3eb4b1", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/MultiPicker.tsx:176", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/MultiPicker.tsx:176"}, "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-5b96d5ee27ff5d39", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/Tree.tsx:41", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/Tree.tsx:41"}, "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-813ce149058de52e", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/RunningAgentsPanel.tsx:47", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/RunningAgentsPanel.tsx:47"}, "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-77d2cca5c9697c73", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/FileViewer.tsx:376", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/FileViewer.tsx:376"}, "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-74c97728bc86eb92", "name": "Icon-only button without accessible name \u2014 apps/web/app/benchmarks/page.tsx:125", "shortDescription": {"text": "Icon-only button without accessible name \u2014 apps/web/app/benchmarks/page.tsx:125"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-54df77a68233f17c", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/benchmarks/page.tsx:209", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/benchmarks/page.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-a9c50b7d544a59e4", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/projects/page.tsx:250", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/projects/page.tsx:250"}, "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-051102760ea288cd", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/projects/[id]/page.tsx:159", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/projects/[id]/page.tsx:159"}, "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-65c5195463ecfee2", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/projects/[id]/files/page.tsx:230", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/projects/[id]/files/page.tsx:230"}, "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-1aa4ac7ba4fb74ba", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/projects/[id]/board/page.tsx:382", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/projects/[id]/board/page.tsx:382"}, "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-3d64e70cc067f4ed", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/teams/page.tsx:36", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/teams/page.tsx:36"}, "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-ee10487b91b026c2", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/teams/[id]/page.tsx:84", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/teams/[id]/page.tsx:84"}, "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-8f3b1d4811399b51", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/templates/page.tsx:45", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/templates/page.tsx:45"}, "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-d944dce152eb45e0", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/runs/[id]/page.tsx:124", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/runs/[id]/page.tsx:124"}, "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-54d0e8165dac128b", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/history/page.tsx:231", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/history/page.tsx:231"}, "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-cf19afea290df97d", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/app/history/page.tsx:245", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/app/history/page.tsx:245"}, "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-dbe14f28961433b6", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/metrics/page.tsx:214", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/metrics/page.tsx:214"}, "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-7f82c34fadc2ed8e", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/schedules/page.tsx:110", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/schedules/page.tsx:110"}, "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-85af93f5066496f7", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/loops/[id]/page.tsx:155", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/loops/[id]/page.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-d5dd211fe31f930b", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/compare/page.tsx:300", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/compare/page.tsx:300"}, "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-248d8cc9771b0930", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/inbox/page.tsx:71", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/inbox/page.tsx:71"}, "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-f62a70e8126bff48", "name": "Stray `console.log` in TS/JS \u2014 apps/server/test/search.test.ts:45", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/server/test/search.test.ts:45"}, "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-41eba5c5703ddc48", "name": "Stray `console.log` in TS/JS \u2014 apps/server/test/model-routing.test.ts:17", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/server/test/model-routing.test.ts:17"}, "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-de807bd65e10df05", "name": "Stray `console.log` in TS/JS \u2014 apps/server/test/addons.test.ts:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/server/test/addons.test.ts:20"}, "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-615b0026aa800989", "name": "Stray `console.log` in TS/JS \u2014 apps/server/test/cov-addons.test.ts:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/server/test/cov-addons.test.ts:32"}, "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-7561035045b1563e", "name": "Stray `console.log` in TS/JS \u2014 apps/server/test/cov-search.test.ts:111", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/server/test/cov-search.test.ts:111"}, "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-40ee4f91507af5d3", "name": "Stray `console.log` in TS/JS \u2014 apps/server/src/index.ts:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/server/src/index.ts:16"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fc676ce524ec1f9d", "name": "Stray `console.log` in TS/JS \u2014 apps/server/src/search.ts:55", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/server/src/search.ts:55"}, "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-196e55cd2b9c6483", "name": "Privileged port 16 in use", "shortDescription": {"text": "Privileged port 16 in use"}, "fullDescription": {"text": "Port 16 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-8a5301c1a3fa1fce", "name": "Privileged port 48 in use", "shortDescription": {"text": "Privileged port 48 in use"}, "fullDescription": {"text": "Port 48 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-93a04f538e639932", "name": "Insecure pattern 'dangerous_innerhtml' in apps/web/components/ShikiCode.tsx:52", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/web/components/ShikiCode.tsx:52"}, "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-5e4a9b381996da77", "name": "Insecure pattern 'dangerous_innerhtml' in apps/web/app/history/page.tsx:245", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/web/app/history/page.tsx:245"}, "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-ef851f8cf8a2596d", "name": "Insecure pattern 'node_child_process' in apps/server/src/portbroker.ts:21", "shortDescription": {"text": "Insecure pattern 'node_child_process' in apps/server/src/portbroker.ts:21"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-22a57ea6c358f6ee", "name": "Insecure pattern 'node_child_process' in apps/server/src/addons.ts:30", "shortDescription": {"text": "Insecure pattern 'node_child_process' in apps/server/src/addons.ts:30"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-929fa490f9dead28", "name": "Insecure pattern 'node_child_process' in apps/server/src/processManager.ts:6", "shortDescription": {"text": "Insecure pattern 'node_child_process' in apps/server/src/processManager.ts:6"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a1c7dd2203b97813", "name": "Insecure pattern 'node_child_process' in apps/server/src/git.ts:20", "shortDescription": {"text": "Insecure pattern 'node_child_process' in apps/server/src/git.ts:20"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9bf7ef20b4abb2c4", "name": "Insecure pattern 'node_child_process' in apps/server/src/gh.ts:30", "shortDescription": {"text": "Insecure pattern 'node_child_process' in apps/server/src/gh.ts:30"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7e02dec4b681c840", "name": "Insecure pattern 'node_child_process' in apps/server/src/mcp.ts:7", "shortDescription": {"text": "Insecure pattern 'node_child_process' in apps/server/src/mcp.ts:7"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-de4c168bd00d9fe7", "name": "Insecure pattern 'node_child_process' in apps/server/src/learner.ts:29", "shortDescription": {"text": "Insecure pattern 'node_child_process' in apps/server/src/learner.ts:29"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-06dada08d52089f7", "name": "Insecure pattern 'node_child_process' in apps/server/src/engines.ts:9", "shortDescription": {"text": "Insecure pattern 'node_child_process' in apps/server/src/engines.ts:9"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1128f2ab1fd6381f", "name": "Insecure pattern 'node_child_process' in apps/server/src/release.ts:15", "shortDescription": {"text": "Insecure pattern 'node_child_process' in apps/server/src/release.ts:15"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4f9562bb6861bb73", "name": "Insecure pattern 'node_child_process' in apps/server/src/validation.ts:11", "shortDescription": {"text": "Insecure pattern 'node_child_process' in apps/server/src/validation.ts:11"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3183d486b2945326", "name": "Insecure pattern 'node_child_process' in apps/server/src/pm.ts:37", "shortDescription": {"text": "Insecure pattern 'node_child_process' in apps/server/src/pm.ts:37"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b8fce84438756bba", "name": "Insecure pattern 'node_child_process' in apps/server/src/fileview.ts:26", "shortDescription": {"text": "Insecure pattern 'node_child_process' in apps/server/src/fileview.ts:26"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f1e28d594bf87cde", "name": "Insecure pattern 'node_child_process' in apps/server/src/projects.ts:17", "shortDescription": {"text": "Insecure pattern 'node_child_process' in apps/server/src/projects.ts:17"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fdf2aca0cf72e873", "name": "Insecure pattern 'node_child_process' in desktop/scripts/afterPack.cjs:13", "shortDescription": {"text": "Insecure pattern 'node_child_process' in desktop/scripts/afterPack.cjs:13"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9a22f50c7079cc7c", "name": "Insecure pattern 'direct_innerhtml_assignment' in site/lab-hand-machine-agent.html:257", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in site/lab-hand-machine-agent.html:257"}, "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-c7675e8d506e5b71", "name": "Insecure pattern 'direct_innerhtml_assignment' in site/index.html:1470", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in site/index.html:1470"}, "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-2eb269bb470bdeb9", "name": "Insecure pattern 'direct_innerhtml_assignment' in site/_lottie-preview.html:52", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in site/_lottie-preview.html:52"}, "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-3c2ba397cc35a2b8", "name": "Insecure pattern 'direct_innerhtml_assignment' in site/lab-orchestrator-flow.html:204", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in site/lab-orchestrator-flow.html:204"}, "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-f3d6a152eea3c3a1", "name": "Insecure pattern 'direct_innerhtml_assignment' in site/lab-laptop-agent.html:137", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in site/lab-laptop-agent.html:137"}, "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-d2aef5cd8c0e5ab1", "name": "Insecure pattern 'insert_adjacent_html' in site/lab-laptop-agent.html:139", "shortDescription": {"text": "Insecure pattern 'insert_adjacent_html' in site/lab-laptop-agent.html:139"}, "fullDescription": {"text": "Found a known-risky pattern (insert_adjacent_html). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1838a141491ce38c", "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-e4f658c0c00de0d4", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/deploy-pages@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-448d8837178ae57a", "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-0f27544564ea5458", "name": "Very large file: apps/server/src/addons.ts (1465 lines)", "shortDescription": {"text": "Very large file: apps/server/src/addons.ts (1465 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-ec4ec351c7c6cedc", "name": "Very large file: apps/server/src/registry.ts (1275 lines)", "shortDescription": {"text": "Very large file: apps/server/src/registry.ts (1275 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-4eb366ac4d5cfb4a", "name": "Very large file: apps/server/src/pm.ts (1767 lines)", "shortDescription": {"text": "Very large file: apps/server/src/pm.ts (1767 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-0f5615676e9c8999", "name": "Very large file: packages/shared/src/index.ts (1530 lines)", "shortDescription": {"text": "Very large file: packages/shared/src/index.ts (1530 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-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-5f12bbcc60e1f76c", "name": "Node manifest has dependencies but no lockfile: apps/server/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: apps/server/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 15 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 146 placeholder/mock markers across 51 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-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 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-6ae995bc32bc7e80", "name": "Commented-code block (6 lines) in apps/web/vitest.config.ts:21", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/vitest.config.ts:21"}, "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-c458f503c90153ae", "name": "Commented-code block (5 lines) in apps/web/test/setup.ts:11", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/test/setup.ts:11"}, "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-ef975709aade3c41", "name": "Commented-code block (5 lines) in apps/web/test/cov-chatthread-order.test.tsx:172", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/test/cov-chatthread-order.test.tsx:172"}, "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-8e130a11a2fb92e3", "name": "Commented-code block (6 lines) in apps/web/components/KanbanCard.tsx:79", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/components/KanbanCard.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-5fd5d74d938712a7", "name": "Commented-code block (8 lines) in apps/web/components/ChatThread.tsx:126", "shortDescription": {"text": "Commented-code block (8 lines) in apps/web/components/ChatThread.tsx:126"}, "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-7f6111b836ebf124", "name": "Commented-code block (10 lines) in apps/web/components/ui.tsx:287", "shortDescription": {"text": "Commented-code block (10 lines) in apps/web/components/ui.tsx:287"}, "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-3689450403f2dd2c", "name": "Commented-code block (5 lines) in apps/web/app/projects/[id]/board/page.tsx:11", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/app/projects/[id]/board/page.tsx:11"}, "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-7b4a5eaa4c3e6faa", "name": "Commented-code block (8 lines) in apps/web/app/chat/page.tsx:100", "shortDescription": {"text": "Commented-code block (8 lines) in apps/web/app/chat/page.tsx:100"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-40358bbb563c329b", "name": "Commented-code block (6 lines) in apps/web/lib/live.ts:216", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/lib/live.ts:216"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8f8b9e18dd1be3e3", "name": "Commented-code block (5 lines) in apps/server/vitest.config.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in apps/server/vitest.config.ts:3"}, "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-ce451cd8ead1b3f9", "name": "Commented-code block (6 lines) in apps/server/test/kanban.test.ts:25", "shortDescription": {"text": "Commented-code block (6 lines) in apps/server/test/kanban.test.ts:25"}, "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-d195efdeecf1b800", "name": "Commented-code block (6 lines) in apps/server/test/manager.test.ts:210", "shortDescription": {"text": "Commented-code block (6 lines) in apps/server/test/manager.test.ts:210"}, "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-139b47d7e59afa53", "name": "Commented-code block (6 lines) in apps/server/test/campaigns.test.ts:22", "shortDescription": {"text": "Commented-code block (6 lines) in apps/server/test/campaigns.test.ts:22"}, "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-c7f93c6c565c1b8f", "name": "Commented-code block (5 lines) in apps/server/test/pm-fleet.test.ts:7", "shortDescription": {"text": "Commented-code block (5 lines) in apps/server/test/pm-fleet.test.ts:7"}, "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-554b6f57740ae4eb", "name": "Commented-code block (6 lines) in apps/server/test/pm.test.ts:684", "shortDescription": {"text": "Commented-code block (6 lines) in apps/server/test/pm.test.ts:684"}, "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-ae24760ab877e373", "name": "Commented-code block (5 lines) in apps/server/test/cov-processManager.test.ts:91", "shortDescription": {"text": "Commented-code block (5 lines) in apps/server/test/cov-processManager.test.ts:91"}, "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-f7868421216a2e54", "name": "Commented-code block (10 lines) in apps/server/test/pm-campaign.test.ts:199", "shortDescription": {"text": "Commented-code block (10 lines) in apps/server/test/pm-campaign.test.ts:199"}, "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-23c4984c2dcc6a2b", "name": "Commented-code block (5 lines) in apps/server/test/search.test.ts:220", "shortDescription": {"text": "Commented-code block (5 lines) in apps/server/test/search.test.ts:220"}, "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-b3cecbab96641b22", "name": "Commented-code block (6 lines) in apps/server/test/gh.test.ts:415", "shortDescription": {"text": "Commented-code block (6 lines) in apps/server/test/gh.test.ts:415"}, "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-26cedca6166afc23", "name": "Commented-code block (6 lines) in apps/server/test/notifier-channels.test.ts:188", "shortDescription": {"text": "Commented-code block (6 lines) in apps/server/test/notifier-channels.test.ts: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-693402e2424be506", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/server/test/notifier-channels.test.ts:191", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/server/test/notifier-channels.test.ts:191"}, "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-4100a1ac9393d25c", "name": "Commented-code block (6 lines) in apps/server/test/benchmarks.test.ts:344", "shortDescription": {"text": "Commented-code block (6 lines) in apps/server/test/benchmarks.test.ts:344"}, "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-e2485f069246a895", "name": "Commented-code block (6 lines) in apps/server/test/projects.test.ts:99", "shortDescription": {"text": "Commented-code block (6 lines) in apps/server/test/projects.test.ts:99"}, "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-387cc0687d41e709", "name": "Commented-code block (5 lines) in apps/server/test/addons.test.ts:9", "shortDescription": {"text": "Commented-code block (5 lines) in apps/server/test/addons.test.ts:9"}, "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-18cc8130dcf9c261", "name": "Commented-code block (7 lines) in apps/server/test/cov-triggers.test.ts:610", "shortDescription": {"text": "Commented-code block (7 lines) in apps/server/test/cov-triggers.test.ts:610"}, "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-1714ba43179d20fa", "name": "Commented-code block (6 lines) in apps/server/test/cov-fileview.test.ts:125", "shortDescription": {"text": "Commented-code block (6 lines) in apps/server/test/cov-fileview.test.ts:125"}, "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-0a8606db334427a3", "name": "Commented-code block (5 lines) in apps/server/test/scheduler-recurrence.test.ts:280", "shortDescription": {"text": "Commented-code block (5 lines) in apps/server/test/scheduler-recurrence.test.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-23194d7380057731", "name": "Commented-code block (5 lines) in apps/server/test/retry.test.ts:31", "shortDescription": {"text": "Commented-code block (5 lines) in apps/server/test/retry.test.ts:31"}, "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-8407b2b05f28aa4a", "name": "Commented-code block (6 lines) in apps/server/test/cov-server.test.ts:19", "shortDescription": {"text": "Commented-code block (6 lines) in apps/server/test/cov-server.test.ts:19"}, "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-cf97ee94547b511d", "name": "Commented-code block (5 lines) in apps/server/test/cov-metrics.test.ts:86", "shortDescription": {"text": "Commented-code block (5 lines) in apps/server/test/cov-metrics.test.ts:86"}, "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-dcd3381892d8121b", "name": "Commented-code block (5 lines) in apps/server/test/inbox.test.ts:28", "shortDescription": {"text": "Commented-code block (5 lines) in apps/server/test/inbox.test.ts:28"}, "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-77685083d0eeb6b0", "name": "Commented-code block (6 lines) in apps/server/src/portbroker.ts:135", "shortDescription": {"text": "Commented-code block (6 lines) in apps/server/src/portbroker.ts:135"}, "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-e01d4cf5df54781b", "name": "Commented-code block (5 lines) in apps/server/src/addons.ts:1222", "shortDescription": {"text": "Commented-code block (5 lines) in apps/server/src/addons.ts:1222"}, "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-d184366740219622", "name": "Commented-code block (5 lines) in apps/server/src/processManager.ts:163", "shortDescription": {"text": "Commented-code block (5 lines) in apps/server/src/processManager.ts:163"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-199db14f9ddbb85b", "name": "Commented-code block (5 lines) in apps/server/src/git.ts:248", "shortDescription": {"text": "Commented-code block (5 lines) in apps/server/src/git.ts:248"}, "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-8e85ee6e6a651ac8", "name": "Commented-code block (7 lines) in apps/server/src/registry.ts:306", "shortDescription": {"text": "Commented-code block (7 lines) in apps/server/src/registry.ts:306"}, "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-343d687456fe26a4", "name": "Commented-code block (5 lines) in apps/server/src/fileedit.ts:329", "shortDescription": {"text": "Commented-code block (5 lines) in apps/server/src/fileedit.ts:329"}, "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-441872fa67969511", "name": "Commented-code block (6 lines) in apps/server/src/scheduler.ts:328", "shortDescription": {"text": "Commented-code block (6 lines) in apps/server/src/scheduler.ts:328"}, "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-4af89a8bec2081dc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/server/src/release.ts:89", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/server/src/release.ts:89"}, "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-60e3c8a4aade4619", "name": "Commented-code block (5 lines) in apps/server/src/chat.ts:192", "shortDescription": {"text": "Commented-code block (5 lines) in apps/server/src/chat.ts:192"}, "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-488f23030baa93d0", "name": "Commented-code block (5 lines) in apps/server/src/pm.ts:933", "shortDescription": {"text": "Commented-code block (5 lines) in apps/server/src/pm.ts:933"}, "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-3600c192e1dd218a", "name": "Commented-code block (6 lines) in apps/server/src/server.ts:171", "shortDescription": {"text": "Commented-code block (6 lines) in apps/server/src/server.ts:171"}, "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-c21c7e31b10965cd", "name": "Commented-code block (5 lines) in apps/server/src/projects.ts:397", "shortDescription": {"text": "Commented-code block (5 lines) in apps/server/src/projects.ts:397"}, "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-24c43d24a9a03cbd", "name": "Commented-code block (5 lines) in apps/server/src/campaigns.ts:193", "shortDescription": {"text": "Commented-code block (5 lines) in apps/server/src/campaigns.ts: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-6b31f8cdbdeed4d1", "name": "Commented-code block (5 lines) in apps/server/src/loops.ts:340", "shortDescription": {"text": "Commented-code block (5 lines) in apps/server/src/loops.ts:340"}, "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-278ea6df5415317d", "name": "Commented-code block (6 lines) in apps/server/src/fleet.ts:104", "shortDescription": {"text": "Commented-code block (6 lines) in apps/server/src/fleet.ts:104"}, "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-1fa12f1c3f4a51cb", "name": "Commented-code block (8 lines) in apps/server/src/benchmarks.ts:259", "shortDescription": {"text": "Commented-code block (8 lines) in apps/server/src/benchmarks.ts:259"}, "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-995a569fa59b701f", "name": "Commented-code block (7 lines) in apps/server/src/kanban.ts:115", "shortDescription": {"text": "Commented-code block (7 lines) in apps/server/src/kanban.ts:115"}, "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-e5e90e38026f0ab7", "name": "Commented-code block (7 lines) in desktop/scripts/copy-web.cjs:41", "shortDescription": {"text": "Commented-code block (7 lines) in desktop/scripts/copy-web.cjs: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-7e8a4411d913eaa1", "name": "Commented-code block (7 lines) in packages/shared/src/index.ts:933", "shortDescription": {"text": "Commented-code block (7 lines) in packages/shared/src/index.ts:933"}, "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-a1c45cbb5747c6f0", "name": "Dangling fetch: GET http://127.0.0.1:${TEST_PORT}/health (apps/server/test/addons.test.ts:273)", "shortDescription": {"text": "Dangling fetch: GET http://127.0.0.1:${TEST_PORT}/health (apps/server/test/addons.test.ts:273)"}, "fullDescription": {"text": "`apps/server/test/addons.test.ts:273` calls `GET http://127.0.0.1:${TEST_PORT}/health` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:/<p>/health`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-62411da8af150093", "name": "Dangling fetch: GET http://127.0.0.1:${TEST_PORT}/health (apps/server/test/cov-addons.test.ts:516)", "shortDescription": {"text": "Dangling fetch: GET http://127.0.0.1:${TEST_PORT}/health (apps/server/test/cov-addons.test.ts:516)"}, "fullDescription": {"text": "`apps/server/test/cov-addons.test.ts:516` calls `GET http://127.0.0.1:${TEST_PORT}/health` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:/<p>/health`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5bd268d52d154ea1", "name": "Dangling fetch: GET https://api.github.com/repos/${slug}/releases?per_page=20 (apps/server/src/release.ts:137)", "shortDescription": {"text": "Dangling fetch: GET https://api.github.com/repos/${slug}/releases?per_page=20 (apps/server/src/release.ts:137)"}, "fullDescription": {"text": "`apps/server/src/release.ts:137` calls `GET https://api.github.com/repos/${slug}/releases?per_page=20` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:fetcher\nNormalized path used for matching: `/https:/api.github.com/repos/<p>/releases`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-988fb34b62c4c25c", "name": "Unused endpoint: GET /api/notifications", "shortDescription": {"text": "Unused endpoint: GET /api/notifications"}, "fullDescription": {"text": "`apps/server/src/notifier.ts` declares `GET /api/notifications` 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-056bcbe1b2b108a3", "name": "Unused endpoint: POST /api/notifications/read", "shortDescription": {"text": "Unused endpoint: POST /api/notifications/read"}, "fullDescription": {"text": "`apps/server/src/notifier.ts` declares `POST /api/notifications/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-f561e4fa8ce2de48", "name": "Unused endpoint: GET /api/notifications/config", "shortDescription": {"text": "Unused endpoint: GET /api/notifications/config"}, "fullDescription": {"text": "`apps/server/src/notifier.ts` declares `GET /api/notifications/config` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3f16b775a17b731b", "name": "Unused endpoint: PUT /api/notifications/config", "shortDescription": {"text": "Unused endpoint: PUT /api/notifications/config"}, "fullDescription": {"text": "`apps/server/src/notifier.ts` declares `PUT /api/notifications/config` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-32dd837f89333747", "name": "Unused endpoint: POST /api/notifications/test", "shortDescription": {"text": "Unused endpoint: POST /api/notifications/test"}, "fullDescription": {"text": "`apps/server/src/notifier.ts` declares `POST /api/notifications/test` 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-31bb1a0920cd6cfc", "name": "Unused endpoint: GET /api/notifier/channels", "shortDescription": {"text": "Unused endpoint: GET /api/notifier/channels"}, "fullDescription": {"text": "`apps/server/src/notifier.ts` declares `GET /api/notifier/channels` 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-c8eec3a63e843070", "name": "Unused endpoint: PUT /api/notifier/channels", "shortDescription": {"text": "Unused endpoint: PUT /api/notifier/channels"}, "fullDescription": {"text": "`apps/server/src/notifier.ts` declares `PUT /api/notifier/channels` 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-1875dd9c5a09b7fb", "name": "Unused endpoint: POST /api/notifier/channels/:id/test", "shortDescription": {"text": "Unused endpoint: POST /api/notifier/channels/:id/test"}, "fullDescription": {"text": "`apps/server/src/notifier.ts` declares `POST /api/notifier/channels/:id/test` 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-2a40e5fae7f0591d", "name": "Unused endpoint: GET /api/addons", "shortDescription": {"text": "Unused endpoint: GET /api/addons"}, "fullDescription": {"text": "`apps/server/src/addons.ts` declares `GET /api/addons` 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-fdb34e427780ad66", "name": "Unused endpoint: GET /api/addons/:id", "shortDescription": {"text": "Unused endpoint: GET /api/addons/:id"}, "fullDescription": {"text": "`apps/server/src/addons.ts` declares `GET /api/addons/: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-4cd15ba3bcf60792", "name": "Unused endpoint: POST /api/addons/:id/enable", "shortDescription": {"text": "Unused endpoint: POST /api/addons/:id/enable"}, "fullDescription": {"text": "`apps/server/src/addons.ts` declares `POST /api/addons/:id/enable` 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-4868869242e0594a", "name": "Unused endpoint: POST /api/addons/:id/disable", "shortDescription": {"text": "Unused endpoint: POST /api/addons/:id/disable"}, "fullDescription": {"text": "`apps/server/src/addons.ts` declares `POST /api/addons/:id/disable` 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-a237df4ae8580aa1", "name": "Unused endpoint: POST /api/addons/:id/restart", "shortDescription": {"text": "Unused endpoint: POST /api/addons/:id/restart"}, "fullDescription": {"text": "`apps/server/src/addons.ts` declares `POST /api/addons/:id/restart` 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-095692f786b818f2", "name": "Unused endpoint: PUT /api/addons/:id/config", "shortDescription": {"text": "Unused endpoint: PUT /api/addons/:id/config"}, "fullDescription": {"text": "`apps/server/src/addons.ts` declares `PUT /api/addons/:id/config` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1edb480f81fa46e2", "name": "Unused endpoint: GET /api/addons/compression/stats", "shortDescription": {"text": "Unused endpoint: GET /api/addons/compression/stats"}, "fullDescription": {"text": "`apps/server/src/addons.ts` declares `GET /api/addons/compression/stats` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c5b5a3afa8a19652", "name": "Unused endpoint: POST /api/addons/:id/install", "shortDescription": {"text": "Unused endpoint: POST /api/addons/:id/install"}, "fullDescription": {"text": "`apps/server/src/addons.ts` declares `POST /api/addons/:id/install` 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-fc0abe8272f531e6", "name": "Unused endpoint: POST /api/addons/web-research/register-mcp", "shortDescription": {"text": "Unused endpoint: POST /api/addons/web-research/register-mcp"}, "fullDescription": {"text": "`apps/server/src/addons.ts` declares `POST /api/addons/web-research/register-mcp` 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-1b66bf2b0134d57c", "name": "Unused endpoint: GET /api/packs", "shortDescription": {"text": "Unused endpoint: GET /api/packs"}, "fullDescription": {"text": "`apps/server/src/packs.ts` declares `GET /api/packs` 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-5fa750f7beeeb566", "name": "Unused endpoint: POST /api/packs", "shortDescription": {"text": "Unused endpoint: POST /api/packs"}, "fullDescription": {"text": "`apps/server/src/packs.ts` declares `POST /api/packs` 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-98c781911e5b21dc", "name": "Unused endpoint: PUT /api/packs/:id", "shortDescription": {"text": "Unused endpoint: PUT /api/packs/:id"}, "fullDescription": {"text": "`apps/server/src/packs.ts` declares `PUT /api/packs/: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-d6e9e28fd51ba3e1", "name": "Unused endpoint: DELETE /api/packs/:id", "shortDescription": {"text": "Unused endpoint: DELETE /api/packs/:id"}, "fullDescription": {"text": "`apps/server/src/packs.ts` declares `DELETE /api/packs/: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-13a0c9340610cc47", "name": "Unused endpoint: GET /api/projects/:pid/files/edit", "shortDescription": {"text": "Unused endpoint: GET /api/projects/:pid/files/edit"}, "fullDescription": {"text": "`apps/server/src/fileedit.ts` declares `GET /api/projects/:pid/files/edit` 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-a883bffbcbb72730", "name": "Unused endpoint: POST /api/projects/:pid/files/commit", "shortDescription": {"text": "Unused endpoint: POST /api/projects/:pid/files/commit"}, "fullDescription": {"text": "`apps/server/src/fileedit.ts` declares `POST /api/projects/:pid/files/commit` 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-a0f97e8d8a4de719", "name": "Unused endpoint: POST /api/loops/generate", "shortDescription": {"text": "Unused endpoint: POST /api/loops/generate"}, "fullDescription": {"text": "`apps/server/src/loopGen.ts` declares `POST /api/loops/generate` 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-fa5a27dd3a7a8b78", "name": "Unused endpoint: GET /api/agents/:id/tags", "shortDescription": {"text": "Unused endpoint: GET /api/agents/:id/tags"}, "fullDescription": {"text": "`apps/server/src/tags.ts` declares `GET /api/agents/:id/tags` 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-ccd48bd569a91317", "name": "Unused endpoint: POST /api/agents/:id/tags", "shortDescription": {"text": "Unused endpoint: POST /api/agents/:id/tags"}, "fullDescription": {"text": "`apps/server/src/tags.ts` declares `POST /api/agents/:id/tags` 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-f0205827822f9865", "name": "Unused endpoint: DELETE /api/agents/:id/tags/:tag", "shortDescription": {"text": "Unused endpoint: DELETE /api/agents/:id/tags/:tag"}, "fullDescription": {"text": "`apps/server/src/tags.ts` declares `DELETE /api/agents/:id/tags/:tag` 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-f90bfe720c1d950e", "name": "Unused endpoint: GET /api/tags", "shortDescription": {"text": "Unused endpoint: GET /api/tags"}, "fullDescription": {"text": "`apps/server/src/tags.ts` declares `GET /api/tags` 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-6d3eb9339b42f743", "name": "Unused endpoint: GET /api/saved-searches", "shortDescription": {"text": "Unused endpoint: GET /api/saved-searches"}, "fullDescription": {"text": "`apps/server/src/tags.ts` declares `GET /api/saved-searches` 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-c565c7aa78b36209", "name": "Unused endpoint: POST /api/saved-searches", "shortDescription": {"text": "Unused endpoint: POST /api/saved-searches"}, "fullDescription": {"text": "`apps/server/src/tags.ts` declares `POST /api/saved-searches` 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-115915aca66834c8", "name": "Unused endpoint: DELETE /api/saved-searches/:id", "shortDescription": {"text": "Unused endpoint: DELETE /api/saved-searches/:id"}, "fullDescription": {"text": "`apps/server/src/tags.ts` declares `DELETE /api/saved-searches/: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-ed8edb984248236d", "name": "Unused endpoint: GET /api/triggers", "shortDescription": {"text": "Unused endpoint: GET /api/triggers"}, "fullDescription": {"text": "`apps/server/src/triggers.ts` declares `GET /api/triggers` 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-4d97a3def034db74", "name": "Unused endpoint: POST /api/triggers", "shortDescription": {"text": "Unused endpoint: POST /api/triggers"}, "fullDescription": {"text": "`apps/server/src/triggers.ts` declares `POST /api/triggers` 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-0dadc525d4f72a01", "name": "Unused endpoint: PUT /api/triggers/:id", "shortDescription": {"text": "Unused endpoint: PUT /api/triggers/:id"}, "fullDescription": {"text": "`apps/server/src/triggers.ts` declares `PUT /api/triggers/: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-33077af0c0aff108", "name": "Unused endpoint: DELETE /api/triggers/:id", "shortDescription": {"text": "Unused endpoint: DELETE /api/triggers/:id"}, "fullDescription": {"text": "`apps/server/src/triggers.ts` declares `DELETE /api/triggers/: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-218c7edd057371cd", "name": "Unused endpoint: POST /api/triggers/:id/poll", "shortDescription": {"text": "Unused endpoint: POST /api/triggers/:id/poll"}, "fullDescription": {"text": "`apps/server/src/triggers.ts` declares `POST /api/triggers/:id/poll` 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-5aae5480ca83b4a2", "name": "Unused endpoint: GET /api/mcp", "shortDescription": {"text": "Unused endpoint: GET /api/mcp"}, "fullDescription": {"text": "`apps/server/src/mcp.ts` declares `GET /api/mcp` 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-2600888d8e3b41d3", "name": "Unused endpoint: GET /api/mcp/:name", "shortDescription": {"text": "Unused endpoint: GET /api/mcp/:name"}, "fullDescription": {"text": "`apps/server/src/mcp.ts` declares `GET /api/mcp/:name` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9b503dc869f46631", "name": "Unused endpoint: GET /api/agents/:id/scores", "shortDescription": {"text": "Unused endpoint: GET /api/agents/:id/scores"}, "fullDescription": {"text": "`apps/server/src/scores.ts` declares `GET /api/agents/:id/scores` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ccc4cd45238fae24", "name": "Unused endpoint: POST /api/agents/:id/scores", "shortDescription": {"text": "Unused endpoint: POST /api/agents/:id/scores"}, "fullDescription": {"text": "`apps/server/src/scores.ts` declares `POST /api/agents/:id/scores` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a6d8c504b16f909c", "name": "Unused endpoint: DELETE /api/scores/:scoreId", "shortDescription": {"text": "Unused endpoint: DELETE /api/scores/:scoreId"}, "fullDescription": {"text": "`apps/server/src/scores.ts` declares `DELETE /api/scores/:scoreId` 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-0c7b6742654a43b8", "name": "Unused endpoint: GET /api/scores/summary", "shortDescription": {"text": "Unused endpoint: GET /api/scores/summary"}, "fullDescription": {"text": "`apps/server/src/scores.ts` declares `GET /api/scores/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-fee3a4723f9aa9f4", "name": "Unused endpoint: POST /v1/metrics", "shortDescription": {"text": "Unused endpoint: POST /v1/metrics"}, "fullDescription": {"text": "`apps/server/src/otel.ts` declares `POST /v1/metrics` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa249daa165bb136", "name": "Unused endpoint: POST /v1/logs", "shortDescription": {"text": "Unused endpoint: POST /v1/logs"}, "fullDescription": {"text": "`apps/server/src/otel.ts` declares `POST /v1/logs` 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-f7aa656a006dd9dc", "name": "Unused endpoint: GET /api/agents/:id/otel", "shortDescription": {"text": "Unused endpoint: GET /api/agents/:id/otel"}, "fullDescription": {"text": "`apps/server/src/otel.ts` declares `GET /api/agents/:id/otel` 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-0ea3ea18d60e9f7a", "name": "Unused endpoint: POST /api/projects/:pid/plan", "shortDescription": {"text": "Unused endpoint: POST /api/projects/:pid/plan"}, "fullDescription": {"text": "`apps/server/src/planboard.ts` declares `POST /api/projects/:pid/plan` 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-447ad7aac4bfe8ad", "name": "Unused endpoint: GET /api/projects/:pid/plans", "shortDescription": {"text": "Unused endpoint: GET /api/projects/:pid/plans"}, "fullDescription": {"text": "`apps/server/src/planboard.ts` declares `GET /api/projects/:pid/plans` 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-9456fd6f618866b4", "name": "Unused endpoint: GET /api/plans/:id", "shortDescription": {"text": "Unused endpoint: GET /api/plans/:id"}, "fullDescription": {"text": "`apps/server/src/planboard.ts` declares `GET /api/plans/: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-070ec9245e6800d7", "name": "Unused endpoint: POST /api/plans/:id/apply", "shortDescription": {"text": "Unused endpoint: POST /api/plans/:id/apply"}, "fullDescription": {"text": "`apps/server/src/planboard.ts` declares `POST /api/plans/:id/apply` 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-4602a334a6124d4f", "name": "Unused endpoint: GET /api/learner", "shortDescription": {"text": "Unused endpoint: GET /api/learner"}, "fullDescription": {"text": "`apps/server/src/learner.ts` declares `GET /api/learner` 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/23346"}, "properties": {"repository": "YOUSSEFELJAYAD/claude-fleet-portal", "repoUrl": "https://github.com/YOUSSEFELJAYAD/claude-fleet-portal", "branch": "main"}, "results": [{"ruleId": "scanner-0a292d99187a2993", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 apps/web/components/LaunchModal.tsx:245"}, "properties": {"repobilityId": "fbbbf576380f27be", "scanner": "scanner-primary", "fingerprint": "0a292d99187a2993", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-7e380e218df84647", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/LaunchModal.tsx:379"}, "properties": {"repobilityId": "a5d946137d9bec2e", "scanner": "scanner-primary", "fingerprint": "7e380e218df84647", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ca0122b62ca5ce55", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/components/ShikiCode.tsx:52"}, "properties": {"repobilityId": "92379838351af4ec", "scanner": "scanner-primary", "fingerprint": "ca0122b62ca5ce55", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-021566aca93925a3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/Waterfall.tsx:196"}, "properties": {"repobilityId": "5109ec8977ce1d26", "scanner": "scanner-primary", "fingerprint": "021566aca93925a3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-955cd2c36334583c", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 apps/web/components/PlanModal.tsx:137"}, "properties": {"repobilityId": "e8e3d88c18eec233", "scanner": "scanner-primary", "fingerprint": "955cd2c36334583c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-3bad1f74d7035fb0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/ToolCallCard.tsx:41"}, "properties": {"repobilityId": "b2c6d3ddfe96eaa2", "scanner": "scanner-primary", "fingerprint": "3bad1f74d7035fb0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-749a8dc28d296f64", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/FileTree.tsx:85"}, "properties": {"repobilityId": "cf8d3394b4ec21f8", "scanner": "scanner-primary", "fingerprint": "749a8dc28d296f64", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4dfeb8a394749e7b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/FlowGraph.tsx:118"}, "properties": {"repobilityId": "6b1d385ac062f2bc", "scanner": "scanner-primary", "fingerprint": "4dfeb8a394749e7b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6ce27a749121e284", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/ChatSessionList.tsx:65"}, "properties": {"repobilityId": "0cb84c464b9b249b", "scanner": "scanner-primary", "fingerprint": "6ce27a749121e284", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fa4f4c6030bbfbbc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/ui.tsx:424"}, "properties": {"repobilityId": "bbbe90fdd84838d0", "scanner": "scanner-primary", "fingerprint": "fa4f4c6030bbfbbc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-696041f59b3bb47c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/SearchResultCard.tsx:18"}, "properties": {"repobilityId": "dfdf6e453b7ed424", "scanner": "scanner-primary", "fingerprint": "696041f59b3bb47c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-89f2735b2e3eb4b1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/MultiPicker.tsx:176"}, "properties": {"repobilityId": "b23bab4777810864", "scanner": "scanner-primary", "fingerprint": "89f2735b2e3eb4b1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5b96d5ee27ff5d39", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/Tree.tsx:41"}, "properties": {"repobilityId": "443fdd1d4e926481", "scanner": "scanner-primary", "fingerprint": "5b96d5ee27ff5d39", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-813ce149058de52e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/RunningAgentsPanel.tsx:47"}, "properties": {"repobilityId": "38c887bed4e6a9dd", "scanner": "scanner-primary", "fingerprint": "813ce149058de52e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-77d2cca5c9697c73", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/FileViewer.tsx:376"}, "properties": {"repobilityId": "4906fe35a18d8a05", "scanner": "scanner-primary", "fingerprint": "77d2cca5c9697c73", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-74c97728bc86eb92", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 apps/web/app/benchmarks/page.tsx:125"}, "properties": {"repobilityId": "d033479cfedf8f1e", "scanner": "scanner-primary", "fingerprint": "74c97728bc86eb92", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-54df77a68233f17c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/benchmarks/page.tsx:209"}, "properties": {"repobilityId": "9c5edaeced7bdb0f", "scanner": "scanner-primary", "fingerprint": "54df77a68233f17c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a9c50b7d544a59e4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/projects/page.tsx:250"}, "properties": {"repobilityId": "fa5a86c50a2d2349", "scanner": "scanner-primary", "fingerprint": "a9c50b7d544a59e4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-051102760ea288cd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/projects/[id]/page.tsx:159"}, "properties": {"repobilityId": "e97786dc4ce5ca11", "scanner": "scanner-primary", "fingerprint": "051102760ea288cd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-65c5195463ecfee2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/projects/[id]/files/page.tsx:230"}, "properties": {"repobilityId": "f03dab0adba3878a", "scanner": "scanner-primary", "fingerprint": "65c5195463ecfee2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1aa4ac7ba4fb74ba", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/projects/[id]/board/page.tsx:382"}, "properties": {"repobilityId": "f865884aab8d0d19", "scanner": "scanner-primary", "fingerprint": "1aa4ac7ba4fb74ba", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3d64e70cc067f4ed", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/teams/page.tsx:36"}, "properties": {"repobilityId": "3a883c6f06478836", "scanner": "scanner-primary", "fingerprint": "3d64e70cc067f4ed", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ee10487b91b026c2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/teams/[id]/page.tsx:84"}, "properties": {"repobilityId": "d6d17f7116e15e6e", "scanner": "scanner-primary", "fingerprint": "ee10487b91b026c2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8f3b1d4811399b51", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/templates/page.tsx:45"}, "properties": {"repobilityId": "bac9840d5fb21175", "scanner": "scanner-primary", "fingerprint": "8f3b1d4811399b51", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d944dce152eb45e0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/runs/[id]/page.tsx:124"}, "properties": {"repobilityId": "79c70557ea2b579f", "scanner": "scanner-primary", "fingerprint": "d944dce152eb45e0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-54d0e8165dac128b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/history/page.tsx:231"}, "properties": {"repobilityId": "4e57915f63eaf818", "scanner": "scanner-primary", "fingerprint": "54d0e8165dac128b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cf19afea290df97d", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/app/history/page.tsx:245"}, "properties": {"repobilityId": "6f8d74c253cd8500", "scanner": "scanner-primary", "fingerprint": "cf19afea290df97d", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-dbe14f28961433b6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/metrics/page.tsx:214"}, "properties": {"repobilityId": "846f59f01c7268f4", "scanner": "scanner-primary", "fingerprint": "dbe14f28961433b6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7f82c34fadc2ed8e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/schedules/page.tsx:110"}, "properties": {"repobilityId": "52f2e8cb74106ccd", "scanner": "scanner-primary", "fingerprint": "7f82c34fadc2ed8e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-85af93f5066496f7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/loops/[id]/page.tsx:155"}, "properties": {"repobilityId": "d9800438ddb26d23", "scanner": "scanner-primary", "fingerprint": "85af93f5066496f7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d5dd211fe31f930b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/compare/page.tsx:300"}, "properties": {"repobilityId": "4ac6f39182d25a78", "scanner": "scanner-primary", "fingerprint": "d5dd211fe31f930b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-248d8cc9771b0930", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/inbox/page.tsx:71"}, "properties": {"repobilityId": "06346d5702c673f9", "scanner": "scanner-primary", "fingerprint": "248d8cc9771b0930", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f62a70e8126bff48", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/server/test/search.test.ts:45"}, "properties": {"repobilityId": "9c93f2c349c35537", "scanner": "scanner-primary", "fingerprint": "f62a70e8126bff48", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-41eba5c5703ddc48", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/server/test/model-routing.test.ts:17"}, "properties": {"repobilityId": "1ccb292ad1834abe", "scanner": "scanner-primary", "fingerprint": "41eba5c5703ddc48", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-de807bd65e10df05", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/server/test/addons.test.ts:20"}, "properties": {"repobilityId": "18cdd4d53601c17c", "scanner": "scanner-primary", "fingerprint": "de807bd65e10df05", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-615b0026aa800989", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/server/test/cov-addons.test.ts:32"}, "properties": {"repobilityId": "1fafd736d0b90cb1", "scanner": "scanner-primary", "fingerprint": "615b0026aa800989", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7561035045b1563e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/server/test/cov-search.test.ts:111"}, "properties": {"repobilityId": "1f8ab459f8b8edac", "scanner": "scanner-primary", "fingerprint": "7561035045b1563e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-40ee4f91507af5d3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/server/src/index.ts:16"}, "properties": {"repobilityId": "5c84e404c4eed546", "scanner": "scanner-primary", "fingerprint": "40ee4f91507af5d3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fc676ce524ec1f9d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/server/src/search.ts:55"}, "properties": {"repobilityId": "0d0cb878abdb8dd4", "scanner": "scanner-primary", "fingerprint": "fc676ce524ec1f9d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-196e55cd2b9c6483", "level": "warning", "message": {"text": "Privileged port 16 in use"}, "properties": {"repobilityId": "d31009168c502ace", "scanner": "scanner-primary", "fingerprint": "196e55cd2b9c6483", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/homunculus/instincts/inherited/claude-fleet-portal-instincts.yaml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8a5301c1a3fa1fce", "level": "warning", "message": {"text": "Privileged port 48 in use"}, "properties": {"repobilityId": "6a483602fa277896", "scanner": "scanner-primary", "fingerprint": "8a5301c1a3fa1fce", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/homunculus/instincts/inherited/claude-fleet-portal-instincts.yaml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-93a04f538e639932", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/web/components/ShikiCode.tsx:52"}, "properties": {"repobilityId": "a70449017d7d99d2", "scanner": "scanner-primary", "fingerprint": "93a04f538e639932", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/components/ShikiCode.tsx"}, "region": {"startLine": 52}}}]}, {"ruleId": "scanner-5e4a9b381996da77", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/web/app/history/page.tsx:245"}, "properties": {"repobilityId": "8f087173af7f834a", "scanner": "scanner-primary", "fingerprint": "5e4a9b381996da77", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/app/history/page.tsx"}, "region": {"startLine": 245}}}]}, {"ruleId": "scanner-ef851f8cf8a2596d", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in apps/server/src/portbroker.ts:21"}, "properties": {"repobilityId": "762a96fa56e6a8e3", "scanner": "scanner-primary", "fingerprint": "ef851f8cf8a2596d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/server/src/portbroker.ts"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-22a57ea6c358f6ee", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in apps/server/src/addons.ts:30"}, "properties": {"repobilityId": "2c12467cba277ad1", "scanner": "scanner-primary", "fingerprint": "22a57ea6c358f6ee", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/server/src/addons.ts"}, "region": {"startLine": 30}}}]}, {"ruleId": "scanner-929fa490f9dead28", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in apps/server/src/processManager.ts:6"}, "properties": {"repobilityId": "21243c8fc96b50f5", "scanner": "scanner-primary", "fingerprint": "929fa490f9dead28", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/server/src/processManager.ts"}, "region": {"startLine": 6}}}]}, {"ruleId": "scanner-a1c7dd2203b97813", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in apps/server/src/git.ts:20"}, "properties": {"repobilityId": "9d493693f3dc6cc8", "scanner": "scanner-primary", "fingerprint": "a1c7dd2203b97813", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/server/src/git.ts"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-9bf7ef20b4abb2c4", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in apps/server/src/gh.ts:30"}, "properties": {"repobilityId": "97ca7c9edd6e32e1", "scanner": "scanner-primary", "fingerprint": "9bf7ef20b4abb2c4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/server/src/gh.ts"}, "region": {"startLine": 30}}}]}, {"ruleId": "scanner-7e02dec4b681c840", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in apps/server/src/mcp.ts:7"}, "properties": {"repobilityId": "9633504aaee2e15d", "scanner": "scanner-primary", "fingerprint": "7e02dec4b681c840", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/server/src/mcp.ts"}, "region": {"startLine": 7}}}]}, {"ruleId": "scanner-de4c168bd00d9fe7", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in apps/server/src/learner.ts:29"}, "properties": {"repobilityId": "4ac4e878b53202b6", "scanner": "scanner-primary", "fingerprint": "de4c168bd00d9fe7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/server/src/learner.ts"}, "region": {"startLine": 29}}}]}, {"ruleId": "scanner-06dada08d52089f7", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in apps/server/src/engines.ts:9"}, "properties": {"repobilityId": "c79df8992d8f9d55", "scanner": "scanner-primary", "fingerprint": "06dada08d52089f7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/server/src/engines.ts"}, "region": {"startLine": 9}}}]}, {"ruleId": "scanner-1128f2ab1fd6381f", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in apps/server/src/release.ts:15"}, "properties": {"repobilityId": "29a28333c1389a27", "scanner": "scanner-primary", "fingerprint": "1128f2ab1fd6381f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/server/src/release.ts"}, "region": {"startLine": 15}}}]}, {"ruleId": "scanner-4f9562bb6861bb73", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in apps/server/src/validation.ts:11"}, "properties": {"repobilityId": "d4b863519aba80e9", "scanner": "scanner-primary", "fingerprint": "4f9562bb6861bb73", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/server/src/validation.ts"}, "region": {"startLine": 11}}}]}, {"ruleId": "scanner-3183d486b2945326", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in apps/server/src/pm.ts:37"}, "properties": {"repobilityId": "4c8811d0479e0e35", "scanner": "scanner-primary", "fingerprint": "3183d486b2945326", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/server/src/pm.ts"}, "region": {"startLine": 37}}}]}, {"ruleId": "scanner-b8fce84438756bba", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in apps/server/src/fileview.ts:26"}, "properties": {"repobilityId": "5472c2112df6c1a0", "scanner": "scanner-primary", "fingerprint": "b8fce84438756bba", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/server/src/fileview.ts"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-f1e28d594bf87cde", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in apps/server/src/projects.ts:17"}, "properties": {"repobilityId": "7f91794aae7286f8", "scanner": "scanner-primary", "fingerprint": "f1e28d594bf87cde", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/server/src/projects.ts"}, "region": {"startLine": 17}}}]}, {"ruleId": "scanner-fdf2aca0cf72e873", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in desktop/scripts/afterPack.cjs:13"}, "properties": {"repobilityId": "d72b0225397f6a7e", "scanner": "scanner-primary", "fingerprint": "fdf2aca0cf72e873", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "desktop/scripts/afterPack.cjs"}, "region": {"startLine": 13}}}]}, {"ruleId": "scanner-9a22f50c7079cc7c", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in site/lab-hand-machine-agent.html:257"}, "properties": {"repobilityId": "51877174b78baaf3", "scanner": "scanner-primary", "fingerprint": "9a22f50c7079cc7c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "site/lab-hand-machine-agent.html"}, "region": {"startLine": 257}}}]}, {"ruleId": "scanner-c7675e8d506e5b71", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in site/index.html:1470"}, "properties": {"repobilityId": "91a2a73fe1e89994", "scanner": "scanner-primary", "fingerprint": "c7675e8d506e5b71", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "site/index.html"}, "region": {"startLine": 1470}}}]}, {"ruleId": "scanner-2eb269bb470bdeb9", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in site/_lottie-preview.html:52"}, "properties": {"repobilityId": "ed7fc734b17facd5", "scanner": "scanner-primary", "fingerprint": "2eb269bb470bdeb9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "site/_lottie-preview.html"}, "region": {"startLine": 52}}}]}, {"ruleId": "scanner-3c2ba397cc35a2b8", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in site/lab-orchestrator-flow.html:204"}, "properties": {"repobilityId": "74d9f7dae6fc6e2c", "scanner": "scanner-primary", "fingerprint": "3c2ba397cc35a2b8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "site/lab-orchestrator-flow.html"}, "region": {"startLine": 204}}}]}, {"ruleId": "scanner-f3d6a152eea3c3a1", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in site/lab-laptop-agent.html:137"}, "properties": {"repobilityId": "3547f1ef048369d5", "scanner": "scanner-primary", "fingerprint": "f3d6a152eea3c3a1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "site/lab-laptop-agent.html"}, "region": {"startLine": 137}}}]}, {"ruleId": "scanner-d2aef5cd8c0e5ab1", "level": "warning", "message": {"text": "Insecure pattern 'insert_adjacent_html' in site/lab-laptop-agent.html:139"}, "properties": {"repobilityId": "97de04a671947503", "scanner": "scanner-primary", "fingerprint": "d2aef5cd8c0e5ab1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "insert_adjacent_html"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "site/lab-laptop-agent.html"}, "region": {"startLine": 139}}}]}, {"ruleId": "scanner-1838a141491ce38c", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "b8fd4f5048f96576", "scanner": "scanner-primary", "fingerprint": "1838a141491ce38c", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e4f658c0c00de0d4", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "25e1fa3783e7cb32", "scanner": "scanner-primary", "fingerprint": "e4f658c0c00de0d4", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/pages.yml"}, "region": {"startLine": 32}}}]}, {"ruleId": "scanner-448d8837178ae57a", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "13af6451e15656fc", "scanner": "scanner-primary", "fingerprint": "448d8837178ae57a", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/pages.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0f27544564ea5458", "level": "note", "message": {"text": "Very large file: apps/server/src/addons.ts (1465 lines)"}, "properties": {"repobilityId": "c5ede4aee5157e87", "scanner": "scanner-primary", "fingerprint": "0f27544564ea5458", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ec4ec351c7c6cedc", "level": "note", "message": {"text": "Very large file: apps/server/src/registry.ts (1275 lines)"}, "properties": {"repobilityId": "abcc7e3013c2b1d0", "scanner": "scanner-primary", "fingerprint": "ec4ec351c7c6cedc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4eb366ac4d5cfb4a", "level": "note", "message": {"text": "Very large file: apps/server/src/pm.ts (1767 lines)"}, "properties": {"repobilityId": "50da0cf80080a2ad", "scanner": "scanner-primary", "fingerprint": "4eb366ac4d5cfb4a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-0f5615676e9c8999", "level": "note", "message": {"text": "Very large file: packages/shared/src/index.ts (1530 lines)"}, "properties": {"repobilityId": "6e98744af4290a9a", "scanner": "scanner-primary", "fingerprint": "0f5615676e9c8999", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"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-5f12bbcc60e1f76c", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: apps/server/package.json"}, "properties": {"repobilityId": "16bf11fe30b0b8cc", "scanner": "scanner-primary", "fingerprint": "5f12bbcc60e1f76c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/server/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": "eb4d96d69c48db10", "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": "5e289e5c98946918", "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": "7d70b632493ac84d", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "485ca671564a63c3", "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": "d001b5d736132ff1", "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": "6c510343ddb0fbbb", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-6ae995bc32bc7e80", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/vitest.config.ts:21"}, "properties": {"repobilityId": "eb6af029d9e81010", "scanner": "scanner-primary", "fingerprint": "6ae995bc32bc7e80", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c458f503c90153ae", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/test/setup.ts:11"}, "properties": {"repobilityId": "323a411a1a8c30e6", "scanner": "scanner-primary", "fingerprint": "c458f503c90153ae", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ef975709aade3c41", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/test/cov-chatthread-order.test.tsx:172"}, "properties": {"repobilityId": "b2144060d69046bd", "scanner": "scanner-primary", "fingerprint": "ef975709aade3c41", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8e130a11a2fb92e3", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/components/KanbanCard.tsx:79"}, "properties": {"repobilityId": "4bbb80dfc91350a2", "scanner": "scanner-primary", "fingerprint": "8e130a11a2fb92e3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5fd5d74d938712a7", "level": "none", "message": {"text": "Commented-code block (8 lines) in apps/web/components/ChatThread.tsx:126"}, "properties": {"repobilityId": "f5545550ac8af4cc", "scanner": "scanner-primary", "fingerprint": "5fd5d74d938712a7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7f6111b836ebf124", "level": "none", "message": {"text": "Commented-code block (10 lines) in apps/web/components/ui.tsx:287"}, "properties": {"repobilityId": "1a718859e4567aaf", "scanner": "scanner-primary", "fingerprint": "7f6111b836ebf124", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3689450403f2dd2c", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/app/projects/[id]/board/page.tsx:11"}, "properties": {"repobilityId": "fa5bdcb4eca07d5c", "scanner": "scanner-primary", "fingerprint": "3689450403f2dd2c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7b4a5eaa4c3e6faa", "level": "none", "message": {"text": "Commented-code block (8 lines) in apps/web/app/chat/page.tsx:100"}, "properties": {"repobilityId": "239a0f2c16386820", "scanner": "scanner-primary", "fingerprint": "7b4a5eaa4c3e6faa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-40358bbb563c329b", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/lib/live.ts:216"}, "properties": {"repobilityId": "f0fdaa3a50391bff", "scanner": "scanner-primary", "fingerprint": "40358bbb563c329b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8f8b9e18dd1be3e3", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/server/vitest.config.ts:3"}, "properties": {"repobilityId": "96e89ff206e4402a", "scanner": "scanner-primary", "fingerprint": "8f8b9e18dd1be3e3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ce451cd8ead1b3f9", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/server/test/kanban.test.ts:25"}, "properties": {"repobilityId": "8fb41cf3dd8e9b0b", "scanner": "scanner-primary", "fingerprint": "ce451cd8ead1b3f9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d195efdeecf1b800", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/server/test/manager.test.ts:210"}, "properties": {"repobilityId": "f56fd035f580a345", "scanner": "scanner-primary", "fingerprint": "d195efdeecf1b800", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-139b47d7e59afa53", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/server/test/campaigns.test.ts:22"}, "properties": {"repobilityId": "cf25dbf374815534", "scanner": "scanner-primary", "fingerprint": "139b47d7e59afa53", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c7f93c6c565c1b8f", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/server/test/pm-fleet.test.ts:7"}, "properties": {"repobilityId": "4c654dccdbe902cc", "scanner": "scanner-primary", "fingerprint": "c7f93c6c565c1b8f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-554b6f57740ae4eb", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/server/test/pm.test.ts:684"}, "properties": {"repobilityId": "d8acd0844a3f86c8", "scanner": "scanner-primary", "fingerprint": "554b6f57740ae4eb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ae24760ab877e373", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/server/test/cov-processManager.test.ts:91"}, "properties": {"repobilityId": "cc37c41092abbbfc", "scanner": "scanner-primary", "fingerprint": "ae24760ab877e373", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f7868421216a2e54", "level": "none", "message": {"text": "Commented-code block (10 lines) in apps/server/test/pm-campaign.test.ts:199"}, "properties": {"repobilityId": "087d021fc104cf33", "scanner": "scanner-primary", "fingerprint": "f7868421216a2e54", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-23c4984c2dcc6a2b", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/server/test/search.test.ts:220"}, "properties": {"repobilityId": "5b474b93a9e87a16", "scanner": "scanner-primary", "fingerprint": "23c4984c2dcc6a2b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b3cecbab96641b22", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/server/test/gh.test.ts:415"}, "properties": {"repobilityId": "46563e57c5f00f74", "scanner": "scanner-primary", "fingerprint": "b3cecbab96641b22", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-26cedca6166afc23", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/server/test/notifier-channels.test.ts:188"}, "properties": {"repobilityId": "31bd4859aab0aea2", "scanner": "scanner-primary", "fingerprint": "26cedca6166afc23", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-693402e2424be506", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/server/test/notifier-channels.test.ts:191"}, "properties": {"repobilityId": "ce80ae6d7edb7952", "scanner": "scanner-primary", "fingerprint": "693402e2424be506", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4100a1ac9393d25c", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/server/test/benchmarks.test.ts:344"}, "properties": {"repobilityId": "703156ef6c3bb58f", "scanner": "scanner-primary", "fingerprint": "4100a1ac9393d25c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e2485f069246a895", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/server/test/projects.test.ts:99"}, "properties": {"repobilityId": "c47d3d8c0c832315", "scanner": "scanner-primary", "fingerprint": "e2485f069246a895", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-387cc0687d41e709", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/server/test/addons.test.ts:9"}, "properties": {"repobilityId": "d21d2866d34f38bc", "scanner": "scanner-primary", "fingerprint": "387cc0687d41e709", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-18cc8130dcf9c261", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/server/test/cov-triggers.test.ts:610"}, "properties": {"repobilityId": "f1b2dcba5f8428e7", "scanner": "scanner-primary", "fingerprint": "18cc8130dcf9c261", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1714ba43179d20fa", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/server/test/cov-fileview.test.ts:125"}, "properties": {"repobilityId": "976a5045773c7521", "scanner": "scanner-primary", "fingerprint": "1714ba43179d20fa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0a8606db334427a3", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/server/test/scheduler-recurrence.test.ts:280"}, "properties": {"repobilityId": "2845b091020d4ba6", "scanner": "scanner-primary", "fingerprint": "0a8606db334427a3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-23194d7380057731", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/server/test/retry.test.ts:31"}, "properties": {"repobilityId": "44152f25bb4e1554", "scanner": "scanner-primary", "fingerprint": "23194d7380057731", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8407b2b05f28aa4a", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/server/test/cov-server.test.ts:19"}, "properties": {"repobilityId": "9c823521b4388443", "scanner": "scanner-primary", "fingerprint": "8407b2b05f28aa4a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cf97ee94547b511d", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/server/test/cov-metrics.test.ts:86"}, "properties": {"repobilityId": "67862b0d4bd4130b", "scanner": "scanner-primary", "fingerprint": "cf97ee94547b511d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dcd3381892d8121b", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/server/test/inbox.test.ts:28"}, "properties": {"repobilityId": "33fa851fe0f215ff", "scanner": "scanner-primary", "fingerprint": "dcd3381892d8121b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-77685083d0eeb6b0", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/server/src/portbroker.ts:135"}, "properties": {"repobilityId": "9672a744d0c0ca60", "scanner": "scanner-primary", "fingerprint": "77685083d0eeb6b0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e01d4cf5df54781b", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/server/src/addons.ts:1222"}, "properties": {"repobilityId": "80bb7d899458f09a", "scanner": "scanner-primary", "fingerprint": "e01d4cf5df54781b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d184366740219622", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/server/src/processManager.ts:163"}, "properties": {"repobilityId": "38f7007de71044b7", "scanner": "scanner-primary", "fingerprint": "d184366740219622", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-199db14f9ddbb85b", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/server/src/git.ts:248"}, "properties": {"repobilityId": "eb80f42ac44f712a", "scanner": "scanner-primary", "fingerprint": "199db14f9ddbb85b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8e85ee6e6a651ac8", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/server/src/registry.ts:306"}, "properties": {"repobilityId": "ca256d6730bd20b2", "scanner": "scanner-primary", "fingerprint": "8e85ee6e6a651ac8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-343d687456fe26a4", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/server/src/fileedit.ts:329"}, "properties": {"repobilityId": "88fe4705c0f35b23", "scanner": "scanner-primary", "fingerprint": "343d687456fe26a4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-441872fa67969511", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/server/src/scheduler.ts:328"}, "properties": {"repobilityId": "b120a98d0ee63e66", "scanner": "scanner-primary", "fingerprint": "441872fa67969511", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4af89a8bec2081dc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/server/src/release.ts:89"}, "properties": {"repobilityId": "49f14c7e4084baef", "scanner": "scanner-primary", "fingerprint": "4af89a8bec2081dc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-60e3c8a4aade4619", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/server/src/chat.ts:192"}, "properties": {"repobilityId": "06d9a7b945ae11a9", "scanner": "scanner-primary", "fingerprint": "60e3c8a4aade4619", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-488f23030baa93d0", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/server/src/pm.ts:933"}, "properties": {"repobilityId": "87ac1dfe7561c978", "scanner": "scanner-primary", "fingerprint": "488f23030baa93d0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3600c192e1dd218a", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/server/src/server.ts:171"}, "properties": {"repobilityId": "2a2b22232a371bbb", "scanner": "scanner-primary", "fingerprint": "3600c192e1dd218a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c21c7e31b10965cd", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/server/src/projects.ts:397"}, "properties": {"repobilityId": "5bf5985b0545e285", "scanner": "scanner-primary", "fingerprint": "c21c7e31b10965cd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-24c43d24a9a03cbd", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/server/src/campaigns.ts:193"}, "properties": {"repobilityId": "72349ad7f3dd8dbc", "scanner": "scanner-primary", "fingerprint": "24c43d24a9a03cbd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6b31f8cdbdeed4d1", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/server/src/loops.ts:340"}, "properties": {"repobilityId": "225cdc0a23456f16", "scanner": "scanner-primary", "fingerprint": "6b31f8cdbdeed4d1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-278ea6df5415317d", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/server/src/fleet.ts:104"}, "properties": {"repobilityId": "55213d59465a2785", "scanner": "scanner-primary", "fingerprint": "278ea6df5415317d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1fa12f1c3f4a51cb", "level": "none", "message": {"text": "Commented-code block (8 lines) in apps/server/src/benchmarks.ts:259"}, "properties": {"repobilityId": "955725c786e085fa", "scanner": "scanner-primary", "fingerprint": "1fa12f1c3f4a51cb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-995a569fa59b701f", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/server/src/kanban.ts:115"}, "properties": {"repobilityId": "55c1fed277b46e80", "scanner": "scanner-primary", "fingerprint": "995a569fa59b701f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e5e90e38026f0ab7", "level": "none", "message": {"text": "Commented-code block (7 lines) in desktop/scripts/copy-web.cjs:41"}, "properties": {"repobilityId": "f636c616457bc7bf", "scanner": "scanner-primary", "fingerprint": "e5e90e38026f0ab7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7e8a4411d913eaa1", "level": "none", "message": {"text": "Commented-code block (7 lines) in packages/shared/src/index.ts:933"}, "properties": {"repobilityId": "01867176838897c0", "scanner": "scanner-primary", "fingerprint": "7e8a4411d913eaa1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a1c45cbb5747c6f0", "level": "error", "message": {"text": "Dangling fetch: GET http://127.0.0.1:${TEST_PORT}/health (apps/server/test/addons.test.ts:273)"}, "properties": {"repobilityId": "e590410145238b2a", "scanner": "scanner-primary", "fingerprint": "a1c45cbb5747c6f0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-62411da8af150093", "level": "error", "message": {"text": "Dangling fetch: GET http://127.0.0.1:${TEST_PORT}/health (apps/server/test/cov-addons.test.ts:516)"}, "properties": {"repobilityId": "a79fb7c628551b38", "scanner": "scanner-primary", "fingerprint": "62411da8af150093", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5bd268d52d154ea1", "level": "error", "message": {"text": "Dangling fetch: GET https://api.github.com/repos/${slug}/releases?per_page=20 (apps/server/src/release.ts:137)"}, "properties": {"repobilityId": "4456ffd02fc4ef2d", "scanner": "scanner-primary", "fingerprint": "5bd268d52d154ea1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:fetcher"]}}, {"ruleId": "scanner-988fb34b62c4c25c", "level": "note", "message": {"text": "Unused endpoint: GET /api/notifications"}, "properties": {"repobilityId": "2bfdcd2eb103b881", "scanner": "scanner-primary", "fingerprint": "988fb34b62c4c25c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-056bcbe1b2b108a3", "level": "note", "message": {"text": "Unused endpoint: POST /api/notifications/read"}, "properties": {"repobilityId": "09d9905abe4cb1a0", "scanner": "scanner-primary", "fingerprint": "056bcbe1b2b108a3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f561e4fa8ce2de48", "level": "note", "message": {"text": "Unused endpoint: GET /api/notifications/config"}, "properties": {"repobilityId": "86bf6795d244eb33", "scanner": "scanner-primary", "fingerprint": "f561e4fa8ce2de48", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3f16b775a17b731b", "level": "note", "message": {"text": "Unused endpoint: PUT /api/notifications/config"}, "properties": {"repobilityId": "5c17840b54350075", "scanner": "scanner-primary", "fingerprint": "3f16b775a17b731b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-32dd837f89333747", "level": "note", "message": {"text": "Unused endpoint: POST /api/notifications/test"}, "properties": {"repobilityId": "42431737e08fc71a", "scanner": "scanner-primary", "fingerprint": "32dd837f89333747", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-31bb1a0920cd6cfc", "level": "note", "message": {"text": "Unused endpoint: GET /api/notifier/channels"}, "properties": {"repobilityId": "fe7cb2650415a154", "scanner": "scanner-primary", "fingerprint": "31bb1a0920cd6cfc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c8eec3a63e843070", "level": "note", "message": {"text": "Unused endpoint: PUT /api/notifier/channels"}, "properties": {"repobilityId": "9ceaa5d2e084ac99", "scanner": "scanner-primary", "fingerprint": "c8eec3a63e843070", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1875dd9c5a09b7fb", "level": "note", "message": {"text": "Unused endpoint: POST /api/notifier/channels/:id/test"}, "properties": {"repobilityId": "27de72bfeb60ed42", "scanner": "scanner-primary", "fingerprint": "1875dd9c5a09b7fb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2a40e5fae7f0591d", "level": "note", "message": {"text": "Unused endpoint: GET /api/addons"}, "properties": {"repobilityId": "bb66026baea6c437", "scanner": "scanner-primary", "fingerprint": "2a40e5fae7f0591d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fdb34e427780ad66", "level": "note", "message": {"text": "Unused endpoint: GET /api/addons/:id"}, "properties": {"repobilityId": "305867426b99ed83", "scanner": "scanner-primary", "fingerprint": "fdb34e427780ad66", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4cd15ba3bcf60792", "level": "note", "message": {"text": "Unused endpoint: POST /api/addons/:id/enable"}, "properties": {"repobilityId": "9463c47a84994ed3", "scanner": "scanner-primary", "fingerprint": "4cd15ba3bcf60792", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4868869242e0594a", "level": "note", "message": {"text": "Unused endpoint: POST /api/addons/:id/disable"}, "properties": {"repobilityId": "aea8be2e7a358345", "scanner": "scanner-primary", "fingerprint": "4868869242e0594a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a237df4ae8580aa1", "level": "note", "message": {"text": "Unused endpoint: POST /api/addons/:id/restart"}, "properties": {"repobilityId": "c9d86072345e0db6", "scanner": "scanner-primary", "fingerprint": "a237df4ae8580aa1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-095692f786b818f2", "level": "note", "message": {"text": "Unused endpoint: PUT /api/addons/:id/config"}, "properties": {"repobilityId": "1510c8a75d9e98fe", "scanner": "scanner-primary", "fingerprint": "095692f786b818f2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1edb480f81fa46e2", "level": "note", "message": {"text": "Unused endpoint: GET /api/addons/compression/stats"}, "properties": {"repobilityId": "2e728de52262ecaa", "scanner": "scanner-primary", "fingerprint": "1edb480f81fa46e2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c5b5a3afa8a19652", "level": "note", "message": {"text": "Unused endpoint: POST /api/addons/:id/install"}, "properties": {"repobilityId": "c3c34c9fa6052c93", "scanner": "scanner-primary", "fingerprint": "c5b5a3afa8a19652", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fc0abe8272f531e6", "level": "note", "message": {"text": "Unused endpoint: POST /api/addons/web-research/register-mcp"}, "properties": {"repobilityId": "f5eb8cb2858476cb", "scanner": "scanner-primary", "fingerprint": "fc0abe8272f531e6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1b66bf2b0134d57c", "level": "note", "message": {"text": "Unused endpoint: GET /api/packs"}, "properties": {"repobilityId": "501baf7a0156951b", "scanner": "scanner-primary", "fingerprint": "1b66bf2b0134d57c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5fa750f7beeeb566", "level": "note", "message": {"text": "Unused endpoint: POST /api/packs"}, "properties": {"repobilityId": "d7113f7da93f8120", "scanner": "scanner-primary", "fingerprint": "5fa750f7beeeb566", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-98c781911e5b21dc", "level": "note", "message": {"text": "Unused endpoint: PUT /api/packs/:id"}, "properties": {"repobilityId": "0073e5d21bd98595", "scanner": "scanner-primary", "fingerprint": "98c781911e5b21dc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d6e9e28fd51ba3e1", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/packs/:id"}, "properties": {"repobilityId": "c2f000d58756639c", "scanner": "scanner-primary", "fingerprint": "d6e9e28fd51ba3e1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-13a0c9340610cc47", "level": "note", "message": {"text": "Unused endpoint: GET /api/projects/:pid/files/edit"}, "properties": {"repobilityId": "c316c9e40f40bf8a", "scanner": "scanner-primary", "fingerprint": "13a0c9340610cc47", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a883bffbcbb72730", "level": "note", "message": {"text": "Unused endpoint: POST /api/projects/:pid/files/commit"}, "properties": {"repobilityId": "cb009a01bb4a26a8", "scanner": "scanner-primary", "fingerprint": "a883bffbcbb72730", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a0f97e8d8a4de719", "level": "note", "message": {"text": "Unused endpoint: POST /api/loops/generate"}, "properties": {"repobilityId": "c351b5a7d58df6e6", "scanner": "scanner-primary", "fingerprint": "a0f97e8d8a4de719", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fa5a27dd3a7a8b78", "level": "note", "message": {"text": "Unused endpoint: GET /api/agents/:id/tags"}, "properties": {"repobilityId": "a1721c553e1cfb7f", "scanner": "scanner-primary", "fingerprint": "fa5a27dd3a7a8b78", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ccd48bd569a91317", "level": "note", "message": {"text": "Unused endpoint: POST /api/agents/:id/tags"}, "properties": {"repobilityId": "a3e33a9c1edd7b86", "scanner": "scanner-primary", "fingerprint": "ccd48bd569a91317", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f0205827822f9865", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/agents/:id/tags/:tag"}, "properties": {"repobilityId": "8e44611c75d25e07", "scanner": "scanner-primary", "fingerprint": "f0205827822f9865", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f90bfe720c1d950e", "level": "note", "message": {"text": "Unused endpoint: GET /api/tags"}, "properties": {"repobilityId": "93836aad3e3c9f9f", "scanner": "scanner-primary", "fingerprint": "f90bfe720c1d950e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6d3eb9339b42f743", "level": "note", "message": {"text": "Unused endpoint: GET /api/saved-searches"}, "properties": {"repobilityId": "58964affdd7a1f45", "scanner": "scanner-primary", "fingerprint": "6d3eb9339b42f743", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c565c7aa78b36209", "level": "note", "message": {"text": "Unused endpoint: POST /api/saved-searches"}, "properties": {"repobilityId": "ee12098fa0d21654", "scanner": "scanner-primary", "fingerprint": "c565c7aa78b36209", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-115915aca66834c8", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/saved-searches/:id"}, "properties": {"repobilityId": "ffe051dc61a33bf3", "scanner": "scanner-primary", "fingerprint": "115915aca66834c8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ed8edb984248236d", "level": "note", "message": {"text": "Unused endpoint: GET /api/triggers"}, "properties": {"repobilityId": "f62e6fe047681c35", "scanner": "scanner-primary", "fingerprint": "ed8edb984248236d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4d97a3def034db74", "level": "note", "message": {"text": "Unused endpoint: POST /api/triggers"}, "properties": {"repobilityId": "d7e35370d844e68f", "scanner": "scanner-primary", "fingerprint": "4d97a3def034db74", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0dadc525d4f72a01", "level": "note", "message": {"text": "Unused endpoint: PUT /api/triggers/:id"}, "properties": {"repobilityId": "a72ce2f57b738ab3", "scanner": "scanner-primary", "fingerprint": "0dadc525d4f72a01", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-33077af0c0aff108", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/triggers/:id"}, "properties": {"repobilityId": "cec8d80f503019ac", "scanner": "scanner-primary", "fingerprint": "33077af0c0aff108", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-218c7edd057371cd", "level": "note", "message": {"text": "Unused endpoint: POST /api/triggers/:id/poll"}, "properties": {"repobilityId": "6b819f15aeebf444", "scanner": "scanner-primary", "fingerprint": "218c7edd057371cd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5aae5480ca83b4a2", "level": "note", "message": {"text": "Unused endpoint: GET /api/mcp"}, "properties": {"repobilityId": "fbb81aadd09b2e3f", "scanner": "scanner-primary", "fingerprint": "5aae5480ca83b4a2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2600888d8e3b41d3", "level": "note", "message": {"text": "Unused endpoint: GET /api/mcp/:name"}, "properties": {"repobilityId": "a66e87a6eaaf77d3", "scanner": "scanner-primary", "fingerprint": "2600888d8e3b41d3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9b503dc869f46631", "level": "note", "message": {"text": "Unused endpoint: GET /api/agents/:id/scores"}, "properties": {"repobilityId": "f99178902b9cc705", "scanner": "scanner-primary", "fingerprint": "9b503dc869f46631", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ccc4cd45238fae24", "level": "note", "message": {"text": "Unused endpoint: POST /api/agents/:id/scores"}, "properties": {"repobilityId": "cec3099abf625552", "scanner": "scanner-primary", "fingerprint": "ccc4cd45238fae24", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a6d8c504b16f909c", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/scores/:scoreId"}, "properties": {"repobilityId": "9ae0148b6ea665b9", "scanner": "scanner-primary", "fingerprint": "a6d8c504b16f909c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0c7b6742654a43b8", "level": "note", "message": {"text": "Unused endpoint: GET /api/scores/summary"}, "properties": {"repobilityId": "a878a28f808f27e9", "scanner": "scanner-primary", "fingerprint": "0c7b6742654a43b8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fee3a4723f9aa9f4", "level": "note", "message": {"text": "Unused endpoint: POST /v1/metrics"}, "properties": {"repobilityId": "0fe75bf6dbb64698", "scanner": "scanner-primary", "fingerprint": "fee3a4723f9aa9f4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-aa249daa165bb136", "level": "note", "message": {"text": "Unused endpoint: POST /v1/logs"}, "properties": {"repobilityId": "c78e91721810ac57", "scanner": "scanner-primary", "fingerprint": "aa249daa165bb136", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f7aa656a006dd9dc", "level": "note", "message": {"text": "Unused endpoint: GET /api/agents/:id/otel"}, "properties": {"repobilityId": "51e9147303425d6c", "scanner": "scanner-primary", "fingerprint": "f7aa656a006dd9dc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0ea3ea18d60e9f7a", "level": "note", "message": {"text": "Unused endpoint: POST /api/projects/:pid/plan"}, "properties": {"repobilityId": "a1493fff039fb920", "scanner": "scanner-primary", "fingerprint": "0ea3ea18d60e9f7a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-447ad7aac4bfe8ad", "level": "note", "message": {"text": "Unused endpoint: GET /api/projects/:pid/plans"}, "properties": {"repobilityId": "b006512eb2caf07c", "scanner": "scanner-primary", "fingerprint": "447ad7aac4bfe8ad", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9456fd6f618866b4", "level": "note", "message": {"text": "Unused endpoint: GET /api/plans/:id"}, "properties": {"repobilityId": "cfb2182692494e6b", "scanner": "scanner-primary", "fingerprint": "9456fd6f618866b4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-070ec9245e6800d7", "level": "note", "message": {"text": "Unused endpoint: POST /api/plans/:id/apply"}, "properties": {"repobilityId": "9d5c56bcbb6bccd3", "scanner": "scanner-primary", "fingerprint": "070ec9245e6800d7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4602a334a6124d4f", "level": "note", "message": {"text": "Unused endpoint: GET /api/learner"}, "properties": {"repobilityId": "e42a937c3aafb266", "scanner": "scanner-primary", "fingerprint": "4602a334a6124d4f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}