{"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-690fda69a69c07b5", "name": "Stray `console.log` in TS/JS \u2014 frontend/desktop/helpers/logger.ts:35", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/desktop/helpers/logger.ts:35"}, "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-f41309bd5e63dd62", "name": "Stray `console.log` in TS/JS \u2014 frontend/src/proxy.ts:125", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/proxy.ts:125"}, "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-7346da49d5115879", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/ui/list.tsx:302", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/ui/list.tsx:302"}, "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-c971985acbcf4c66", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/ui/page.tsx:46", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/ui/page.tsx:46"}, "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-604596e8dae9b7b9", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/ui/huggingface-model-card.tsx:239", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/ui/huggingface-model-card.tsx:239"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5d9ef70271f85761", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/ui/right-detail-panel.tsx:43", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/ui/right-detail-panel.tsx:43"}, "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-2b2b15c5eeda1af3", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/ui/drawer.tsx:62", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/ui/drawer.tsx:62"}, "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-6330676672000761", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/layout.tsx:84", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/layout.tsx:84"}, "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-6884a64229746dde", "name": "Stray `console.log` in TS/JS \u2014 frontend/src/app/api/proxy/[...path]/route.ts:408", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/app/api/proxy/[...path]/route.ts:408"}, "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-915f2ab7aa73e472", "name": "Stray `console.log` in TS/JS \u2014 frontend/src/lib/data-dir.ts:76", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/lib/data-dir.ts:76"}, "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-495f316cb11e37ce", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/settings/appearance-settings.tsx:453", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/settings/appearance-settings.tsx:453"}, "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-d761d57e27e18bfd", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/usage/model-performance-table.tsx:295", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/usage/model-performance-table.tsx:295"}, "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-41cd0e11650f29c9", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/usage/secondary-metrics.tsx:43", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/usage/secondary-metrics.tsx:43"}, "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-139144645c9f189c", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/usage/usage-page.tsx:80", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/usage/usage-page.tsx:80"}, "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-c8f1a511a314d8ac", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/usage/daily-usage-chart.tsx:141", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/usage/daily-usage-chart.tsx:141"}, "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-826d43f8007d4674", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/dashboard/control-panel/control-panel-v2.tsx:", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/dashboard/control-panel/control-panel-v2.tsx:212"}, "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-9224523b408f0690", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/dashboard/control-panel/status-section-parts.", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/dashboard/control-panel/status-section-parts.tsx:247"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a52ee418ddee30c2", "name": "Stray `console.log` in TS/JS \u2014 frontend/src/features/agent/trace-reasoning.ts:17", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/features/agent/trace-reasoning.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-028cfbbb99155f85", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/filesystem-tree.tsx:28", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/filesystem-tree.tsx:28"}, "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-936b001726bf2167", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/features/agent/ui/filesystem-file-viewer.tsx:132", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/features/agent/ui/filesystem-file-viewer.tsx:132"}, "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-c1014070ca780af4", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/agent-workspace-shell.tsx:154", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/agent-workspace-shell.tsx:154"}, "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-ba759b92190057e4", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/agent-browser-panel.tsx:308", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/agent-browser-panel.tsx:308"}, "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-c17cf151d7c84ed1", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/features/agent/ui/assistant-markdown.tsx:112", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/features/agent/ui/assistant-markdown.tsx:112"}, "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-7ab120200428e894", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/agent-queue-panel.tsx:57", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/agent-queue-panel.tsx:57"}, "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-51475aa268bf4ddf", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/agent-composer-context.tsx:129", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/agent-composer-context.tsx:129"}, "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-7d3eedc676ee85ae", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/computer-status-panel.tsx:248", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/computer-status-panel.tsx:248"}, "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-c6a41b86bb8cdcb7", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/filesystem-panel.tsx:263", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/filesystem-panel.tsx:263"}, "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-8c570de0cf1a0675", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/git-diff-panel.tsx:338", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/git-diff-panel.tsx:338"}, "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-8cc68c968eab7967", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/agent-attachment-tray.tsx:36", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/agent-attachment-tray.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-80ca106467624de0", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/agent-model-picker.tsx:58", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/agent-model-picker.tsx:58"}, "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-6da72aee4850d53f", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/canvas-panel.tsx:29", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/canvas-panel.tsx:29"}, "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-48d843c621fecdbd", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/sessions-command.tsx:317", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/sessions-command.tsx:317"}, "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-c9becd2c1c2f207a", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/agent-composer-status-bar.tsx:71", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/agent-composer-status-bar.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-36d86e5ba924ac88", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/agent-browser-screencast.tsx:281", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/agent-browser-screencast.tsx:281"}, "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-90527c5489aef876", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/agent-browser.tsx:356", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/agent-browser.tsx:356"}, "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-bde5cb0193e99729", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/timeline/session-pane-block-router.t", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/timeline/session-pane-block-router.tsx:309"}, "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-6691988376921668", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/timeline/tool-block-view.tsx:125", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/timeline/tool-block-view.tsx:125"}, "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-2bd615d2d9845a88", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/features/agent/ui/timeline/tool-block-view.tsx:200", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/features/agent/ui/timeline/tool-block-view.tsx:200"}, "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-8a375abab04e72c7", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/projects-nav/directory-picker-modal.", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/projects-nav/directory-picker-modal.tsx:121"}, "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-498249dccdfcb05f", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/projects-nav/session-rows.tsx:77", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/projects-nav/session-rows.tsx:77"}, "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-9eee76caa6683102", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/projects-nav/session-nav-row.tsx:280", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/projects-nav/session-nav-row.tsx:280"}, "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-378dffe2d351497e", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/logs/server-view.tsx:110", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/logs/server-view.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-6e288394994c5780", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/logs/logs-view.tsx:100", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/logs/logs-view.tsx:100"}, "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-fd5484efa48f9a05", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/logs/logs-sessions-sidebar.tsx:58", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/logs/logs-sessions-sidebar.tsx:58"}, "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-25e30c7b38232e71", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/discover/discover-view.tsx:189", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/discover/discover-view.tsx:189"}, "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-4b1533099c7d2451", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/discover/discover/discover-download-queue.tsx", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/discover/discover/discover-download-queue.tsx:53"}, "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-e0bf3fcfc506ab9f", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/recipes/recipes-content/recipes-content-view.", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/recipes/recipes-content/recipes-content-view.tsx:115"}, "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-d3eaa483ed2ac51f", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/shell/left-sidebar.tsx:259", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/shell/left-sidebar.tsx:259"}, "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-ae0dc4d55db8a2e4", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/plugins/plugins-page-parts.tsx:129", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/plugins/plugins-page-parts.tsx:129"}, "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-012264819aeb9f8b", "name": "Stray `console.log` in TS/JS \u2014 cli/src/render.ts:51", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 cli/src/render.ts:51"}, "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-f80de91be4e88bc9", "name": "Stray `console.log` in TS/JS \u2014 cli/src/headless.ts:6", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 cli/src/headless.ts:6"}, "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-a812bbdc378bedbc", "name": "Stray `console.log` in TS/JS \u2014 controller/scripts/controller-standards-audit.ts:89", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 controller/scripts/controller-standards-audit.ts:89"}, "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-194024ead9fbc920", "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-faa134129e5545ff", "name": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fb7d076d4355845a", "name": "Dockerfile runs as root: controller/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: controller/Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6375e02afd41af93", "name": "Docker base image is tag-pinned but not digest-pinned: oven/bun:1.3.9", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: oven/bun:1.3.9"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c9b9ceb6c86bfded", "name": "Insecure pattern 'node_child_process' in frontend/scripts/start-standalone.mjs:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in frontend/scripts/start-standalone.mjs:2"}, "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-c72872e83b273487", "name": "Insecure pattern 'node_child_process' in frontend/desktop/resources/pi-extensions/mcp-plugin.ts:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in frontend/desktop/resources/pi-extensions/mcp-plugin.ts:1"}, "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-ed46f2e8a953f0fc", "name": "Insecure pattern 'node_child_process' in frontend/desktop/logic/app-server.ts:4", "shortDescription": {"text": "Insecure pattern 'node_child_process' in frontend/desktop/logic/app-server.ts:4"}, "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-4052542b2ba9cfea", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/layout.tsx:84", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/layout.tsx:84"}, "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-ffce250e8d047320", "name": "Insecure pattern 'node_child_process' in frontend/src/app/api/agent/terminal/route.ts:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in frontend/src/app/api/agent/terminal/route.ts:1"}, "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-9a8d4bdf51a572c1", "name": "Insecure pattern 'node_child_process' in frontend/src/app/api/agent/browser/localhosts/route.ts:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in frontend/src/app/api/agent/browser/localhosts/route.ts:1"}, "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-e5cfadf8b38107e3", "name": "Insecure pattern 'node_child_process' in frontend/src/features/agent/git.ts:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in frontend/src/features/agent/git.ts:1"}, "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-bc200a4a58f0cde7", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/features/agent/ui/filesystem-file-viewer.tsx:132", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/features/agent/ui/filesystem-file-viewer.tsx:132"}, "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-1900cf628c11ccdb", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/features/agent/ui/assistant-markdown.tsx:112", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/features/agent/ui/assistant-markdown.tsx:112"}, "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-6ccf27644eb82696", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/features/agent/ui/timeline/tool-block-view.tsx:200", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/features/agent/ui/timeline/tool-block-view.tsx:200"}, "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-ca1b328f72bd691c", "name": "Insecure pattern 'node_child_process' in frontend/src/features/agent/browser-host/chrome.ts:10", "shortDescription": {"text": "Insecure pattern 'node_child_process' in frontend/src/features/agent/browser-host/chrome.ts:10"}, "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-20a79b5485bb70eb", "name": "Insecure pattern 'node_child_process' in scripts/release-statement.mjs:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/release-statement.mjs:2"}, "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-0c1ba207bd7dbbd3", "name": "Insecure pattern 'node_child_process' in scripts/check-conventional-commits.mjs:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/check-conventional-commits.mjs:2"}, "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-94ab8f936af5033e", "name": "Insecure pattern 'node_child_process' in controller/src/modules/engines/process/process-utilities.ts:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in controller/src/modules/engines/process/process-utilities.ts:1"}, "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-7b8231ce9d4e445c", "name": "Insecure pattern 'node_child_process' in controller/src/modules/engines/process/process-manager.ts:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in controller/src/modules/engines/process/process-manager.ts:1"}, "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-f3c238648835ed35", "name": "Insecure pattern 'node_child_process' in controller/src/modules/engines/runtimes/engine-jobs.ts:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in controller/src/modules/engines/runtimes/engine-jobs.ts:1"}, "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-9173a84cfde80f7b", "name": "Insecure pattern 'node_child_process' in controller/src/modules/system/logs-routes.ts:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in controller/src/modules/system/logs-routes.ts:1"}, "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-f7ee901d62c2a800", "name": "Insecure pattern 'node_child_process' in controller/src/services/cli-runner.ts:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in controller/src/services/cli-runner.ts:1"}, "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-8156b682b09495df", "name": "Insecure pattern 'node_child_process' in controller/src/core/command.ts:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in controller/src/core/command.ts:1"}, "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-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-0dc9d15d9a86a2ef", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "docker/setup-buildx-action@v3 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-244a0d5972d41a82", "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-21aa0c39a7c1ca23", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "trufflesecurity/trufflehog@v3 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2c6df24be520b8e8", "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-f12562ea7124e9ce", "name": "package.json defines install-time lifecycle scripts", "shortDescription": {"text": "package.json defines install-time lifecycle scripts"}, "fullDescription": {"text": "preinstall/install/postinstall/prepare scripts execute during dependency installation. Review them carefully for network calls, obfuscation, shell execution, or credential access."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cc9c8dcf1de0ad41", "name": "Very large file: tests/frontend/e2e/agent-session-runtime-regressions.test.ts (1847 lines)", "shortDescription": {"text": "Very large file: tests/frontend/e2e/agent-session-runtime-regressions.test.ts (1847 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "29 test file(s) for 536 source file(s) (ratio 0.05). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "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 32 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 139 placeholder/mock markers across 42 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-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-cbb883306d8f1185", "name": "Agent authority lacks a verifier contract: frontend/AGENTS.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: frontend/AGENTS.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5cc18e0e2898eb94", "name": "Agent authority lacks a verifier contract: frontend/desktop/resources/skills/canvas/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: frontend/desktop/resources/skills/canvas/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0333ec5054ba1f1f", "name": "Agent authority lacks a verifier contract: frontend/desktop/resources/skills/browser/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: frontend/desktop/resources/skills/browser/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-75807dcc524448bc", "name": "Agent authority lacks a verifier contract: frontend/desktop/resources/skills/parchi-browser/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: frontend/desktop/resources/skills/parchi-browser/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d4ffea6112d1e6fe", "name": "Commented-code block (8 lines) in frontend/next.config.ts:15", "shortDescription": {"text": "Commented-code block (8 lines) in frontend/next.config.ts:15"}, "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-a3bd3ee2740ad76b", "name": "Commented-code block (8 lines) in frontend/scripts/validate-ui-structure.mjs:2", "shortDescription": {"text": "Commented-code block (8 lines) in frontend/scripts/validate-ui-structure.mjs:2"}, "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-77d1ae0d6a9cf5be", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/desktop/resources/pi-extensions/browser.ts:55", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/desktop/resources/pi-extensions/browser.ts:55"}, "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-07fea576628e864e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/desktop/resources/pi-extensions/canvas.ts:32", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/desktop/resources/pi-extensions/canvas.ts:32"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-771a9729da9e4b79", "name": "Commented-code block (5 lines) in frontend/desktop/resources/pi-extensions/mcp-plugin.ts:279", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/desktop/resources/pi-extensions/mcp-plugin.ts:279"}, "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-3868d19c105b57c2", "name": "Commented-code block (5 lines) in frontend/src/proxy.ts:22", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/proxy.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-386b9e9e3013ca62", "name": "Commented-code block (6 lines) in frontend/src/app/error.tsx:7", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/app/error.tsx: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-f32723e00c4f428e", "name": "Commented-code block (5 lines) in frontend/src/app/chunk-recovery.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/app/chunk-recovery.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-fead8c91fbcdf6e1", "name": "Commented-code block (6 lines) in frontend/src/app/api/agent/browser/input/route.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/app/api/agent/browser/input/route.ts:1"}, "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-b707db64e8b1c199", "name": "Commented-code block (6 lines) in frontend/src/app/api/proxy/[...path]/route.ts:109", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/app/api/proxy/[...path]/route.ts:109"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-42005bd2725da7c4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/voice/speak/route.ts:72", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/voice/speak/route.ts:72"}, "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-94c4a05f769920fe", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/voice/transcribe/route.ts:42", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/voice/transcribe/route.ts:42"}, "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-19917680d52c34af", "name": "Commented-code block (5 lines) in frontend/src/lib/auth/guard.ts:18", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/lib/auth/guard.ts:18"}, "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-1a4a85d198b92811", "name": "Commented-code block (5 lines) in frontend/src/lib/api/core.ts:174", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/lib/api/core.ts:174"}, "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-08d6a84b46fd8203", "name": "Commented-code block (6 lines) in frontend/src/hooks/use-controller-events.ts:76", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/hooks/use-controller-events.ts:76"}, "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-5521e54480ffdf9f", "name": "Commented-code block (6 lines) in frontend/src/hooks/realtime-status-store.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/hooks/realtime-status-store.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-e9b278f89a98f9d8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/settings/api-connection-section.tsx:124", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/settings/api-connection-section.tsx:124"}, "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-c56cd2cc4ecfac0e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/dashboard/control-panel/control-panel-v2.tsx:157", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/dashboard/control-panel/control-panel-v2.tsx:157"}, "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-0dc5cbaf551081bc", "name": "Commented-code block (5 lines) in frontend/src/features/agent/pi-runtime-types.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/features/agent/pi-runtime-types.ts:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fa562fd76808324a", "name": "Commented-code block (7 lines) in frontend/src/features/agent/prompt-templates-store.ts:1", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/features/agent/prompt-templates-store.ts:1"}, "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-03d536f330bc00db", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/agent/pi-runtime-models.ts:138", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/agent/pi-runtime-models.ts:138"}, "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-9a44ac5c4993fc4b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/agent/projects/api.ts:26", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/agent/projects/api.ts:26"}, "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-e1e633910d6473c6", "name": "Commented-code block (5 lines) in frontend/src/features/agent/mcp/store.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/features/agent/mcp/store.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-06a727a2c1cb930b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/agent/ui/chat-pane.tsx:510", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/agent/ui/chat-pane.tsx:510"}, "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-c6d4bd43570a0bdd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/agent/ui/filesystem-panel.tsx:470", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/agent/ui/filesystem-panel.tsx:470"}, "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-8ad37d76fe0411b3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/agent/ui/git-diff-panel.tsx:511", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/agent/ui/git-diff-panel.tsx:511"}, "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-376e61aa5f6ae6c8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/agent/ui/agent-browser-screencast.tsx:124", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/agent/ui/agent-browser-screencast.tsx:124"}, "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-ca43fe87a82674e5", "name": "Commented-code block (6 lines) in frontend/src/features/agent/ui/use-workspace.ts:221", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/features/agent/ui/use-workspace.ts:221"}, "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-61360ae8366e6ba3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/agent/ui/use-workspace.ts:130", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/agent/ui/use-workspace.ts:130"}, "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-cbf2005ddf6f448a", "name": "Commented-code block (5 lines) in frontend/src/features/agent/ui/timeline/session-pane-block-router.tsx:158", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/features/agent/ui/timeline/session-pane-block-router.tsx:158"}, "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-afa5ce6bc4babaf4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/agent/ui/projects-nav/helpers.ts:115", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/agent/ui/projects-nav/helpers.ts:115"}, "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-cf3f90622e1eb791", "name": "Commented-code block (6 lines) in frontend/src/features/agent/workspace/commands.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/features/agent/workspace/commands.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-e09bf62e113a1db1", "name": "Commented-code block (6 lines) in frontend/src/features/agent/workspace/replay-queue.ts:24", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/features/agent/workspace/replay-queue.ts:24"}, "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-ca964ef87658cad9", "name": "Commented-code block (8 lines) in frontend/src/features/agent/workspace/reducer.ts:148", "shortDescription": {"text": "Commented-code block (8 lines) in frontend/src/features/agent/workspace/reducer.ts:148"}, "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-ee19a56b30fe6f5a", "name": "Commented-code block (5 lines) in frontend/src/features/agent/workspace/pane-controller.ts:377", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/features/agent/workspace/pane-controller.ts:377"}, "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-7ec276cfb56ca715", "name": "Commented-code block (7 lines) in frontend/src/features/agent/messages/message-content.ts:115", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/features/agent/messages/message-content.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-7ac8a34411cdafc7", "name": "Commented-code block (6 lines) in frontend/src/features/agent/messages/helpers.ts:277", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/features/agent/messages/helpers.ts:277"}, "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-86ebdb68b2f538c9", "name": "Commented-code block (5 lines) in frontend/src/features/agent/messages/block-event.ts:38", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/features/agent/messages/block-event.ts:38"}, "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-5e2a7aa021f96bf7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/agent/runtime/api.ts:101", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/agent/runtime/api.ts:101"}, "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-958d01b12aa75762", "name": "Commented-code block (5 lines) in frontend/src/features/agent/runtime/pi-event-applier.ts:108", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/features/agent/runtime/pi-event-applier.ts:108"}, "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-9cf9194cc08881fd", "name": "Commented-code block (9 lines) in frontend/src/features/agent/runtime/session-runtime-controller.ts:1", "shortDescription": {"text": "Commented-code block (9 lines) in frontend/src/features/agent/runtime/session-runtime-controller.ts:1"}, "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-5cc48846e682355d", "name": "Commented-code block (9 lines) in frontend/src/features/agent/runtime/text-delta-coalescer.ts:44", "shortDescription": {"text": "Commented-code block (9 lines) in frontend/src/features/agent/runtime/text-delta-coalescer.ts:44"}, "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-b6ab4bf6f6636daa", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/agent/tools/context.tsx:500", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/agent/tools/context.tsx:500"}, "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-0c9d76b7d302ff93", "name": "Commented-code block (5 lines) in frontend/src/features/agent/tools/types.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/features/agent/tools/types.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-45d794c21a090b68", "name": "Commented-code block (5 lines) in frontend/src/features/agent/browser-host/dom-scripts.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/features/agent/browser-host/dom-scripts.ts:1"}, "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-2aa6068c85a8cf46", "name": "Commented-code block (6 lines) in frontend/src/features/agent/browser-host/cdp.ts:40", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/features/agent/browser-host/cdp.ts:40"}, "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-40496e2b5c8dd3cc", "name": "Commented-code block (5 lines) in frontend/src/features/agent/browser-host/browser-host.ts:521", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/features/agent/browser-host/browser-host.ts:521"}, "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-a67bdc5d94412275", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/agent/browser-host/browser-host.ts:60", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/agent/browser-host/browser-host.ts:60"}, "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-08318a5e69369872", "name": "Commented-code block (6 lines) in tests/controller/integration/tool-call-stream.test.ts:50", "shortDescription": {"text": "Commented-code block (6 lines) in tests/controller/integration/tool-call-stream.test.ts:50"}, "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-456bf4aec3fc04a0", "name": "Commented-code block (5 lines) in scripts/validate-barrel-dir-siblings.mjs:2", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/validate-barrel-dir-siblings.mjs:2"}, "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-7ee84e56059d5577", "name": "Commented-code block (5 lines) in controller/src/http/app.ts:95", "shortDescription": {"text": "Commented-code block (5 lines) in controller/src/http/app.ts:95"}, "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-8928909a7bd28549", "name": "`fetch()` without try/.catch or AbortSignal \u2014 controller/src/http/app.ts:127", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 controller/src/http/app.ts:127"}, "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-fa9c29599068306c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 controller/src/modules/engines/downloads/download-manager.ts:328", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 controller/src/modules/engines/downloads/download-manager.ts:328"}, "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-03576dfd68ce47ee", "name": "`fetch()` without try/.catch or AbortSignal \u2014 controller/src/modules/engines/downloads/huggingface-api.ts:40", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 controller/src/modules/engines/downloads/huggingface-api.ts:40"}, "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-0ac02f7ab546d4a6", "name": "Commented-code block (5 lines) in controller/src/modules/proxy/reasoning-fields.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in controller/src/modules/proxy/reasoning-fields.ts:1"}, "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-768306a346cf490d", "name": "50 env vars used in code but missing from .env.example", "shortDescription": {"text": "50 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ANALYZE`, `COMSPEC`, `E2E_BASE_URL`, `NEXT_PUBLIC_BACKEND_URL`, `NEXT_PUBLIC_VOICE_MODEL`, `NEXT_PUBLIC_VOICE_URL`, `NODE_ENV`, `PARCHI_RELAY_ORIGIN` + 42 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-04d33909f1b92531", "name": "Dangling fetch: GET /api/huggingface/model-card?modelId=${encodeURIComponent(modelId)} (frontend/src/ui/huggingface-mode", "shortDescription": {"text": "Dangling fetch: GET /api/huggingface/model-card?modelId=${encodeURIComponent(modelId)} (frontend/src/ui/huggingface-model-card.tsx:129)"}, "fullDescription": {"text": "`frontend/src/ui/huggingface-model-card.tsx:129` calls `GET /api/huggingface/model-card?modelId=${encodeURIComponent(modelId)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/huggingface/model-card`\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-8072de2a28e709d2", "name": "Dangling fetch: GET /peak-metrics${query} (frontend/src/lib/api/system.ts:101)", "shortDescription": {"text": "Dangling fetch: GET /peak-metrics${query} (frontend/src/lib/api/system.ts:101)"}, "fullDescription": {"text": "`frontend/src/lib/api/system.ts:101` calls `GET /peak-metrics${query}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/peak-metrics/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e54bde01b1d64313", "name": "Dangling fetch: GET /logs/${sessionId}${query} (frontend/src/lib/api/logs.ts:10)", "shortDescription": {"text": "Dangling fetch: GET /logs/${sessionId}${query} (frontend/src/lib/api/logs.ts:10)"}, "fullDescription": {"text": "`frontend/src/lib/api/logs.ts:10` calls `GET /logs/${sessionId}${query}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/logs/<p>/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8f8f101dc143b6b0", "name": "Dangling fetch: POST /api/settings (frontend/src/features/settings/api-connection-section.tsx:124)", "shortDescription": {"text": "Dangling fetch: POST /api/settings (frontend/src/features/settings/api-connection-section.tsx:124)"}, "fullDescription": {"text": "`frontend/src/features/settings/api-connection-section.tsx:124` calls `POST /api/settings` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/settings`\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-b5d3a53fccd0edad", "name": "Dangling fetch: GET /api/agent/sessions/all?archived=1 (frontend/src/features/settings/agent-settings-sections.tsx:32)", "shortDescription": {"text": "Dangling fetch: GET /api/agent/sessions/all?archived=1 (frontend/src/features/settings/agent-settings-sections.tsx:32)"}, "fullDescription": {"text": "`frontend/src/features/settings/agent-settings-sections.tsx:32` calls `GET /api/agent/sessions/all?archived=1` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent/sessions/all`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5807ca7d74500d9b", "name": "Dangling fetch: PATCH /api/agent/sessions/${encodeURIComponent(session.id)} (frontend/src/features/settings/agent-settin", "shortDescription": {"text": "Dangling fetch: PATCH /api/agent/sessions/${encodeURIComponent(session.id)} (frontend/src/features/settings/agent-settings-sections.tsx:59)"}, "fullDescription": {"text": "`frontend/src/features/settings/agent-settings-sections.tsx:59` calls `PATCH /api/agent/sessions/${encodeURIComponent(session.id)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent/sessions/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-dd2cae7fdc7f748c", "name": "Dangling fetch: GET /api/agent/skills (frontend/src/features/settings/agent-settings-sections.tsx:135)", "shortDescription": {"text": "Dangling fetch: GET /api/agent/skills (frontend/src/features/settings/agent-settings-sections.tsx:135)"}, "fullDescription": {"text": "`frontend/src/features/settings/agent-settings-sections.tsx:135` calls `GET /api/agent/skills` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent/skills`\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-a71b904134466e05", "name": "Dangling fetch: GET /api/agent/setup-checks (frontend/src/features/settings/agent-settings-sections.tsx:181)", "shortDescription": {"text": "Dangling fetch: GET /api/agent/setup-checks (frontend/src/features/settings/agent-settings-sections.tsx:181)"}, "fullDescription": {"text": "`frontend/src/features/settings/agent-settings-sections.tsx:181` calls `GET /api/agent/setup-checks` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent/setup-checks`\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-8198fcd37de790ef", "name": "Dangling fetch: GET /api/settings (frontend/src/features/settings/use-settings.ts:68)", "shortDescription": {"text": "Dangling fetch: GET /api/settings (frontend/src/features/settings/use-settings.ts:68)"}, "fullDescription": {"text": "`frontend/src/features/settings/use-settings.ts:68` calls `GET /api/settings` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/settings`\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-e1c5394fd30094c8", "name": "Dangling fetch: POST /api/settings (frontend/src/features/settings/use-settings.ts:178)", "shortDescription": {"text": "Dangling fetch: POST /api/settings (frontend/src/features/settings/use-settings.ts:178)"}, "fullDescription": {"text": "`frontend/src/features/settings/use-settings.ts:178` calls `POST /api/settings` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/settings`\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-7a9dea2126fe775c", "name": "Dangling fetch: GET /api/local-agents (frontend/src/features/settings/attach-local-agents-dialog.tsx:22)", "shortDescription": {"text": "Dangling fetch: GET /api/local-agents (frontend/src/features/settings/attach-local-agents-dialog.tsx:22)"}, "fullDescription": {"text": "`frontend/src/features/settings/attach-local-agents-dialog.tsx:22` calls `GET /api/local-agents` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/local-agents`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a38a5be3cb6d8dd2", "name": "Dangling fetch: POST /api/local-agents (frontend/src/features/settings/attach-local-agents-dialog.tsx:48)", "shortDescription": {"text": "Dangling fetch: POST /api/local-agents (frontend/src/features/settings/attach-local-agents-dialog.tsx:48)"}, "fullDescription": {"text": "`frontend/src/features/settings/attach-local-agents-dialog.tsx:48` calls `POST /api/local-agents` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/local-agents`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f21e38dd68e305f1", "name": "Dangling fetch: POST /api/settings (frontend/src/features/dashboard/control-panel/control-panel-v2.tsx:157)", "shortDescription": {"text": "Dangling fetch: POST /api/settings (frontend/src/features/dashboard/control-panel/control-panel-v2.tsx:157)"}, "fullDescription": {"text": "`frontend/src/features/dashboard/control-panel/control-panel-v2.tsx:157` calls `POST /api/settings` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/settings`\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-0951ec0419b1b2dc", "name": "Dangling fetch: GET /api/agent/projects (frontend/src/features/agent/projects/api.ts:26)", "shortDescription": {"text": "Dangling fetch: GET /api/agent/projects (frontend/src/features/agent/projects/api.ts:26)"}, "fullDescription": {"text": "`frontend/src/features/agent/projects/api.ts:26` calls `GET /api/agent/projects` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent/projects`\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-77500eaf32374969", "name": "Dangling fetch: POST /api/agent/projects (frontend/src/features/agent/projects/api.ts:38)", "shortDescription": {"text": "Dangling fetch: POST /api/agent/projects (frontend/src/features/agent/projects/api.ts:38)"}, "fullDescription": {"text": "`frontend/src/features/agent/projects/api.ts:38` calls `POST /api/agent/projects` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent/projects`\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-636f04479b4d65a0", "name": "Dangling fetch: DELETE /api/agent/projects?id=${encodeURIComponent(id)} (frontend/src/features/agent/projects/api.ts:56)", "shortDescription": {"text": "Dangling fetch: DELETE /api/agent/projects?id=${encodeURIComponent(id)} (frontend/src/features/agent/projects/api.ts:56)"}, "fullDescription": {"text": "`frontend/src/features/agent/projects/api.ts:56` calls `DELETE /api/agent/projects?id=${encodeURIComponent(id)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent/projects`\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-1bc932e597c35081", "name": "Dangling fetch: GET /api/agent/git?cwd=${encodeURIComponent(cwd)} (frontend/src/features/agent/projects/api.ts:66)", "shortDescription": {"text": "Dangling fetch: GET /api/agent/git?cwd=${encodeURIComponent(cwd)} (frontend/src/features/agent/projects/api.ts:66)"}, "fullDescription": {"text": "`frontend/src/features/agent/projects/api.ts:66` calls `GET /api/agent/git?cwd=${encodeURIComponent(cwd)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent/git`\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-7647aea933215024", "name": "Dangling fetch: POST /api/agent/git?cwd=${encodeURIComponent(cwd)} (frontend/src/features/agent/projects/api.ts:80)", "shortDescription": {"text": "Dangling fetch: POST /api/agent/git?cwd=${encodeURIComponent(cwd)} (frontend/src/features/agent/projects/api.ts:80)"}, "fullDescription": {"text": "`frontend/src/features/agent/projects/api.ts:80` calls `POST /api/agent/git?cwd=${encodeURIComponent(cwd)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent/git`\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-87ba8fa24a945a13", "name": "Dangling fetch: GET /api/agent/fs?cwd=${encodeURIComponent(cwd)} (frontend/src/features/agent/ui/chat-pane.tsx:510)", "shortDescription": {"text": "Dangling fetch: GET /api/agent/fs?cwd=${encodeURIComponent(cwd)} (frontend/src/features/agent/ui/chat-pane.tsx:510)"}, "fullDescription": {"text": "`frontend/src/features/agent/ui/chat-pane.tsx:510` calls `GET /api/agent/fs?cwd=${encodeURIComponent(cwd)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent/fs`\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-22ff60242a4c3973", "name": "Dangling fetch: GET /api/agent/fs?cwd=${encodeURIComponent(requestCwd)}&path=${encodeURIComponent(dirRel)} (frontend/src", "shortDescription": {"text": "Dangling fetch: GET /api/agent/fs?cwd=${encodeURIComponent(requestCwd)}&path=${encodeURIComponent(dirRel)} (frontend/src/features/agent/ui/filesystem-panel.tsx:71)"}, "fullDescription": {"text": "`frontend/src/features/agent/ui/filesystem-panel.tsx:71` calls `GET /api/agent/fs?cwd=${encodeURIComponent(requestCwd)}&path=${encodeURIComponent(dirRel)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent/fs`\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-c3a02d581d80cfaa", "name": "Dangling fetch: POST /api/agent/comments (frontend/src/features/agent/ui/filesystem-panel.tsx:124)", "shortDescription": {"text": "Dangling fetch: POST /api/agent/comments (frontend/src/features/agent/ui/filesystem-panel.tsx:124)"}, "fullDescription": {"text": "`frontend/src/features/agent/ui/filesystem-panel.tsx:124` calls `POST /api/agent/comments` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent/comments`\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-7820f0bbb249339d", "name": "Dangling fetch: DELETE /api/agent/comments?cwd=${encodeURIComponent(cwd)}&path=${encodeURIComponent(openFile)}&id=${enco", "shortDescription": {"text": "Dangling fetch: DELETE /api/agent/comments?cwd=${encodeURIComponent(cwd)}&path=${encodeURIComponent(openFile)}&id=${encodeURIComponent(id)} (frontend/src/features/agent/ui/filesystem-panel.tsx:142)"}, "fullDescription": {"text": "`frontend/src/features/agent/ui/filesystem-panel.tsx:142` calls `DELETE /api/agent/comments?cwd=${encodeURIComponent(cwd)}&path=${encodeURIComponent(openFile)}&id=${encodeURIComponent(id)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent/comments`\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-1710301f8ed9be85", "name": "Dangling fetch: GET /api/agent/fs?cwd=${encodeURIComponent(cwd)}&path=${encodeURIComponent(relPath)} (frontend/src/featu", "shortDescription": {"text": "Dangling fetch: GET /api/agent/fs?cwd=${encodeURIComponent(cwd)}&path=${encodeURIComponent(relPath)} (frontend/src/features/agent/ui/filesystem-panel.tsx:419)"}, "fullDescription": {"text": "`frontend/src/features/agent/ui/filesystem-panel.tsx:419` calls `GET /api/agent/fs?cwd=${encodeURIComponent(cwd)}&path=${encodeURIComponent(relPath)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent/fs`\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-84a0f88a97bf7990", "name": "Dangling fetch: GET /api/agent/fs/file?cwd=${encodeURIComponent(cwd)}&path=${encodeURIComponent(openFile)} (frontend/src", "shortDescription": {"text": "Dangling fetch: GET /api/agent/fs/file?cwd=${encodeURIComponent(cwd)}&path=${encodeURIComponent(openFile)} (frontend/src/features/agent/ui/filesystem-panel.tsx:466)"}, "fullDescription": {"text": "`frontend/src/features/agent/ui/filesystem-panel.tsx:466` calls `GET /api/agent/fs/file?cwd=${encodeURIComponent(cwd)}&path=${encodeURIComponent(openFile)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent/fs/file`\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-77e73f05c33ccd1e", "name": "Dangling fetch: GET /api/agent/git?cwd=${encodeURIComponent(cwd)} (frontend/src/features/agent/ui/git-diff-panel.tsx:511", "shortDescription": {"text": "Dangling fetch: GET /api/agent/git?cwd=${encodeURIComponent(cwd)} (frontend/src/features/agent/ui/git-diff-panel.tsx:511)"}, "fullDescription": {"text": "`frontend/src/features/agent/ui/git-diff-panel.tsx:511` calls `GET /api/agent/git?cwd=${encodeURIComponent(cwd)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent/git`\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-b9bbcb0c9c7067dd", "name": "Dangling fetch: POST /api/agent/git?cwd=${encodeURIComponent(cwd)} (frontend/src/features/agent/ui/git-diff-panel.tsx:52", "shortDescription": {"text": "Dangling fetch: POST /api/agent/git?cwd=${encodeURIComponent(cwd)} (frontend/src/features/agent/ui/git-diff-panel.tsx:520)"}, "fullDescription": {"text": "`frontend/src/features/agent/ui/git-diff-panel.tsx:520` calls `POST /api/agent/git?cwd=${encodeURIComponent(cwd)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent/git`\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-b85080c03737be60", "name": "Dangling fetch: GET /api/agent/sessions/all?since=30d (frontend/src/features/agent/ui/sessions-command.tsx:131)", "shortDescription": {"text": "Dangling fetch: GET /api/agent/sessions/all?since=30d (frontend/src/features/agent/ui/sessions-command.tsx:131)"}, "fullDescription": {"text": "`frontend/src/features/agent/ui/sessions-command.tsx:131` calls `GET /api/agent/sessions/all?since=30d` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent/sessions/all`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c45fbafd5fa78097", "name": "Dangling fetch: POST /api/agent/terminal/resolve-cwd (frontend/src/features/agent/ui/terminal-panel.tsx:367)", "shortDescription": {"text": "Dangling fetch: POST /api/agent/terminal/resolve-cwd (frontend/src/features/agent/ui/terminal-panel.tsx:367)"}, "fullDescription": {"text": "`frontend/src/features/agent/ui/terminal-panel.tsx:367` calls `POST /api/agent/terminal/resolve-cwd` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent/terminal/resolve-cwd`\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-254f74a4c26dcbfd", "name": "Dangling fetch: POST /api/agent/terminal?cwd=${encodeURIComponent(session.cwd)} (frontend/src/features/agent/ui/terminal", "shortDescription": {"text": "Dangling fetch: POST /api/agent/terminal?cwd=${encodeURIComponent(session.cwd)} (frontend/src/features/agent/ui/terminal-panel.tsx:410)"}, "fullDescription": {"text": "`frontend/src/features/agent/ui/terminal-panel.tsx:410` calls `POST /api/agent/terminal?cwd=${encodeURIComponent(session.cwd)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent/terminal`\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-147f7e6b42daa889", "name": "Dangling fetch: POST /api/agent/browser/${path} (frontend/src/features/agent/ui/agent-browser-screencast.tsx:52)", "shortDescription": {"text": "Dangling fetch: POST /api/agent/browser/${path} (frontend/src/features/agent/ui/agent-browser-screencast.tsx:52)"}, "fullDescription": {"text": "`frontend/src/features/agent/ui/agent-browser-screencast.tsx:52` calls `POST /api/agent/browser/${path}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent/browser/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9bba37104b212548", "name": "Dangling fetch: GET /api/agent/browser/frame (frontend/src/features/agent/ui/agent-browser-screencast.tsx:87)", "shortDescription": {"text": "Dangling fetch: GET /api/agent/browser/frame (frontend/src/features/agent/ui/agent-browser-screencast.tsx:87)"}, "fullDescription": {"text": "`frontend/src/features/agent/ui/agent-browser-screencast.tsx:87` calls `GET /api/agent/browser/frame` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent/browser/frame`\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-4b77d279080af169", "name": "Dangling fetch: POST /api/agent/browser/navigate (frontend/src/features/agent/ui/agent-browser-screencast.tsx:124)", "shortDescription": {"text": "Dangling fetch: POST /api/agent/browser/navigate (frontend/src/features/agent/ui/agent-browser-screencast.tsx:124)"}, "fullDescription": {"text": "`frontend/src/features/agent/ui/agent-browser-screencast.tsx:124` calls `POST /api/agent/browser/navigate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent/browser/navigate`\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-0f7b580066fed25e", "name": "Dangling fetch: POST /api/agent/models (frontend/src/features/agent/ui/use-workspace.ts:130)", "shortDescription": {"text": "Dangling fetch: POST /api/agent/models (frontend/src/features/agent/ui/use-workspace.ts:130)"}, "fullDescription": {"text": "`frontend/src/features/agent/ui/use-workspace.ts:130` calls `POST /api/agent/models` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent/models`\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-7c14e8b8947d56fb", "name": "Dangling fetch: GET /api/agent/setup-checks (frontend/src/features/agent/ui/use-workspace.ts:144)", "shortDescription": {"text": "Dangling fetch: GET /api/agent/setup-checks (frontend/src/features/agent/ui/use-workspace.ts:144)"}, "fullDescription": {"text": "`frontend/src/features/agent/ui/use-workspace.ts:144` calls `GET /api/agent/setup-checks` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent/setup-checks`\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-fd69e50dfb4bd8f7", "name": "Dangling fetch: POST /api/agent/browser/result (frontend/src/features/agent/ui/use-workspace.ts:637)", "shortDescription": {"text": "Dangling fetch: POST /api/agent/browser/result (frontend/src/features/agent/ui/use-workspace.ts:637)"}, "fullDescription": {"text": "`frontend/src/features/agent/ui/use-workspace.ts:637` calls `POST /api/agent/browser/result` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent/browser/result`\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-765519852b49016a", "name": "Dangling fetch: GET /api/agent/browser/fetch?url=${encodeURIComponent(target)} (frontend/src/features/agent/ui/agent-bro", "shortDescription": {"text": "Dangling fetch: GET /api/agent/browser/fetch?url=${encodeURIComponent(target)} (frontend/src/features/agent/ui/agent-browser.tsx:127)"}, "fullDescription": {"text": "`frontend/src/features/agent/ui/agent-browser.tsx:127` calls `GET /api/agent/browser/fetch?url=${encodeURIComponent(target)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent/browser/fetch`\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-239015ee60bb1a58", "name": "Dangling fetch: POST /api/agent/browser/${verb} (frontend/src/features/agent/ui/agent-browser.tsx:160)", "shortDescription": {"text": "Dangling fetch: POST /api/agent/browser/${verb} (frontend/src/features/agent/ui/agent-browser.tsx:160)"}, "fullDescription": {"text": "`frontend/src/features/agent/ui/agent-browser.tsx:160` calls `POST /api/agent/browser/${verb}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent/browser/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-58ea6e60f15d8e1b", "name": "Dangling fetch: GET /api/agent/browser/localhosts (frontend/src/features/agent/ui/agent-browser.tsx:175)", "shortDescription": {"text": "Dangling fetch: GET /api/agent/browser/localhosts (frontend/src/features/agent/ui/agent-browser.tsx:175)"}, "fullDescription": {"text": "`frontend/src/features/agent/ui/agent-browser.tsx:175` calls `GET /api/agent/browser/localhosts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent/browser/localhosts`\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-f32d4b260ec985e4", "name": "Dangling fetch: GET /api/agent/browser/localhosts (frontend/src/features/agent/ui/agent-browser.tsx:636)", "shortDescription": {"text": "Dangling fetch: GET /api/agent/browser/localhosts (frontend/src/features/agent/ui/agent-browser.tsx:636)"}, "fullDescription": {"text": "`frontend/src/features/agent/ui/agent-browser.tsx:636` calls `GET /api/agent/browser/localhosts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent/browser/localhosts`\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-e76eabfddac549b4", "name": "Dangling fetch: GET /api/agent/sessions/all?since=90d (frontend/src/features/agent/ui/sessions-page.tsx:67)", "shortDescription": {"text": "Dangling fetch: GET /api/agent/sessions/all?since=90d (frontend/src/features/agent/ui/sessions-page.tsx:67)"}, "fullDescription": {"text": "`frontend/src/features/agent/ui/sessions-page.tsx:67` calls `GET /api/agent/sessions/all?since=90d` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent/sessions/all`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1362f06d72def9c5", "name": "Dangling fetch: GET /api/agent/sessions?cwd=${encodeURIComponent(project.path)}&since=30d&ids=${idsParam} (frontend/src/", "shortDescription": {"text": "Dangling fetch: GET /api/agent/sessions?cwd=${encodeURIComponent(project.path)}&since=30d&ids=${idsParam} (frontend/src/features/agent/ui/projects-nav/use-projects-nav-effects.ts:173)"}, "fullDescription": {"text": "`frontend/src/features/agent/ui/projects-nav/use-projects-nav-effects.ts:173` calls `GET /api/agent/sessions?cwd=${encodeURIComponent(project.path)}&since=30d&ids=${idsParam}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent/sessions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9868b491c655cbcc", "name": "Dangling fetch: PATCH /api/agent/sessions/${encodeURIComponent(sessionId)} (frontend/src/features/agent/ui/projects-nav/", "shortDescription": {"text": "Dangling fetch: PATCH /api/agent/sessions/${encodeURIComponent(sessionId)} (frontend/src/features/agent/ui/projects-nav/helpers.ts:115)"}, "fullDescription": {"text": "`frontend/src/features/agent/ui/projects-nav/helpers.ts:115` calls `PATCH /api/agent/sessions/${encodeURIComponent(sessionId)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent/sessions/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6addcc8b6a823e64", "name": "Dangling fetch: GET /api/agent/directories${query} (frontend/src/features/agent/ui/projects-nav/directory-picker-modal.t", "shortDescription": {"text": "Dangling fetch: GET /api/agent/directories${query} (frontend/src/features/agent/ui/projects-nav/directory-picker-modal.tsx:33)"}, "fullDescription": {"text": "`frontend/src/features/agent/ui/projects-nav/directory-picker-modal.tsx:33` calls `GET /api/agent/directories${query}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent/directories/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2ec06d045751f2a2", "name": "Dangling fetch: GET /api/agent/sessions?cwd=${encodeURIComponent(project.path)}&since=7d (frontend/src/features/agent/ui", "shortDescription": {"text": "Dangling fetch: GET /api/agent/sessions?cwd=${encodeURIComponent(project.path)}&since=7d (frontend/src/features/agent/ui/projects-nav/session-rows.tsx:166)"}, "fullDescription": {"text": "`frontend/src/features/agent/ui/projects-nav/session-rows.tsx:166` calls `GET /api/agent/sessions?cwd=${encodeURIComponent(project.path)}&since=7d` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent/sessions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0b41d59736aefc3d", "name": "Dangling fetch: GET /api/agent/runtime/sessions (frontend/src/features/agent/runtime/api.ts:50)", "shortDescription": {"text": "Dangling fetch: GET /api/agent/runtime/sessions (frontend/src/features/agent/runtime/api.ts:50)"}, "fullDescription": {"text": "`frontend/src/features/agent/runtime/api.ts:50` calls `GET /api/agent/runtime/sessions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent/runtime/sessions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0ac72725362e97b7", "name": "Dangling fetch: GET /api/agent/runtime/status?${params.toString()} (frontend/src/features/agent/runtime/api.ts:65)", "shortDescription": {"text": "Dangling fetch: GET /api/agent/runtime/status?${params.toString()} (frontend/src/features/agent/runtime/api.ts:65)"}, "fullDescription": {"text": "`frontend/src/features/agent/runtime/api.ts:65` calls `GET /api/agent/runtime/status?${params.toString()}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent/runtime/status`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ab6e31f35eb9e02e", "name": "Dangling fetch: POST /api/agent/abort (frontend/src/features/agent/runtime/api.ts:86)", "shortDescription": {"text": "Dangling fetch: POST /api/agent/abort (frontend/src/features/agent/runtime/api.ts:86)"}, "fullDescription": {"text": "`frontend/src/features/agent/runtime/api.ts:86` calls `POST /api/agent/abort` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent/abort`\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-4b9e50cdd311ba28", "name": "Dangling fetch: POST /api/agent/sessions/${encodeURIComponent(piSessionId)}?cwd=${encodeURIComponent(cwd)} (frontend/src", "shortDescription": {"text": "Dangling fetch: POST /api/agent/sessions/${encodeURIComponent(piSessionId)}?cwd=${encodeURIComponent(cwd)} (frontend/src/features/agent/runtime/api.ts:101)"}, "fullDescription": {"text": "`frontend/src/features/agent/runtime/api.ts:101` calls `POST /api/agent/sessions/${encodeURIComponent(piSessionId)}?cwd=${encodeURIComponent(cwd)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent/sessions/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-803d20cca6026655", "name": "Dangling fetch: POST /api/agent/turn (frontend/src/features/agent/runtime/api.ts:161)", "shortDescription": {"text": "Dangling fetch: POST /api/agent/turn (frontend/src/features/agent/runtime/api.ts:161)"}, "fullDescription": {"text": "`frontend/src/features/agent/runtime/api.ts:161` calls `POST /api/agent/turn` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent/turn`\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-5225769951b3ded7", "name": "Dangling fetch: POST /api/agent/canvas${canvasQuery(activeCanvasSessionRef.current)} (frontend/src/features/agent/tools/", "shortDescription": {"text": "Dangling fetch: POST /api/agent/canvas${canvasQuery(activeCanvasSessionRef.current)} (frontend/src/features/agent/tools/context.tsx:293)"}, "fullDescription": {"text": "`frontend/src/features/agent/tools/context.tsx:293` calls `POST /api/agent/canvas${canvasQuery(activeCanvasSessionRef.current)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent/canvas/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-857c11c51bf4b9e5", "name": "Dangling fetch: POST /api/agent/canvas${canvasQuery(activeCanvasSessionRef.current)} (frontend/src/features/agent/tools/", "shortDescription": {"text": "Dangling fetch: POST /api/agent/canvas${canvasQuery(activeCanvasSessionRef.current)} (frontend/src/features/agent/tools/context.tsx:306)"}, "fullDescription": {"text": "`frontend/src/features/agent/tools/context.tsx:306` calls `POST /api/agent/canvas${canvasQuery(activeCanvasSessionRef.current)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent/canvas/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5691f95f6e7d68a4", "name": "Dangling fetch: POST /api/agent/canvas${canvasQuery(activeCanvasSessionRef.current)} (frontend/src/features/agent/tools/", "shortDescription": {"text": "Dangling fetch: POST /api/agent/canvas${canvasQuery(activeCanvasSessionRef.current)} (frontend/src/features/agent/tools/context.tsx:327)"}, "fullDescription": {"text": "`frontend/src/features/agent/tools/context.tsx:327` calls `POST /api/agent/canvas${canvasQuery(activeCanvasSessionRef.current)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent/canvas/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ab956b0b7009e71a", "name": "Dangling fetch: GET /api/agent/canvas${query} (frontend/src/features/agent/tools/context.tsx:500)", "shortDescription": {"text": "Dangling fetch: GET /api/agent/canvas${query} (frontend/src/features/agent/tools/context.tsx:500)"}, "fullDescription": {"text": "`frontend/src/features/agent/tools/context.tsx:500` calls `GET /api/agent/canvas${query}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent/canvas/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-12031328e2b26b88", "name": "Dangling fetch: GET /api/agent/plugins?includeDisabled=1 (frontend/src/features/agent/tools/context.tsx:558)", "shortDescription": {"text": "Dangling fetch: GET /api/agent/plugins?includeDisabled=1 (frontend/src/features/agent/tools/context.tsx:558)"}, "fullDescription": {"text": "`frontend/src/features/agent/tools/context.tsx:558` calls `GET /api/agent/plugins?includeDisabled=1` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent/plugins`\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-6da3be61b14e63a8", "name": "Dangling fetch: GET /api/agent/skills (frontend/src/features/agent/tools/context.tsx:562)", "shortDescription": {"text": "Dangling fetch: GET /api/agent/skills (frontend/src/features/agent/tools/context.tsx:562)"}, "fullDescription": {"text": "`frontend/src/features/agent/tools/context.tsx:562` calls `GET /api/agent/skills` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent/skills`\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-0a0dd9d332f03a45", "name": "Dangling fetch: GET /api/agent/prompt-templates (frontend/src/features/agent/tools/context.tsx:566)", "shortDescription": {"text": "Dangling fetch: GET /api/agent/prompt-templates (frontend/src/features/agent/tools/context.tsx:566)"}, "fullDescription": {"text": "`frontend/src/features/agent/tools/context.tsx:566` calls `GET /api/agent/prompt-templates` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agent/prompt-templates`\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-97decbf88444e42a", "name": "Dangling fetch: GET http://127.0.0.1:${port}/json (frontend/src/features/agent/browser-host/browser-host.ts:60)", "shortDescription": {"text": "Dangling fetch: GET http://127.0.0.1:${port}/json (frontend/src/features/agent/browser-host/browser-host.ts:60)"}, "fullDescription": {"text": "`frontend/src/features/agent/browser-host/browser-host.ts:60` calls `GET http://127.0.0.1:${port}/json` 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>/json`\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-68a05007e3774f96", "name": "Dangling fetch: PUT http://127.0.0.1:${port}/json/new?about:blank (frontend/src/features/agent/browser-host/browser-host", "shortDescription": {"text": "Dangling fetch: PUT http://127.0.0.1:${port}/json/new?about:blank (frontend/src/features/agent/browser-host/browser-host.ts:74)"}, "fullDescription": {"text": "`frontend/src/features/agent/browser-host/browser-host.ts:74` calls `PUT http://127.0.0.1:${port}/json/new?about:blank` 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>/json/new`\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-800930225b5aedf3", "name": "Dangling fetch: POST /api/proxy/launch/${recipeId} (frontend/src/features/recipes/recipes-content/recipes-content-model.", "shortDescription": {"text": "Dangling fetch: POST /api/proxy/launch/${recipeId} (frontend/src/features/recipes/recipes-content/recipes-content-model.ts:164)"}, "fullDescription": {"text": "`frontend/src/features/recipes/recipes-content/recipes-content-model.ts:164` calls `POST /api/proxy/launch/${recipeId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/proxy/launch/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bf410846c769b3fe", "name": "Dangling fetch: GET /api/mcp/servers?includeDisabled=1 (frontend/src/features/plugins/plugins-page.tsx:96)", "shortDescription": {"text": "Dangling fetch: GET /api/mcp/servers?includeDisabled=1 (frontend/src/features/plugins/plugins-page.tsx:96)"}, "fullDescription": {"text": "`frontend/src/features/plugins/plugins-page.tsx:96` calls `GET /api/mcp/servers?includeDisabled=1` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/mcp/servers`\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-8a0530e8a7e1ab8d", "name": "Dangling fetch: GET /api/mcp/registry?q=${encodeURIComponent(search)}&limit=28 (frontend/src/features/plugins/plugins-pa", "shortDescription": {"text": "Dangling fetch: GET /api/mcp/registry?q=${encodeURIComponent(search)}&limit=28 (frontend/src/features/plugins/plugins-page.tsx:111)"}, "fullDescription": {"text": "`frontend/src/features/plugins/plugins-page.tsx:111` calls `GET /api/mcp/registry?q=${encodeURIComponent(search)}&limit=28` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/mcp/registry`\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-decf01a5681c116e", "name": "Dangling fetch: POST /api/mcp/servers (frontend/src/features/plugins/plugins-page.tsx:162)", "shortDescription": {"text": "Dangling fetch: POST /api/mcp/servers (frontend/src/features/plugins/plugins-page.tsx:162)"}, "fullDescription": {"text": "`frontend/src/features/plugins/plugins-page.tsx:162` calls `POST /api/mcp/servers` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/mcp/servers`\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-2ee153ca51afa39e", "name": "Dangling fetch: POST /api/mcp/registry (frontend/src/features/plugins/plugins-page.tsx:184)", "shortDescription": {"text": "Dangling fetch: POST /api/mcp/registry (frontend/src/features/plugins/plugins-page.tsx:184)"}, "fullDescription": {"text": "`frontend/src/features/plugins/plugins-page.tsx:184` calls `POST /api/mcp/registry` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/mcp/registry`\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-4ad129c017867651", "name": "Dangling fetch: GET /logs/route-test?limit=1 (tests/controller/integration/observability-contracts.test.ts:88)", "shortDescription": {"text": "Dangling fetch: GET /logs/route-test?limit=1 (tests/controller/integration/observability-contracts.test.ts:88)"}, "fullDescription": {"text": "`tests/controller/integration/observability-contracts.test.ts:88` calls `GET /logs/route-test?limit=1` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/logs/route-test`\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-f40fc0a00f8a33f0", "name": "Dangling fetch: GET /logs/route-test/stream?tail=1 (tests/controller/integration/observability-contracts.test.ts:98)", "shortDescription": {"text": "Dangling fetch: GET /logs/route-test/stream?tail=1 (tests/controller/integration/observability-contracts.test.ts:98)"}, "fullDescription": {"text": "`tests/controller/integration/observability-contracts.test.ts:98` calls `GET /logs/route-test/stream?tail=1` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/logs/route-test/stream`\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-4fe932b64cc7ba33", "name": "Dangling fetch: DELETE /logs/controller (tests/controller/integration/observability-contracts.test.ts:124)", "shortDescription": {"text": "Dangling fetch: DELETE /logs/controller (tests/controller/integration/observability-contracts.test.ts:124)"}, "fullDescription": {"text": "`tests/controller/integration/observability-contracts.test.ts:124` calls `DELETE /logs/controller` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/logs/controller`\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-817b874b0e6f9855", "name": "Dangling fetch: GET /controllers/route/status?target=file:///etc/passwd (tests/controller/integration/observability-cont", "shortDescription": {"text": "Dangling fetch: GET /controllers/route/status?target=file:///etc/passwd (tests/controller/integration/observability-contracts.test.ts:274)"}, "fullDescription": {"text": "`tests/controller/integration/observability-contracts.test.ts:274` calls `GET /controllers/route/status?target=file:///etc/passwd` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/controllers/route/status`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fb010fbbbe5af3c4", "name": "Dangling fetch: GET /missing-route (tests/controller/integration/observability-contracts.test.ts:584)", "shortDescription": {"text": "Dangling fetch: GET /missing-route (tests/controller/integration/observability-contracts.test.ts:584)"}, "fullDescription": {"text": "`tests/controller/integration/observability-contracts.test.ts:584` calls `GET /missing-route` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/missing-route`\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-e22ac79ad972c13b", "name": "Dangling fetch: GET /controllers/route/v1/models?target=${encodeURIComponent(target)}&limit=2 (tests/controller/integrat", "shortDescription": {"text": "Dangling fetch: GET /controllers/route/v1/models?target=${encodeURIComponent(target)}&limit=2 (tests/controller/integration/proxy-forwarding-contracts.test.ts:54)"}, "fullDescription": {"text": "`tests/controller/integration/proxy-forwarding-contracts.test.ts:54` calls `GET /controllers/route/v1/models?target=${encodeURIComponent(target)}&limit=2` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/controllers/route/v1/models`\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-02726d953d69970d", "name": "Dangling fetch: POST /controllers/route/v1/chat/completions?target=${encodeURIComponent(target)} (tests/controller/integ", "shortDescription": {"text": "Dangling fetch: POST /controllers/route/v1/chat/completions?target=${encodeURIComponent(target)} (tests/controller/integration/proxy-forwarding-contracts.test.ts:129)"}, "fullDescription": {"text": "`tests/controller/integration/proxy-forwarding-contracts.test.ts:129` calls `POST /controllers/route/v1/chat/completions?target=${encodeURIComponent(target)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/controllers/route/v1/chat/completions`\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-7a3fd04922911f3c", "name": "Dangling fetch: GET /recipes/route-test-recipe (tests/controller/integration/runtime-recipe-contracts.test.ts:55)", "shortDescription": {"text": "Dangling fetch: GET /recipes/route-test-recipe (tests/controller/integration/runtime-recipe-contracts.test.ts:55)"}, "fullDescription": {"text": "`tests/controller/integration/runtime-recipe-contracts.test.ts:55` calls `GET /recipes/route-test-recipe` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/recipes/route-test-recipe`\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-bc28fc7f7251ee88", "name": "Dangling fetch: PUT /recipes/route-test-recipe (tests/controller/integration/runtime-recipe-contracts.test.ts:64)", "shortDescription": {"text": "Dangling fetch: PUT /recipes/route-test-recipe (tests/controller/integration/runtime-recipe-contracts.test.ts:64)"}, "fullDescription": {"text": "`tests/controller/integration/runtime-recipe-contracts.test.ts:64` calls `PUT /recipes/route-test-recipe` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/recipes/route-test-recipe`\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-f273eafd162d130e", "name": "Dangling fetch: GET /recipes/route-test-recipe (tests/controller/integration/runtime-recipe-contracts.test.ts:77)", "shortDescription": {"text": "Dangling fetch: GET /recipes/route-test-recipe (tests/controller/integration/runtime-recipe-contracts.test.ts:77)"}, "fullDescription": {"text": "`tests/controller/integration/runtime-recipe-contracts.test.ts:77` calls `GET /recipes/route-test-recipe` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/recipes/route-test-recipe`\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-fd698641230efc4d", "name": "Dangling fetch: DELETE /recipes/route-test-recipe (tests/controller/integration/runtime-recipe-contracts.test.ts:86)", "shortDescription": {"text": "Dangling fetch: DELETE /recipes/route-test-recipe (tests/controller/integration/runtime-recipe-contracts.test.ts:86)"}, "fullDescription": {"text": "`tests/controller/integration/runtime-recipe-contracts.test.ts:86` calls `DELETE /recipes/route-test-recipe` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/recipes/route-test-recipe`\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-50c931a80c7b0eab", "name": "Dangling fetch: GET /recipes/route-test-recipe (tests/controller/integration/runtime-recipe-contracts.test.ts:93)", "shortDescription": {"text": "Dangling fetch: GET /recipes/route-test-recipe (tests/controller/integration/runtime-recipe-contracts.test.ts:93)"}, "fullDescription": {"text": "`tests/controller/integration/runtime-recipe-contracts.test.ts:93` calls `GET /recipes/route-test-recipe` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/recipes/route-test-recipe`\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-f2e666392cd2f2dd", "name": "Dangling fetch: POST /launch/missing-recipe (tests/controller/integration/runtime-recipe-contracts.test.ts:155)", "shortDescription": {"text": "Dangling fetch: POST /launch/missing-recipe (tests/controller/integration/runtime-recipe-contracts.test.ts:155)"}, "fullDescription": {"text": "`tests/controller/integration/runtime-recipe-contracts.test.ts:155` calls `POST /launch/missing-recipe` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/launch/missing-recipe`\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-30188257b899f711", "name": "Dangling fetch: POST /launch/missing-recipe/cancel (tests/controller/integration/runtime-recipe-contracts.test.ts:162)", "shortDescription": {"text": "Dangling fetch: POST /launch/missing-recipe/cancel (tests/controller/integration/runtime-recipe-contracts.test.ts:162)"}, "fullDescription": {"text": "`tests/controller/integration/runtime-recipe-contracts.test.ts:162` calls `POST /launch/missing-recipe/cancel` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/launch/missing-recipe/cancel`\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-2ab7dd7c310110d9", "name": "Dangling fetch: POST /studio/downloads/missing-download/${action} (tests/controller/integration/runtime-recipe-contracts", "shortDescription": {"text": "Dangling fetch: POST /studio/downloads/missing-download/${action} (tests/controller/integration/runtime-recipe-contracts.test.ts:244)"}, "fullDescription": {"text": "`tests/controller/integration/runtime-recipe-contracts.test.ts:244` calls `POST /studio/downloads/missing-download/${action}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/studio/downloads/missing-download/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8953905a7a14fb5d", "name": "Dangling fetch: GET /runtime/jobs/missing-job (tests/controller/integration/runtime-recipe-contracts.test.ts:620)", "shortDescription": {"text": "Dangling fetch: GET /runtime/jobs/missing-job (tests/controller/integration/runtime-recipe-contracts.test.ts:620)"}, "fullDescription": {"text": "`tests/controller/integration/runtime-recipe-contracts.test.ts:620` calls `GET /runtime/jobs/missing-job` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/runtime/jobs/missing-job`\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-e984766c52bbc8a5", "name": "Dangling fetch: POST /runtime/jobs/missing-job/cancel (tests/controller/integration/runtime-recipe-contracts.test.ts:625", "shortDescription": {"text": "Dangling fetch: POST /runtime/jobs/missing-job/cancel (tests/controller/integration/runtime-recipe-contracts.test.ts:625)"}, "fullDescription": {"text": "`tests/controller/integration/runtime-recipe-contracts.test.ts:625` calls `POST /runtime/jobs/missing-job/cancel` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/runtime/jobs/missing-job/cancel`\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-52ddad3b2d41c3eb", "name": "Dangling fetch: PUT /studio/providers/local (tests/controller/integration/system-studio-contracts.test.ts:207)", "shortDescription": {"text": "Dangling fetch: PUT /studio/providers/local (tests/controller/integration/system-studio-contracts.test.ts:207)"}, "fullDescription": {"text": "`tests/controller/integration/system-studio-contracts.test.ts:207` calls `PUT /studio/providers/local` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/studio/providers/local`\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-28b74b4073810164", "name": "Dangling fetch: DELETE /studio/providers/local (tests/controller/integration/system-studio-contracts.test.ts:229)", "shortDescription": {"text": "Dangling fetch: DELETE /studio/providers/local (tests/controller/integration/system-studio-contracts.test.ts:229)"}, "fullDescription": {"text": "`tests/controller/integration/system-studio-contracts.test.ts:229` calls `DELETE /studio/providers/local` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/studio/providers/local`\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-a5d9049496c6f443", "name": "Dangling fetch: GET /v1/models/catalog-route-served (tests/controller/integration/model-catalog-contracts.test.ts:105)", "shortDescription": {"text": "Dangling fetch: GET /v1/models/catalog-route-served (tests/controller/integration/model-catalog-contracts.test.ts:105)"}, "fullDescription": {"text": "`tests/controller/integration/model-catalog-contracts.test.ts:105` calls `GET /v1/models/catalog-route-served` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/models/catalog-route-served`\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-2d96761ee5833fa3", "name": "Dangling fetch: GET /v1/models/missing-model (tests/controller/integration/model-catalog-contracts.test.ts:116)", "shortDescription": {"text": "Dangling fetch: GET /v1/models/missing-model (tests/controller/integration/model-catalog-contracts.test.ts:116)"}, "fullDescription": {"text": "`tests/controller/integration/model-catalog-contracts.test.ts:116` calls `GET /v1/models/missing-model` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/models/missing-model`\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-679752892ba212ce", "name": "Unused endpoint: ALL /controllers/route/*", "shortDescription": {"text": "Unused endpoint: ALL /controllers/route/*"}, "fullDescription": {"text": "`controller/src/http/app.ts` declares `ALL /controllers/route/*` 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-e21e206e941b549d", "name": "Unused endpoint: POST /launch/:recipeId/cancel", "shortDescription": {"text": "Unused endpoint: POST /launch/:recipeId/cancel"}, "fullDescription": {"text": "`controller/src/modules/engines/routes.ts` declares `POST /launch/:recipeId/cancel` 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-cea36574c44ffac4", "name": "Unused endpoint: GET /studio/downloads/:downloadId", "shortDescription": {"text": "Unused endpoint: GET /studio/downloads/:downloadId"}, "fullDescription": {"text": "`controller/src/modules/engines/routes.ts` declares `GET /studio/downloads/:downloadId` 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-30f1bbcbbbd304e9", "name": "Unused endpoint: GET /runtime/targets/:targetId/health", "shortDescription": {"text": "Unused endpoint: GET /runtime/targets/:targetId/health"}, "fullDescription": {"text": "`controller/src/modules/engines/routes.ts` declares `GET /runtime/targets/:targetId/health` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-44a0182e6aeba7fc", "name": "Unused endpoint: GET /v1/models/:modelId", "shortDescription": {"text": "Unused endpoint: GET /v1/models/:modelId"}, "fullDescription": {"text": "`controller/src/modules/models/routes.ts` declares `GET /v1/models/:modelId` 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-fb8f6ab0dfe5241c", "name": "Unused endpoint: GET /v1/huggingface/models", "shortDescription": {"text": "Unused endpoint: GET /v1/huggingface/models"}, "fullDescription": {"text": "`controller/src/modules/models/routes.ts` declares `GET /v1/huggingface/models` 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-4e8d00df8e84a3bb", "name": "Unused endpoint: GET /logs/:sessionId", "shortDescription": {"text": "Unused endpoint: GET /logs/:sessionId"}, "fullDescription": {"text": "`controller/src/modules/system/logs-routes.ts` declares `GET /logs/:sessionId` 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-d4ba7de8e3743014", "name": "Unused endpoint: GET /logs/:sessionId/stream", "shortDescription": {"text": "Unused endpoint: GET /logs/:sessionId/stream"}, "fullDescription": {"text": "`controller/src/modules/system/logs-routes.ts` declares `GET /logs/:sessionId/stream` 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/20650"}, "properties": {"repository": "sybil-solutions/vllm-studio", "repoUrl": "https://github.com/sybil-solutions/vllm-studio", "branch": "main"}, "results": [{"ruleId": "scanner-690fda69a69c07b5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/desktop/helpers/logger.ts:35"}, "properties": {"repobilityId": "2791f2d74560a1ab", "scanner": "scanner-primary", "fingerprint": "690fda69a69c07b5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f41309bd5e63dd62", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/proxy.ts:125"}, "properties": {"repobilityId": "7a138a67bc3fd9a1", "scanner": "scanner-primary", "fingerprint": "f41309bd5e63dd62", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7346da49d5115879", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/ui/list.tsx:302"}, "properties": {"repobilityId": "6d979de6fad47bfe", "scanner": "scanner-primary", "fingerprint": "7346da49d5115879", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c971985acbcf4c66", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/ui/page.tsx:46"}, "properties": {"repobilityId": "59ddc161d5c921f4", "scanner": "scanner-primary", "fingerprint": "c971985acbcf4c66", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-604596e8dae9b7b9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/ui/huggingface-model-card.tsx:239"}, "properties": {"repobilityId": "39e8707be6c80927", "scanner": "scanner-primary", "fingerprint": "604596e8dae9b7b9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5d9ef70271f85761", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/ui/right-detail-panel.tsx:43"}, "properties": {"repobilityId": "89655a4a1da014bc", "scanner": "scanner-primary", "fingerprint": "5d9ef70271f85761", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2b2b15c5eeda1af3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/ui/drawer.tsx:62"}, "properties": {"repobilityId": "3d4c69e0e88c76a0", "scanner": "scanner-primary", "fingerprint": "2b2b15c5eeda1af3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6330676672000761", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/layout.tsx:84"}, "properties": {"repobilityId": "62009cc81f939b61", "scanner": "scanner-primary", "fingerprint": "6330676672000761", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-6884a64229746dde", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/app/api/proxy/[...path]/route.ts:408"}, "properties": {"repobilityId": "7b1e781352fdd088", "scanner": "scanner-primary", "fingerprint": "6884a64229746dde", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-915f2ab7aa73e472", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/lib/data-dir.ts:76"}, "properties": {"repobilityId": "b52e707498228625", "scanner": "scanner-primary", "fingerprint": "915f2ab7aa73e472", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-495f316cb11e37ce", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/settings/appearance-settings.tsx:453"}, "properties": {"repobilityId": "74303947cf8f2d23", "scanner": "scanner-primary", "fingerprint": "495f316cb11e37ce", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d761d57e27e18bfd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/usage/model-performance-table.tsx:295"}, "properties": {"repobilityId": "90d9938c7a1e9681", "scanner": "scanner-primary", "fingerprint": "d761d57e27e18bfd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-41cd0e11650f29c9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/usage/secondary-metrics.tsx:43"}, "properties": {"repobilityId": "579aac7603f21e68", "scanner": "scanner-primary", "fingerprint": "41cd0e11650f29c9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-139144645c9f189c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/usage/usage-page.tsx:80"}, "properties": {"repobilityId": "f93457a4032fbe7a", "scanner": "scanner-primary", "fingerprint": "139144645c9f189c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c8f1a511a314d8ac", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/usage/daily-usage-chart.tsx:141"}, "properties": {"repobilityId": "d42881cc874d3a83", "scanner": "scanner-primary", "fingerprint": "c8f1a511a314d8ac", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-826d43f8007d4674", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/dashboard/control-panel/control-panel-v2.tsx:212"}, "properties": {"repobilityId": "cfde20b46a1043f0", "scanner": "scanner-primary", "fingerprint": "826d43f8007d4674", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9224523b408f0690", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/dashboard/control-panel/status-section-parts.tsx:247"}, "properties": {"repobilityId": "bbec5c99095e3be0", "scanner": "scanner-primary", "fingerprint": "9224523b408f0690", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a52ee418ddee30c2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/features/agent/trace-reasoning.ts:17"}, "properties": {"repobilityId": "1fedf085a0663790", "scanner": "scanner-primary", "fingerprint": "a52ee418ddee30c2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-028cfbbb99155f85", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/filesystem-tree.tsx:28"}, "properties": {"repobilityId": "ae7883551187a13c", "scanner": "scanner-primary", "fingerprint": "028cfbbb99155f85", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-936b001726bf2167", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/features/agent/ui/filesystem-file-viewer.tsx:132"}, "properties": {"repobilityId": "9180b8e23e068d6c", "scanner": "scanner-primary", "fingerprint": "936b001726bf2167", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-c1014070ca780af4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/agent-workspace-shell.tsx:154"}, "properties": {"repobilityId": "a054e3bc559689b2", "scanner": "scanner-primary", "fingerprint": "c1014070ca780af4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ba759b92190057e4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/agent-browser-panel.tsx:308"}, "properties": {"repobilityId": "391b7cdfc8ad8207", "scanner": "scanner-primary", "fingerprint": "ba759b92190057e4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c17cf151d7c84ed1", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/features/agent/ui/assistant-markdown.tsx:112"}, "properties": {"repobilityId": "42a2db78976b3818", "scanner": "scanner-primary", "fingerprint": "c17cf151d7c84ed1", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-7ab120200428e894", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/agent-queue-panel.tsx:57"}, "properties": {"repobilityId": "4eeed5937cfc5456", "scanner": "scanner-primary", "fingerprint": "7ab120200428e894", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-51475aa268bf4ddf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/agent-composer-context.tsx:129"}, "properties": {"repobilityId": "3190606b6f5b700f", "scanner": "scanner-primary", "fingerprint": "51475aa268bf4ddf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7d3eedc676ee85ae", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/computer-status-panel.tsx:248"}, "properties": {"repobilityId": "4b056f9fb8176d6a", "scanner": "scanner-primary", "fingerprint": "7d3eedc676ee85ae", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c6a41b86bb8cdcb7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/filesystem-panel.tsx:263"}, "properties": {"repobilityId": "f94cab701552df3a", "scanner": "scanner-primary", "fingerprint": "c6a41b86bb8cdcb7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8c570de0cf1a0675", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/git-diff-panel.tsx:338"}, "properties": {"repobilityId": "8e1057dd1f4e9753", "scanner": "scanner-primary", "fingerprint": "8c570de0cf1a0675", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8cc68c968eab7967", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/agent-attachment-tray.tsx:36"}, "properties": {"repobilityId": "633011cfd43439db", "scanner": "scanner-primary", "fingerprint": "8cc68c968eab7967", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-80ca106467624de0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/agent-model-picker.tsx:58"}, "properties": {"repobilityId": "072afc71f0be6192", "scanner": "scanner-primary", "fingerprint": "80ca106467624de0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6da72aee4850d53f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/canvas-panel.tsx:29"}, "properties": {"repobilityId": "a5c0c5ab8e0058e2", "scanner": "scanner-primary", "fingerprint": "6da72aee4850d53f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-48d843c621fecdbd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/sessions-command.tsx:317"}, "properties": {"repobilityId": "cd94ea4d2b4ad8f9", "scanner": "scanner-primary", "fingerprint": "48d843c621fecdbd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c9becd2c1c2f207a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/agent-composer-status-bar.tsx:71"}, "properties": {"repobilityId": "437e91291425332d", "scanner": "scanner-primary", "fingerprint": "c9becd2c1c2f207a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-36d86e5ba924ac88", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/agent-browser-screencast.tsx:281"}, "properties": {"repobilityId": "6b154e6c32e9a787", "scanner": "scanner-primary", "fingerprint": "36d86e5ba924ac88", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-90527c5489aef876", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/agent-browser.tsx:356"}, "properties": {"repobilityId": "9016aedff2f494c3", "scanner": "scanner-primary", "fingerprint": "90527c5489aef876", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bde5cb0193e99729", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/timeline/session-pane-block-router.tsx:309"}, "properties": {"repobilityId": "f4104a166a025470", "scanner": "scanner-primary", "fingerprint": "bde5cb0193e99729", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6691988376921668", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/timeline/tool-block-view.tsx:125"}, "properties": {"repobilityId": "cf2bfc23eb4835b8", "scanner": "scanner-primary", "fingerprint": "6691988376921668", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2bd615d2d9845a88", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/features/agent/ui/timeline/tool-block-view.tsx:200"}, "properties": {"repobilityId": "b9377e30cbdf55d4", "scanner": "scanner-primary", "fingerprint": "2bd615d2d9845a88", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-8a375abab04e72c7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/projects-nav/directory-picker-modal.tsx:121"}, "properties": {"repobilityId": "d7fc93f910c643d9", "scanner": "scanner-primary", "fingerprint": "8a375abab04e72c7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-498249dccdfcb05f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/projects-nav/session-rows.tsx:77"}, "properties": {"repobilityId": "1dfbe04b47de82fc", "scanner": "scanner-primary", "fingerprint": "498249dccdfcb05f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9eee76caa6683102", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/agent/ui/projects-nav/session-nav-row.tsx:280"}, "properties": {"repobilityId": "09461cbcd5f60477", "scanner": "scanner-primary", "fingerprint": "9eee76caa6683102", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-378dffe2d351497e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/logs/server-view.tsx:110"}, "properties": {"repobilityId": "1764950cd44303ab", "scanner": "scanner-primary", "fingerprint": "378dffe2d351497e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6e288394994c5780", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/logs/logs-view.tsx:100"}, "properties": {"repobilityId": "ea2339f7bbc284df", "scanner": "scanner-primary", "fingerprint": "6e288394994c5780", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fd5484efa48f9a05", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/logs/logs-sessions-sidebar.tsx:58"}, "properties": {"repobilityId": "f22fdb7231d4a233", "scanner": "scanner-primary", "fingerprint": "fd5484efa48f9a05", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-25e30c7b38232e71", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/discover/discover-view.tsx:189"}, "properties": {"repobilityId": "c37cd6fe4df23214", "scanner": "scanner-primary", "fingerprint": "25e30c7b38232e71", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4b1533099c7d2451", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/discover/discover/discover-download-queue.tsx:53"}, "properties": {"repobilityId": "c68fab8d63104aa5", "scanner": "scanner-primary", "fingerprint": "4b1533099c7d2451", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e0bf3fcfc506ab9f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/recipes/recipes-content/recipes-content-view.tsx:115"}, "properties": {"repobilityId": "1a78c35e20b457e9", "scanner": "scanner-primary", "fingerprint": "e0bf3fcfc506ab9f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d3eaa483ed2ac51f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/shell/left-sidebar.tsx:259"}, "properties": {"repobilityId": "25053e516ceb9e9c", "scanner": "scanner-primary", "fingerprint": "d3eaa483ed2ac51f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ae0dc4d55db8a2e4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/plugins/plugins-page-parts.tsx:129"}, "properties": {"repobilityId": "b8922ab37c26f267", "scanner": "scanner-primary", "fingerprint": "ae0dc4d55db8a2e4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-012264819aeb9f8b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 cli/src/render.ts:51"}, "properties": {"repobilityId": "b20092ba96ba7713", "scanner": "scanner-primary", "fingerprint": "012264819aeb9f8b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f80de91be4e88bc9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 cli/src/headless.ts:6"}, "properties": {"repobilityId": "102e12e895a8601f", "scanner": "scanner-primary", "fingerprint": "f80de91be4e88bc9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a812bbdc378bedbc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 controller/scripts/controller-standards-audit.ts:89"}, "properties": {"repobilityId": "90c5974983bf01d2", "scanner": "scanner-primary", "fingerprint": "a812bbdc378bedbc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-194024ead9fbc920", "level": "warning", "message": {"text": "Privileged port 16 in use"}, "properties": {"repobilityId": "d31009168c502ace", "scanner": "scanner-primary", "fingerprint": "194024ead9fbc920", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/deploy-remote.sh"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-faa134129e5545ff", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "properties": {"repobilityId": "3e90d440e1f9ece1", "scanner": "scanner-primary", "fingerprint": "faa134129e5545ff", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-fb7d076d4355845a", "level": "warning", "message": {"text": "Dockerfile runs as root: controller/Dockerfile"}, "properties": {"repobilityId": "b190cda4881dbeba", "scanner": "scanner-primary", "fingerprint": "fb7d076d4355845a", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-6375e02afd41af93", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: oven/bun:1.3.9"}, "properties": {"repobilityId": "baedd677e3df4393", "scanner": "scanner-primary", "fingerprint": "6375e02afd41af93", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "controller/Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"ruleId": "scanner-c9b9ceb6c86bfded", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in frontend/scripts/start-standalone.mjs:2"}, "properties": {"repobilityId": "e9ca73a5106e5a21", "scanner": "scanner-primary", "fingerprint": "c9b9ceb6c86bfded", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/scripts/start-standalone.mjs"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-c72872e83b273487", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in frontend/desktop/resources/pi-extensions/mcp-plugin.ts:1"}, "properties": {"repobilityId": "23a42c5c7d33b62e", "scanner": "scanner-primary", "fingerprint": "c72872e83b273487", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/desktop/resources/pi-extensions/mcp-plugin.ts"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ed46f2e8a953f0fc", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in frontend/desktop/logic/app-server.ts:4"}, "properties": {"repobilityId": "2474ae31baa2b33b", "scanner": "scanner-primary", "fingerprint": "ed46f2e8a953f0fc", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/desktop/logic/app-server.ts"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-4052542b2ba9cfea", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/layout.tsx:84"}, "properties": {"repobilityId": "fe5cbdb460d93202", "scanner": "scanner-primary", "fingerprint": "4052542b2ba9cfea", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/layout.tsx"}, "region": {"startLine": 84}}}]}, {"ruleId": "scanner-ffce250e8d047320", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in frontend/src/app/api/agent/terminal/route.ts:1"}, "properties": {"repobilityId": "d90501c66ca7c239", "scanner": "scanner-primary", "fingerprint": "ffce250e8d047320", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/api/agent/terminal/route.ts"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9a8d4bdf51a572c1", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in frontend/src/app/api/agent/browser/localhosts/route.ts:1"}, "properties": {"repobilityId": "cdffa9d5df62c425", "scanner": "scanner-primary", "fingerprint": "9a8d4bdf51a572c1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/api/agent/browser/localhosts/route.ts"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e5cfadf8b38107e3", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in frontend/src/features/agent/git.ts:1"}, "properties": {"repobilityId": "55a403d0712d083b", "scanner": "scanner-primary", "fingerprint": "e5cfadf8b38107e3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/agent/git.ts"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bc200a4a58f0cde7", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/features/agent/ui/filesystem-file-viewer.tsx:132"}, "properties": {"repobilityId": "ddc47cb8354a66ac", "scanner": "scanner-primary", "fingerprint": "bc200a4a58f0cde7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/agent/ui/filesystem-file-viewer.tsx"}, "region": {"startLine": 132}}}]}, {"ruleId": "scanner-1900cf628c11ccdb", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/features/agent/ui/assistant-markdown.tsx:112"}, "properties": {"repobilityId": "57b954726758f030", "scanner": "scanner-primary", "fingerprint": "1900cf628c11ccdb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/agent/ui/assistant-markdown.tsx"}, "region": {"startLine": 112}}}]}, {"ruleId": "scanner-6ccf27644eb82696", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/features/agent/ui/timeline/tool-block-view.tsx:200"}, "properties": {"repobilityId": "9b1b6fd4e46478ce", "scanner": "scanner-primary", "fingerprint": "6ccf27644eb82696", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/agent/ui/timeline/tool-block-view.tsx"}, "region": {"startLine": 200}}}]}, {"ruleId": "scanner-ca1b328f72bd691c", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in frontend/src/features/agent/browser-host/chrome.ts:10"}, "properties": {"repobilityId": "7ebc9ab0313ed4be", "scanner": "scanner-primary", "fingerprint": "ca1b328f72bd691c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/features/agent/browser-host/chrome.ts"}, "region": {"startLine": 10}}}]}, {"ruleId": "scanner-20a79b5485bb70eb", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/release-statement.mjs:2"}, "properties": {"repobilityId": "43efa6a997a1f06e", "scanner": "scanner-primary", "fingerprint": "20a79b5485bb70eb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/release-statement.mjs"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-0c1ba207bd7dbbd3", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/check-conventional-commits.mjs:2"}, "properties": {"repobilityId": "b8660a4a2787856c", "scanner": "scanner-primary", "fingerprint": "0c1ba207bd7dbbd3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/check-conventional-commits.mjs"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-94ab8f936af5033e", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in controller/src/modules/engines/process/process-utilities.ts:1"}, "properties": {"repobilityId": "09cb73da8a45163a", "scanner": "scanner-primary", "fingerprint": "94ab8f936af5033e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "controller/src/modules/engines/process/process-utilities.ts"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7b8231ce9d4e445c", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in controller/src/modules/engines/process/process-manager.ts:1"}, "properties": {"repobilityId": "1a81ebe468c430f8", "scanner": "scanner-primary", "fingerprint": "7b8231ce9d4e445c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "controller/src/modules/engines/process/process-manager.ts"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f3c238648835ed35", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in controller/src/modules/engines/runtimes/engine-jobs.ts:1"}, "properties": {"repobilityId": "9cd9b319d1a8f67c", "scanner": "scanner-primary", "fingerprint": "f3c238648835ed35", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "controller/src/modules/engines/runtimes/engine-jobs.ts"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9173a84cfde80f7b", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in controller/src/modules/system/logs-routes.ts:1"}, "properties": {"repobilityId": "4839506a19c96405", "scanner": "scanner-primary", "fingerprint": "9173a84cfde80f7b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "controller/src/modules/system/logs-routes.ts"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f7ee901d62c2a800", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in controller/src/services/cli-runner.ts:1"}, "properties": {"repobilityId": "68d425f7451bae35", "scanner": "scanner-primary", "fingerprint": "f7ee901d62c2a800", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "controller/src/services/cli-runner.ts"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8156b682b09495df", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in controller/src/core/command.ts:1"}, "properties": {"repobilityId": "66ba04950318d1e7", "scanner": "scanner-primary", "fingerprint": "8156b682b09495df", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "controller/src/core/command.ts"}, "region": {"startLine": 1}}}]}, {"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-0dc9d15d9a86a2ef", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "d94fc9288377fb7d", "scanner": "scanner-primary", "fingerprint": "0dc9d15d9a86a2ef", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-frontend.yml"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-0dc9d15d9a86a2ef", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "0eec0a67f1e6b898", "scanner": "scanner-primary", "fingerprint": "0dc9d15d9a86a2ef", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-frontend.yml"}, "region": {"startLine": 29}}}]}, {"ruleId": "scanner-0dc9d15d9a86a2ef", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "1023e23114df0e26", "scanner": "scanner-primary", "fingerprint": "0dc9d15d9a86a2ef", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-frontend.yml"}, "region": {"startLine": 37}}}]}, {"ruleId": "scanner-0dc9d15d9a86a2ef", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "c3f4253f5b3a5741", "scanner": "scanner-primary", "fingerprint": "0dc9d15d9a86a2ef", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-frontend.yml"}, "region": {"startLine": 45}}}]}, {"ruleId": "scanner-244a0d5972d41a82", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "d9acf287aceff61c", "scanner": "scanner-primary", "fingerprint": "244a0d5972d41a82", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-frontend.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-21aa0c39a7c1ca23", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "657f2081501998f9", "scanner": "scanner-primary", "fingerprint": "21aa0c39a7c1ca23", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/security.yml"}, "region": {"startLine": 28}}}]}, {"ruleId": "scanner-2c6df24be520b8e8", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "714afa981a0f9718", "scanner": "scanner-primary", "fingerprint": "2c6df24be520b8e8", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/labels.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f12562ea7124e9ce", "level": "note", "message": {"text": "package.json defines install-time lifecycle scripts"}, "properties": {"repobilityId": "8d2593337da0bdd5", "scanner": "scanner-primary", "fingerprint": "f12562ea7124e9ce", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "npm", "install-scripts"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-cc9c8dcf1de0ad41", "level": "note", "message": {"text": "Very large file: tests/frontend/e2e/agent-session-runtime-regressions.test.ts (1847 lines)"}, "properties": {"repobilityId": "a7eae5499301cfae", "scanner": "scanner-primary", "fingerprint": "cc9c8dcf1de0ad41", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "ec923e5d9c38de5a", "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": "8d75d2692c0964b5", "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": "fd67b844b999da10", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "5fee5a65a39c0f1e", "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": "14571c8fa8cdb32a", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-cbb883306d8f1185", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: frontend/AGENTS.md"}, "properties": {"repobilityId": "9b482982edfdf4dd", "scanner": "scanner-primary", "fingerprint": "cbb883306d8f1185", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "agents_md"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/AGENTS.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5cc18e0e2898eb94", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: frontend/desktop/resources/skills/canvas/SKILL.md"}, "properties": {"repobilityId": "622461b09f1b4695", "scanner": "scanner-primary", "fingerprint": "5cc18e0e2898eb94", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/desktop/resources/skills/canvas/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0333ec5054ba1f1f", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: frontend/desktop/resources/skills/browser/SKILL.md"}, "properties": {"repobilityId": "27d735795a7fb0d5", "scanner": "scanner-primary", "fingerprint": "0333ec5054ba1f1f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/desktop/resources/skills/browser/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-75807dcc524448bc", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: frontend/desktop/resources/skills/parchi-browser/SKILL.md"}, "properties": {"repobilityId": "ce2d561e6bfdb72b", "scanner": "scanner-primary", "fingerprint": "75807dcc524448bc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/desktop/resources/skills/parchi-browser/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d4ffea6112d1e6fe", "level": "none", "message": {"text": "Commented-code block (8 lines) in frontend/next.config.ts:15"}, "properties": {"repobilityId": "214fdd1ce21717a1", "scanner": "scanner-primary", "fingerprint": "d4ffea6112d1e6fe", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a3bd3ee2740ad76b", "level": "none", "message": {"text": "Commented-code block (8 lines) in frontend/scripts/validate-ui-structure.mjs:2"}, "properties": {"repobilityId": "2fe5ec64410b8389", "scanner": "scanner-primary", "fingerprint": "a3bd3ee2740ad76b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-77d1ae0d6a9cf5be", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/desktop/resources/pi-extensions/browser.ts:55"}, "properties": {"repobilityId": "f392100db4ed06ea", "scanner": "scanner-primary", "fingerprint": "77d1ae0d6a9cf5be", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-07fea576628e864e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/desktop/resources/pi-extensions/canvas.ts:32"}, "properties": {"repobilityId": "a62b4e313af66d50", "scanner": "scanner-primary", "fingerprint": "07fea576628e864e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-771a9729da9e4b79", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/desktop/resources/pi-extensions/mcp-plugin.ts:279"}, "properties": {"repobilityId": "06222b8153aa86a6", "scanner": "scanner-primary", "fingerprint": "771a9729da9e4b79", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3868d19c105b57c2", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/proxy.ts:22"}, "properties": {"repobilityId": "2d2e9c10925c885b", "scanner": "scanner-primary", "fingerprint": "3868d19c105b57c2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-386b9e9e3013ca62", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/app/error.tsx:7"}, "properties": {"repobilityId": "a0993e0ef21123c5", "scanner": "scanner-primary", "fingerprint": "386b9e9e3013ca62", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f32723e00c4f428e", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/app/chunk-recovery.ts:3"}, "properties": {"repobilityId": "3b83d1a1b66c58b3", "scanner": "scanner-primary", "fingerprint": "f32723e00c4f428e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fead8c91fbcdf6e1", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/app/api/agent/browser/input/route.ts:1"}, "properties": {"repobilityId": "8fb331a020058005", "scanner": "scanner-primary", "fingerprint": "fead8c91fbcdf6e1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b707db64e8b1c199", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/app/api/proxy/[...path]/route.ts:109"}, "properties": {"repobilityId": "c52e814c1083db88", "scanner": "scanner-primary", "fingerprint": "b707db64e8b1c199", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-42005bd2725da7c4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/voice/speak/route.ts:72"}, "properties": {"repobilityId": "d024a5fd37f22bf7", "scanner": "scanner-primary", "fingerprint": "42005bd2725da7c4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-94c4a05f769920fe", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/voice/transcribe/route.ts:42"}, "properties": {"repobilityId": "57012d8442223a44", "scanner": "scanner-primary", "fingerprint": "94c4a05f769920fe", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-19917680d52c34af", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/lib/auth/guard.ts:18"}, "properties": {"repobilityId": "84c83db4912e9604", "scanner": "scanner-primary", "fingerprint": "19917680d52c34af", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1a4a85d198b92811", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/lib/api/core.ts:174"}, "properties": {"repobilityId": "647b8adf99c57041", "scanner": "scanner-primary", "fingerprint": "1a4a85d198b92811", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-08d6a84b46fd8203", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/hooks/use-controller-events.ts:76"}, "properties": {"repobilityId": "242c1f1892dcd3fe", "scanner": "scanner-primary", "fingerprint": "08d6a84b46fd8203", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5521e54480ffdf9f", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/hooks/realtime-status-store.ts:3"}, "properties": {"repobilityId": "b7bbb215b9bd78a9", "scanner": "scanner-primary", "fingerprint": "5521e54480ffdf9f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e9b278f89a98f9d8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/settings/api-connection-section.tsx:124"}, "properties": {"repobilityId": "46f42f8522da09d9", "scanner": "scanner-primary", "fingerprint": "e9b278f89a98f9d8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c56cd2cc4ecfac0e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/dashboard/control-panel/control-panel-v2.tsx:157"}, "properties": {"repobilityId": "7ff6062144fa82b5", "scanner": "scanner-primary", "fingerprint": "c56cd2cc4ecfac0e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0dc5cbaf551081bc", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/features/agent/pi-runtime-types.ts:5"}, "properties": {"repobilityId": "ad45b211280cd1da", "scanner": "scanner-primary", "fingerprint": "0dc5cbaf551081bc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fa562fd76808324a", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/features/agent/prompt-templates-store.ts:1"}, "properties": {"repobilityId": "39cc76a8b6151950", "scanner": "scanner-primary", "fingerprint": "fa562fd76808324a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-03d536f330bc00db", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/agent/pi-runtime-models.ts:138"}, "properties": {"repobilityId": "7e7ba26e4bd5205f", "scanner": "scanner-primary", "fingerprint": "03d536f330bc00db", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9a44ac5c4993fc4b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/agent/projects/api.ts:26"}, "properties": {"repobilityId": "a11625c80b9828e4", "scanner": "scanner-primary", "fingerprint": "9a44ac5c4993fc4b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e1e633910d6473c6", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/features/agent/mcp/store.ts:3"}, "properties": {"repobilityId": "0cb20a547bef7b23", "scanner": "scanner-primary", "fingerprint": "e1e633910d6473c6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-06a727a2c1cb930b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/agent/ui/chat-pane.tsx:510"}, "properties": {"repobilityId": "70b82c8aabb9b3fb", "scanner": "scanner-primary", "fingerprint": "06a727a2c1cb930b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c6d4bd43570a0bdd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/agent/ui/filesystem-panel.tsx:470"}, "properties": {"repobilityId": "685f27a9f7711130", "scanner": "scanner-primary", "fingerprint": "c6d4bd43570a0bdd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8ad37d76fe0411b3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/agent/ui/git-diff-panel.tsx:511"}, "properties": {"repobilityId": "c355fc5bdedd1ae3", "scanner": "scanner-primary", "fingerprint": "8ad37d76fe0411b3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-376e61aa5f6ae6c8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/agent/ui/agent-browser-screencast.tsx:124"}, "properties": {"repobilityId": "1d8d3f7b55259988", "scanner": "scanner-primary", "fingerprint": "376e61aa5f6ae6c8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ca43fe87a82674e5", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/features/agent/ui/use-workspace.ts:221"}, "properties": {"repobilityId": "3a1fd85fa4b27006", "scanner": "scanner-primary", "fingerprint": "ca43fe87a82674e5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-61360ae8366e6ba3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/agent/ui/use-workspace.ts:130"}, "properties": {"repobilityId": "d88615e695006745", "scanner": "scanner-primary", "fingerprint": "61360ae8366e6ba3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cbf2005ddf6f448a", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/features/agent/ui/timeline/session-pane-block-router.tsx:158"}, "properties": {"repobilityId": "2cd43eb829ada737", "scanner": "scanner-primary", "fingerprint": "cbf2005ddf6f448a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-afa5ce6bc4babaf4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/agent/ui/projects-nav/helpers.ts:115"}, "properties": {"repobilityId": "e83c0fc8c9fd170d", "scanner": "scanner-primary", "fingerprint": "afa5ce6bc4babaf4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cf3f90622e1eb791", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/features/agent/workspace/commands.ts:3"}, "properties": {"repobilityId": "9fdff49857b9c101", "scanner": "scanner-primary", "fingerprint": "cf3f90622e1eb791", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e09bf62e113a1db1", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/features/agent/workspace/replay-queue.ts:24"}, "properties": {"repobilityId": "002c53fd82e27f68", "scanner": "scanner-primary", "fingerprint": "e09bf62e113a1db1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ca964ef87658cad9", "level": "none", "message": {"text": "Commented-code block (8 lines) in frontend/src/features/agent/workspace/reducer.ts:148"}, "properties": {"repobilityId": "cf32df1bd33a9616", "scanner": "scanner-primary", "fingerprint": "ca964ef87658cad9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ee19a56b30fe6f5a", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/features/agent/workspace/pane-controller.ts:377"}, "properties": {"repobilityId": "de934918923031b5", "scanner": "scanner-primary", "fingerprint": "ee19a56b30fe6f5a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7ec276cfb56ca715", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/features/agent/messages/message-content.ts:115"}, "properties": {"repobilityId": "e8d3a96616358153", "scanner": "scanner-primary", "fingerprint": "7ec276cfb56ca715", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7ac8a34411cdafc7", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/features/agent/messages/helpers.ts:277"}, "properties": {"repobilityId": "b63b449522936e1c", "scanner": "scanner-primary", "fingerprint": "7ac8a34411cdafc7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-86ebdb68b2f538c9", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/features/agent/messages/block-event.ts:38"}, "properties": {"repobilityId": "d5dee7cece2f7bc0", "scanner": "scanner-primary", "fingerprint": "86ebdb68b2f538c9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5e2a7aa021f96bf7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/agent/runtime/api.ts:101"}, "properties": {"repobilityId": "1796e00bcd693953", "scanner": "scanner-primary", "fingerprint": "5e2a7aa021f96bf7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-958d01b12aa75762", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/features/agent/runtime/pi-event-applier.ts:108"}, "properties": {"repobilityId": "18fbeae3b4140015", "scanner": "scanner-primary", "fingerprint": "958d01b12aa75762", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9cf9194cc08881fd", "level": "none", "message": {"text": "Commented-code block (9 lines) in frontend/src/features/agent/runtime/session-runtime-controller.ts:1"}, "properties": {"repobilityId": "2e73b888eebe876b", "scanner": "scanner-primary", "fingerprint": "9cf9194cc08881fd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5cc48846e682355d", "level": "none", "message": {"text": "Commented-code block (9 lines) in frontend/src/features/agent/runtime/text-delta-coalescer.ts:44"}, "properties": {"repobilityId": "6bcd2d5f397d5607", "scanner": "scanner-primary", "fingerprint": "5cc48846e682355d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b6ab4bf6f6636daa", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/agent/tools/context.tsx:500"}, "properties": {"repobilityId": "3ce24a4d3973d004", "scanner": "scanner-primary", "fingerprint": "b6ab4bf6f6636daa", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0c9d76b7d302ff93", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/features/agent/tools/types.ts:3"}, "properties": {"repobilityId": "ce6f4b82641afb15", "scanner": "scanner-primary", "fingerprint": "0c9d76b7d302ff93", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-45d794c21a090b68", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/features/agent/browser-host/dom-scripts.ts:1"}, "properties": {"repobilityId": "761167421fba1fda", "scanner": "scanner-primary", "fingerprint": "45d794c21a090b68", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2aa6068c85a8cf46", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/features/agent/browser-host/cdp.ts:40"}, "properties": {"repobilityId": "2a429ff4ef87ab49", "scanner": "scanner-primary", "fingerprint": "2aa6068c85a8cf46", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-40496e2b5c8dd3cc", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/features/agent/browser-host/browser-host.ts:521"}, "properties": {"repobilityId": "fb58532918cc20bc", "scanner": "scanner-primary", "fingerprint": "40496e2b5c8dd3cc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a67bdc5d94412275", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/agent/browser-host/browser-host.ts:60"}, "properties": {"repobilityId": "e535499b144e23ab", "scanner": "scanner-primary", "fingerprint": "a67bdc5d94412275", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-08318a5e69369872", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/controller/integration/tool-call-stream.test.ts:50"}, "properties": {"repobilityId": "0a8eff662eca9487", "scanner": "scanner-primary", "fingerprint": "08318a5e69369872", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-456bf4aec3fc04a0", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/validate-barrel-dir-siblings.mjs:2"}, "properties": {"repobilityId": "aa32a85fe9b94876", "scanner": "scanner-primary", "fingerprint": "456bf4aec3fc04a0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7ee84e56059d5577", "level": "none", "message": {"text": "Commented-code block (5 lines) in controller/src/http/app.ts:95"}, "properties": {"repobilityId": "e4fbd661a630b856", "scanner": "scanner-primary", "fingerprint": "7ee84e56059d5577", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8928909a7bd28549", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 controller/src/http/app.ts:127"}, "properties": {"repobilityId": "8453aba72ccb8fe0", "scanner": "scanner-primary", "fingerprint": "8928909a7bd28549", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fa9c29599068306c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 controller/src/modules/engines/downloads/download-manager.ts:328"}, "properties": {"repobilityId": "8a3e3d4e292dbede", "scanner": "scanner-primary", "fingerprint": "fa9c29599068306c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-03576dfd68ce47ee", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 controller/src/modules/engines/downloads/huggingface-api.ts:40"}, "properties": {"repobilityId": "4d4ba592a7f65447", "scanner": "scanner-primary", "fingerprint": "03576dfd68ce47ee", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0ac02f7ab546d4a6", "level": "none", "message": {"text": "Commented-code block (5 lines) in controller/src/modules/proxy/reasoning-fields.ts:1"}, "properties": {"repobilityId": "00a8d729c7427616", "scanner": "scanner-primary", "fingerprint": "0ac02f7ab546d4a6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-768306a346cf490d", "level": "note", "message": {"text": "50 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "d773c011a3ba8e67", "scanner": "scanner-primary", "fingerprint": "768306a346cf490d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-04d33909f1b92531", "level": "error", "message": {"text": "Dangling fetch: GET /api/huggingface/model-card?modelId=${encodeURIComponent(modelId)} (frontend/src/ui/huggingface-model-card.tsx:129)"}, "properties": {"repobilityId": "028fe71fa616ebee", "scanner": "scanner-primary", "fingerprint": "04d33909f1b92531", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8072de2a28e709d2", "level": "error", "message": {"text": "Dangling fetch: GET /peak-metrics${query} (frontend/src/lib/api/system.ts:101)"}, "properties": {"repobilityId": "a3afc45607d23bf7", "scanner": "scanner-primary", "fingerprint": "8072de2a28e709d2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-e54bde01b1d64313", "level": "error", "message": {"text": "Dangling fetch: GET /logs/${sessionId}${query} (frontend/src/lib/api/logs.ts:10)"}, "properties": {"repobilityId": "6c12d5f7fe4d09c9", "scanner": "scanner-primary", "fingerprint": "e54bde01b1d64313", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-8f8f101dc143b6b0", "level": "error", "message": {"text": "Dangling fetch: POST /api/settings (frontend/src/features/settings/api-connection-section.tsx:124)"}, "properties": {"repobilityId": "e6b792d6989873c7", "scanner": "scanner-primary", "fingerprint": "8f8f101dc143b6b0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b5d3a53fccd0edad", "level": "error", "message": {"text": "Dangling fetch: GET /api/agent/sessions/all?archived=1 (frontend/src/features/settings/agent-settings-sections.tsx:32)"}, "properties": {"repobilityId": "6d2bad55522919bd", "scanner": "scanner-primary", "fingerprint": "b5d3a53fccd0edad", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5807ca7d74500d9b", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/agent/sessions/${encodeURIComponent(session.id)} (frontend/src/features/settings/agent-settings-sections.tsx:59)"}, "properties": {"repobilityId": "eb62c09527517f72", "scanner": "scanner-primary", "fingerprint": "5807ca7d74500d9b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-dd2cae7fdc7f748c", "level": "error", "message": {"text": "Dangling fetch: GET /api/agent/skills (frontend/src/features/settings/agent-settings-sections.tsx:135)"}, "properties": {"repobilityId": "3fb480aff074584d", "scanner": "scanner-primary", "fingerprint": "dd2cae7fdc7f748c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a71b904134466e05", "level": "error", "message": {"text": "Dangling fetch: GET /api/agent/setup-checks (frontend/src/features/settings/agent-settings-sections.tsx:181)"}, "properties": {"repobilityId": "b01027ad40196d5d", "scanner": "scanner-primary", "fingerprint": "a71b904134466e05", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8198fcd37de790ef", "level": "error", "message": {"text": "Dangling fetch: GET /api/settings (frontend/src/features/settings/use-settings.ts:68)"}, "properties": {"repobilityId": "be2f5ba95a6cc895", "scanner": "scanner-primary", "fingerprint": "8198fcd37de790ef", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e1c5394fd30094c8", "level": "error", "message": {"text": "Dangling fetch: POST /api/settings (frontend/src/features/settings/use-settings.ts:178)"}, "properties": {"repobilityId": "10758e562091a1b7", "scanner": "scanner-primary", "fingerprint": "e1c5394fd30094c8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7a9dea2126fe775c", "level": "error", "message": {"text": "Dangling fetch: GET /api/local-agents (frontend/src/features/settings/attach-local-agents-dialog.tsx:22)"}, "properties": {"repobilityId": "865685764a1cbe62", "scanner": "scanner-primary", "fingerprint": "7a9dea2126fe775c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a38a5be3cb6d8dd2", "level": "error", "message": {"text": "Dangling fetch: POST /api/local-agents (frontend/src/features/settings/attach-local-agents-dialog.tsx:48)"}, "properties": {"repobilityId": "625de64411643cec", "scanner": "scanner-primary", "fingerprint": "a38a5be3cb6d8dd2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f21e38dd68e305f1", "level": "error", "message": {"text": "Dangling fetch: POST /api/settings (frontend/src/features/dashboard/control-panel/control-panel-v2.tsx:157)"}, "properties": {"repobilityId": "f2103626ffe5d86c", "scanner": "scanner-primary", "fingerprint": "f21e38dd68e305f1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0951ec0419b1b2dc", "level": "error", "message": {"text": "Dangling fetch: GET /api/agent/projects (frontend/src/features/agent/projects/api.ts:26)"}, "properties": {"repobilityId": "9c350fc7c3dd34e5", "scanner": "scanner-primary", "fingerprint": "0951ec0419b1b2dc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-77500eaf32374969", "level": "error", "message": {"text": "Dangling fetch: POST /api/agent/projects (frontend/src/features/agent/projects/api.ts:38)"}, "properties": {"repobilityId": "34f9ae01eabe2fe6", "scanner": "scanner-primary", "fingerprint": "77500eaf32374969", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-636f04479b4d65a0", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/agent/projects?id=${encodeURIComponent(id)} (frontend/src/features/agent/projects/api.ts:56)"}, "properties": {"repobilityId": "4a81b1bcac9868ca", "scanner": "scanner-primary", "fingerprint": "636f04479b4d65a0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1bc932e597c35081", "level": "error", "message": {"text": "Dangling fetch: GET /api/agent/git?cwd=${encodeURIComponent(cwd)} (frontend/src/features/agent/projects/api.ts:66)"}, "properties": {"repobilityId": "b51fbdd7cc918cc1", "scanner": "scanner-primary", "fingerprint": "1bc932e597c35081", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7647aea933215024", "level": "error", "message": {"text": "Dangling fetch: POST /api/agent/git?cwd=${encodeURIComponent(cwd)} (frontend/src/features/agent/projects/api.ts:80)"}, "properties": {"repobilityId": "e56ed286d28c5dc5", "scanner": "scanner-primary", "fingerprint": "7647aea933215024", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-87ba8fa24a945a13", "level": "error", "message": {"text": "Dangling fetch: GET /api/agent/fs?cwd=${encodeURIComponent(cwd)} (frontend/src/features/agent/ui/chat-pane.tsx:510)"}, "properties": {"repobilityId": "939a9a8b0429a2b7", "scanner": "scanner-primary", "fingerprint": "87ba8fa24a945a13", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-22ff60242a4c3973", "level": "error", "message": {"text": "Dangling fetch: GET /api/agent/fs?cwd=${encodeURIComponent(requestCwd)}&path=${encodeURIComponent(dirRel)} (frontend/src/features/agent/ui/filesystem-panel.tsx:71)"}, "properties": {"repobilityId": "816001a9167b5735", "scanner": "scanner-primary", "fingerprint": "22ff60242a4c3973", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c3a02d581d80cfaa", "level": "error", "message": {"text": "Dangling fetch: POST /api/agent/comments (frontend/src/features/agent/ui/filesystem-panel.tsx:124)"}, "properties": {"repobilityId": "9973f1450575d168", "scanner": "scanner-primary", "fingerprint": "c3a02d581d80cfaa", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7820f0bbb249339d", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/agent/comments?cwd=${encodeURIComponent(cwd)}&path=${encodeURIComponent(openFile)}&id=${encodeURIComponent(id)} (frontend/src/features/agent/ui/filesystem-panel.tsx:142)"}, "properties": {"repobilityId": "b758675622a26ff0", "scanner": "scanner-primary", "fingerprint": "7820f0bbb249339d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1710301f8ed9be85", "level": "error", "message": {"text": "Dangling fetch: GET /api/agent/fs?cwd=${encodeURIComponent(cwd)}&path=${encodeURIComponent(relPath)} (frontend/src/features/agent/ui/filesystem-panel.tsx:419)"}, "properties": {"repobilityId": "07ed3b3556237927", "scanner": "scanner-primary", "fingerprint": "1710301f8ed9be85", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-84a0f88a97bf7990", "level": "error", "message": {"text": "Dangling fetch: GET /api/agent/fs/file?cwd=${encodeURIComponent(cwd)}&path=${encodeURIComponent(openFile)} (frontend/src/features/agent/ui/filesystem-panel.tsx:466)"}, "properties": {"repobilityId": "3fe003dfc00f726e", "scanner": "scanner-primary", "fingerprint": "84a0f88a97bf7990", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-77e73f05c33ccd1e", "level": "error", "message": {"text": "Dangling fetch: GET /api/agent/git?cwd=${encodeURIComponent(cwd)} (frontend/src/features/agent/ui/git-diff-panel.tsx:511)"}, "properties": {"repobilityId": "0044b97818e45cb4", "scanner": "scanner-primary", "fingerprint": "77e73f05c33ccd1e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b9bbcb0c9c7067dd", "level": "error", "message": {"text": "Dangling fetch: POST /api/agent/git?cwd=${encodeURIComponent(cwd)} (frontend/src/features/agent/ui/git-diff-panel.tsx:520)"}, "properties": {"repobilityId": "989ea4e143ae8920", "scanner": "scanner-primary", "fingerprint": "b9bbcb0c9c7067dd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b85080c03737be60", "level": "error", "message": {"text": "Dangling fetch: GET /api/agent/sessions/all?since=30d (frontend/src/features/agent/ui/sessions-command.tsx:131)"}, "properties": {"repobilityId": "9e78622fa58f1f6a", "scanner": "scanner-primary", "fingerprint": "b85080c03737be60", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c45fbafd5fa78097", "level": "error", "message": {"text": "Dangling fetch: POST /api/agent/terminal/resolve-cwd (frontend/src/features/agent/ui/terminal-panel.tsx:367)"}, "properties": {"repobilityId": "e1654cc1e5e6f1bc", "scanner": "scanner-primary", "fingerprint": "c45fbafd5fa78097", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-254f74a4c26dcbfd", "level": "error", "message": {"text": "Dangling fetch: POST /api/agent/terminal?cwd=${encodeURIComponent(session.cwd)} (frontend/src/features/agent/ui/terminal-panel.tsx:410)"}, "properties": {"repobilityId": "b1883af8a0ab6e5c", "scanner": "scanner-primary", "fingerprint": "254f74a4c26dcbfd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-147f7e6b42daa889", "level": "error", "message": {"text": "Dangling fetch: POST /api/agent/browser/${path} (frontend/src/features/agent/ui/agent-browser-screencast.tsx:52)"}, "properties": {"repobilityId": "ec0412b0b46b1743", "scanner": "scanner-primary", "fingerprint": "147f7e6b42daa889", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9bba37104b212548", "level": "error", "message": {"text": "Dangling fetch: GET /api/agent/browser/frame (frontend/src/features/agent/ui/agent-browser-screencast.tsx:87)"}, "properties": {"repobilityId": "99e17926a79133a7", "scanner": "scanner-primary", "fingerprint": "9bba37104b212548", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4b77d279080af169", "level": "error", "message": {"text": "Dangling fetch: POST /api/agent/browser/navigate (frontend/src/features/agent/ui/agent-browser-screencast.tsx:124)"}, "properties": {"repobilityId": "687d084331b9f3b8", "scanner": "scanner-primary", "fingerprint": "4b77d279080af169", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0f7b580066fed25e", "level": "error", "message": {"text": "Dangling fetch: POST /api/agent/models (frontend/src/features/agent/ui/use-workspace.ts:130)"}, "properties": {"repobilityId": "7208741ba63cbab2", "scanner": "scanner-primary", "fingerprint": "0f7b580066fed25e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7c14e8b8947d56fb", "level": "error", "message": {"text": "Dangling fetch: GET /api/agent/setup-checks (frontend/src/features/agent/ui/use-workspace.ts:144)"}, "properties": {"repobilityId": "0440c7c4bd7ed229", "scanner": "scanner-primary", "fingerprint": "7c14e8b8947d56fb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fd69e50dfb4bd8f7", "level": "error", "message": {"text": "Dangling fetch: POST /api/agent/browser/result (frontend/src/features/agent/ui/use-workspace.ts:637)"}, "properties": {"repobilityId": "b849149817445127", "scanner": "scanner-primary", "fingerprint": "fd69e50dfb4bd8f7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-765519852b49016a", "level": "error", "message": {"text": "Dangling fetch: GET /api/agent/browser/fetch?url=${encodeURIComponent(target)} (frontend/src/features/agent/ui/agent-browser.tsx:127)"}, "properties": {"repobilityId": "51fc2e430ca11fd8", "scanner": "scanner-primary", "fingerprint": "765519852b49016a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-239015ee60bb1a58", "level": "error", "message": {"text": "Dangling fetch: POST /api/agent/browser/${verb} (frontend/src/features/agent/ui/agent-browser.tsx:160)"}, "properties": {"repobilityId": "7eb97a1804157577", "scanner": "scanner-primary", "fingerprint": "239015ee60bb1a58", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-58ea6e60f15d8e1b", "level": "error", "message": {"text": "Dangling fetch: GET /api/agent/browser/localhosts (frontend/src/features/agent/ui/agent-browser.tsx:175)"}, "properties": {"repobilityId": "d4bd8edbaa0c0dca", "scanner": "scanner-primary", "fingerprint": "58ea6e60f15d8e1b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f32d4b260ec985e4", "level": "error", "message": {"text": "Dangling fetch: GET /api/agent/browser/localhosts (frontend/src/features/agent/ui/agent-browser.tsx:636)"}, "properties": {"repobilityId": "664a5cc27922befa", "scanner": "scanner-primary", "fingerprint": "f32d4b260ec985e4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e76eabfddac549b4", "level": "error", "message": {"text": "Dangling fetch: GET /api/agent/sessions/all?since=90d (frontend/src/features/agent/ui/sessions-page.tsx:67)"}, "properties": {"repobilityId": "6882aaf373c7679d", "scanner": "scanner-primary", "fingerprint": "e76eabfddac549b4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1362f06d72def9c5", "level": "error", "message": {"text": "Dangling fetch: GET /api/agent/sessions?cwd=${encodeURIComponent(project.path)}&since=30d&ids=${idsParam} (frontend/src/features/agent/ui/projects-nav/use-projects-nav-effects.ts:173)"}, "properties": {"repobilityId": "325edc0cc8ac485e", "scanner": "scanner-primary", "fingerprint": "1362f06d72def9c5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9868b491c655cbcc", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/agent/sessions/${encodeURIComponent(sessionId)} (frontend/src/features/agent/ui/projects-nav/helpers.ts:115)"}, "properties": {"repobilityId": "d404568f946b7839", "scanner": "scanner-primary", "fingerprint": "9868b491c655cbcc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6addcc8b6a823e64", "level": "error", "message": {"text": "Dangling fetch: GET /api/agent/directories${query} (frontend/src/features/agent/ui/projects-nav/directory-picker-modal.tsx:33)"}, "properties": {"repobilityId": "dbd19488f998fc88", "scanner": "scanner-primary", "fingerprint": "6addcc8b6a823e64", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2ec06d045751f2a2", "level": "error", "message": {"text": "Dangling fetch: GET /api/agent/sessions?cwd=${encodeURIComponent(project.path)}&since=7d (frontend/src/features/agent/ui/projects-nav/session-rows.tsx:166)"}, "properties": {"repobilityId": "1273e2ecb99ba69a", "scanner": "scanner-primary", "fingerprint": "2ec06d045751f2a2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0b41d59736aefc3d", "level": "error", "message": {"text": "Dangling fetch: GET /api/agent/runtime/sessions (frontend/src/features/agent/runtime/api.ts:50)"}, "properties": {"repobilityId": "310533b384649da2", "scanner": "scanner-primary", "fingerprint": "0b41d59736aefc3d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0ac72725362e97b7", "level": "error", "message": {"text": "Dangling fetch: GET /api/agent/runtime/status?${params.toString()} (frontend/src/features/agent/runtime/api.ts:65)"}, "properties": {"repobilityId": "0ea508b552935147", "scanner": "scanner-primary", "fingerprint": "0ac72725362e97b7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ab6e31f35eb9e02e", "level": "error", "message": {"text": "Dangling fetch: POST /api/agent/abort (frontend/src/features/agent/runtime/api.ts:86)"}, "properties": {"repobilityId": "c7cbfc31124b0151", "scanner": "scanner-primary", "fingerprint": "ab6e31f35eb9e02e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4b9e50cdd311ba28", "level": "error", "message": {"text": "Dangling fetch: POST /api/agent/sessions/${encodeURIComponent(piSessionId)}?cwd=${encodeURIComponent(cwd)} (frontend/src/features/agent/runtime/api.ts:101)"}, "properties": {"repobilityId": "314ff335e7afa12d", "scanner": "scanner-primary", "fingerprint": "4b9e50cdd311ba28", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-803d20cca6026655", "level": "error", "message": {"text": "Dangling fetch: POST /api/agent/turn (frontend/src/features/agent/runtime/api.ts:161)"}, "properties": {"repobilityId": "9d094fadd7f76fed", "scanner": "scanner-primary", "fingerprint": "803d20cca6026655", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5225769951b3ded7", "level": "error", "message": {"text": "Dangling fetch: POST /api/agent/canvas${canvasQuery(activeCanvasSessionRef.current)} (frontend/src/features/agent/tools/context.tsx:293)"}, "properties": {"repobilityId": "8116157bca507e8a", "scanner": "scanner-primary", "fingerprint": "5225769951b3ded7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-857c11c51bf4b9e5", "level": "error", "message": {"text": "Dangling fetch: POST /api/agent/canvas${canvasQuery(activeCanvasSessionRef.current)} (frontend/src/features/agent/tools/context.tsx:306)"}, "properties": {"repobilityId": "8f19f1339b1b124d", "scanner": "scanner-primary", "fingerprint": "857c11c51bf4b9e5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5691f95f6e7d68a4", "level": "error", "message": {"text": "Dangling fetch: POST /api/agent/canvas${canvasQuery(activeCanvasSessionRef.current)} (frontend/src/features/agent/tools/context.tsx:327)"}, "properties": {"repobilityId": "f036275ca5a03b89", "scanner": "scanner-primary", "fingerprint": "5691f95f6e7d68a4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ab956b0b7009e71a", "level": "error", "message": {"text": "Dangling fetch: GET /api/agent/canvas${query} (frontend/src/features/agent/tools/context.tsx:500)"}, "properties": {"repobilityId": "85874c6c5ba424b3", "scanner": "scanner-primary", "fingerprint": "ab956b0b7009e71a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-12031328e2b26b88", "level": "error", "message": {"text": "Dangling fetch: GET /api/agent/plugins?includeDisabled=1 (frontend/src/features/agent/tools/context.tsx:558)"}, "properties": {"repobilityId": "bc2e512ea08257bd", "scanner": "scanner-primary", "fingerprint": "12031328e2b26b88", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6da3be61b14e63a8", "level": "error", "message": {"text": "Dangling fetch: GET /api/agent/skills (frontend/src/features/agent/tools/context.tsx:562)"}, "properties": {"repobilityId": "0b4c86db791d47c8", "scanner": "scanner-primary", "fingerprint": "6da3be61b14e63a8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0a0dd9d332f03a45", "level": "error", "message": {"text": "Dangling fetch: GET /api/agent/prompt-templates (frontend/src/features/agent/tools/context.tsx:566)"}, "properties": {"repobilityId": "bebafb23d295d1d9", "scanner": "scanner-primary", "fingerprint": "0a0dd9d332f03a45", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-97decbf88444e42a", "level": "error", "message": {"text": "Dangling fetch: GET http://127.0.0.1:${port}/json (frontend/src/features/agent/browser-host/browser-host.ts:60)"}, "properties": {"repobilityId": "2e7dcab045f2c8e0", "scanner": "scanner-primary", "fingerprint": "97decbf88444e42a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-68a05007e3774f96", "level": "error", "message": {"text": "Dangling fetch: PUT http://127.0.0.1:${port}/json/new?about:blank (frontend/src/features/agent/browser-host/browser-host.ts:74)"}, "properties": {"repobilityId": "59cde6ddf27fe4c4", "scanner": "scanner-primary", "fingerprint": "68a05007e3774f96", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-800930225b5aedf3", "level": "error", "message": {"text": "Dangling fetch: POST /api/proxy/launch/${recipeId} (frontend/src/features/recipes/recipes-content/recipes-content-model.ts:164)"}, "properties": {"repobilityId": "d4069107ee29655a", "scanner": "scanner-primary", "fingerprint": "800930225b5aedf3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bf410846c769b3fe", "level": "error", "message": {"text": "Dangling fetch: GET /api/mcp/servers?includeDisabled=1 (frontend/src/features/plugins/plugins-page.tsx:96)"}, "properties": {"repobilityId": "c506afba58ed75ab", "scanner": "scanner-primary", "fingerprint": "bf410846c769b3fe", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8a0530e8a7e1ab8d", "level": "error", "message": {"text": "Dangling fetch: GET /api/mcp/registry?q=${encodeURIComponent(search)}&limit=28 (frontend/src/features/plugins/plugins-page.tsx:111)"}, "properties": {"repobilityId": "53c8e62ddea6c833", "scanner": "scanner-primary", "fingerprint": "8a0530e8a7e1ab8d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-decf01a5681c116e", "level": "error", "message": {"text": "Dangling fetch: POST /api/mcp/servers (frontend/src/features/plugins/plugins-page.tsx:162)"}, "properties": {"repobilityId": "e8265f0b4fa2cffe", "scanner": "scanner-primary", "fingerprint": "decf01a5681c116e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2ee153ca51afa39e", "level": "error", "message": {"text": "Dangling fetch: POST /api/mcp/registry (frontend/src/features/plugins/plugins-page.tsx:184)"}, "properties": {"repobilityId": "960eb178ab3a531f", "scanner": "scanner-primary", "fingerprint": "2ee153ca51afa39e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4ad129c017867651", "level": "error", "message": {"text": "Dangling fetch: GET /logs/route-test?limit=1 (tests/controller/integration/observability-contracts.test.ts:88)"}, "properties": {"repobilityId": "3e33591c8112eabb", "scanner": "scanner-primary", "fingerprint": "4ad129c017867651", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-f40fc0a00f8a33f0", "level": "error", "message": {"text": "Dangling fetch: GET /logs/route-test/stream?tail=1 (tests/controller/integration/observability-contracts.test.ts:98)"}, "properties": {"repobilityId": "76f5ff6a378935da", "scanner": "scanner-primary", "fingerprint": "f40fc0a00f8a33f0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-4fe932b64cc7ba33", "level": "error", "message": {"text": "Dangling fetch: DELETE /logs/controller (tests/controller/integration/observability-contracts.test.ts:124)"}, "properties": {"repobilityId": "d1d702d4f4b2be53", "scanner": "scanner-primary", "fingerprint": "4fe932b64cc7ba33", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-817b874b0e6f9855", "level": "error", "message": {"text": "Dangling fetch: GET /controllers/route/status?target=file:///etc/passwd (tests/controller/integration/observability-contracts.test.ts:274)"}, "properties": {"repobilityId": "f6b871a7ccfa3330", "scanner": "scanner-primary", "fingerprint": "817b874b0e6f9855", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-fb010fbbbe5af3c4", "level": "error", "message": {"text": "Dangling fetch: GET /missing-route (tests/controller/integration/observability-contracts.test.ts:584)"}, "properties": {"repobilityId": "62970df1bf6d6d17", "scanner": "scanner-primary", "fingerprint": "fb010fbbbe5af3c4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-e22ac79ad972c13b", "level": "error", "message": {"text": "Dangling fetch: GET /controllers/route/v1/models?target=${encodeURIComponent(target)}&limit=2 (tests/controller/integration/proxy-forwarding-contracts.test.ts:54)"}, "properties": {"repobilityId": "725afa3ec8327b6a", "scanner": "scanner-primary", "fingerprint": "e22ac79ad972c13b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-02726d953d69970d", "level": "error", "message": {"text": "Dangling fetch: POST /controllers/route/v1/chat/completions?target=${encodeURIComponent(target)} (tests/controller/integration/proxy-forwarding-contracts.test.ts:129)"}, "properties": {"repobilityId": "0e9b926c8bdd5361", "scanner": "scanner-primary", "fingerprint": "02726d953d69970d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-7a3fd04922911f3c", "level": "error", "message": {"text": "Dangling fetch: GET /recipes/route-test-recipe (tests/controller/integration/runtime-recipe-contracts.test.ts:55)"}, "properties": {"repobilityId": "2b433528c6685b9f", "scanner": "scanner-primary", "fingerprint": "7a3fd04922911f3c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-bc28fc7f7251ee88", "level": "error", "message": {"text": "Dangling fetch: PUT /recipes/route-test-recipe (tests/controller/integration/runtime-recipe-contracts.test.ts:64)"}, "properties": {"repobilityId": "99d00d786c4cca1b", "scanner": "scanner-primary", "fingerprint": "bc28fc7f7251ee88", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-f273eafd162d130e", "level": "error", "message": {"text": "Dangling fetch: GET /recipes/route-test-recipe (tests/controller/integration/runtime-recipe-contracts.test.ts:77)"}, "properties": {"repobilityId": "48794477befdf98e", "scanner": "scanner-primary", "fingerprint": "f273eafd162d130e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-fd698641230efc4d", "level": "error", "message": {"text": "Dangling fetch: DELETE /recipes/route-test-recipe (tests/controller/integration/runtime-recipe-contracts.test.ts:86)"}, "properties": {"repobilityId": "4e912ead2dbe9ef6", "scanner": "scanner-primary", "fingerprint": "fd698641230efc4d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-50c931a80c7b0eab", "level": "error", "message": {"text": "Dangling fetch: GET /recipes/route-test-recipe (tests/controller/integration/runtime-recipe-contracts.test.ts:93)"}, "properties": {"repobilityId": "c8d7c3ec90103e05", "scanner": "scanner-primary", "fingerprint": "50c931a80c7b0eab", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-f2e666392cd2f2dd", "level": "error", "message": {"text": "Dangling fetch: POST /launch/missing-recipe (tests/controller/integration/runtime-recipe-contracts.test.ts:155)"}, "properties": {"repobilityId": "39ce12c2b2373d32", "scanner": "scanner-primary", "fingerprint": "f2e666392cd2f2dd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-30188257b899f711", "level": "error", "message": {"text": "Dangling fetch: POST /launch/missing-recipe/cancel (tests/controller/integration/runtime-recipe-contracts.test.ts:162)"}, "properties": {"repobilityId": "2750d8f5dcc44289", "scanner": "scanner-primary", "fingerprint": "30188257b899f711", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-2ab7dd7c310110d9", "level": "error", "message": {"text": "Dangling fetch: POST /studio/downloads/missing-download/${action} (tests/controller/integration/runtime-recipe-contracts.test.ts:244)"}, "properties": {"repobilityId": "8a4707ec7ed96646", "scanner": "scanner-primary", "fingerprint": "2ab7dd7c310110d9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-8953905a7a14fb5d", "level": "error", "message": {"text": "Dangling fetch: GET /runtime/jobs/missing-job (tests/controller/integration/runtime-recipe-contracts.test.ts:620)"}, "properties": {"repobilityId": "a3471a0771b3621d", "scanner": "scanner-primary", "fingerprint": "8953905a7a14fb5d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-e984766c52bbc8a5", "level": "error", "message": {"text": "Dangling fetch: POST /runtime/jobs/missing-job/cancel (tests/controller/integration/runtime-recipe-contracts.test.ts:625)"}, "properties": {"repobilityId": "b7f55a681c8a241b", "scanner": "scanner-primary", "fingerprint": "e984766c52bbc8a5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-52ddad3b2d41c3eb", "level": "error", "message": {"text": "Dangling fetch: PUT /studio/providers/local (tests/controller/integration/system-studio-contracts.test.ts:207)"}, "properties": {"repobilityId": "a57ddbc62ce19fc4", "scanner": "scanner-primary", "fingerprint": "52ddad3b2d41c3eb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-28b74b4073810164", "level": "error", "message": {"text": "Dangling fetch: DELETE /studio/providers/local (tests/controller/integration/system-studio-contracts.test.ts:229)"}, "properties": {"repobilityId": "2af359e3bf9eec6c", "scanner": "scanner-primary", "fingerprint": "28b74b4073810164", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-a5d9049496c6f443", "level": "error", "message": {"text": "Dangling fetch: GET /v1/models/catalog-route-served (tests/controller/integration/model-catalog-contracts.test.ts:105)"}, "properties": {"repobilityId": "1a4260f926bb95cc", "scanner": "scanner-primary", "fingerprint": "a5d9049496c6f443", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-2d96761ee5833fa3", "level": "error", "message": {"text": "Dangling fetch: GET /v1/models/missing-model (tests/controller/integration/model-catalog-contracts.test.ts:116)"}, "properties": {"repobilityId": "1a2de45127b05066", "scanner": "scanner-primary", "fingerprint": "2d96761ee5833fa3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-679752892ba212ce", "level": "note", "message": {"text": "Unused endpoint: ALL /controllers/route/*"}, "properties": {"repobilityId": "0baa0d389cf6b6f6", "scanner": "scanner-primary", "fingerprint": "679752892ba212ce", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e21e206e941b549d", "level": "note", "message": {"text": "Unused endpoint: POST /launch/:recipeId/cancel"}, "properties": {"repobilityId": "afdc4a9d3a99cdda", "scanner": "scanner-primary", "fingerprint": "e21e206e941b549d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cea36574c44ffac4", "level": "note", "message": {"text": "Unused endpoint: GET /studio/downloads/:downloadId"}, "properties": {"repobilityId": "ad5632018d604266", "scanner": "scanner-primary", "fingerprint": "cea36574c44ffac4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-30f1bbcbbbd304e9", "level": "note", "message": {"text": "Unused endpoint: GET /runtime/targets/:targetId/health"}, "properties": {"repobilityId": "79ac5854d010ba81", "scanner": "scanner-primary", "fingerprint": "30f1bbcbbbd304e9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-44a0182e6aeba7fc", "level": "note", "message": {"text": "Unused endpoint: GET /v1/models/:modelId"}, "properties": {"repobilityId": "ed7bcae3af0012b4", "scanner": "scanner-primary", "fingerprint": "44a0182e6aeba7fc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fb8f6ab0dfe5241c", "level": "note", "message": {"text": "Unused endpoint: GET /v1/huggingface/models"}, "properties": {"repobilityId": "debdd6a23f601f20", "scanner": "scanner-primary", "fingerprint": "fb8f6ab0dfe5241c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4e8d00df8e84a3bb", "level": "note", "message": {"text": "Unused endpoint: GET /logs/:sessionId"}, "properties": {"repobilityId": "2cf20e3d26cdc66a", "scanner": "scanner-primary", "fingerprint": "4e8d00df8e84a3bb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d4ba7de8e3743014", "level": "note", "message": {"text": "Unused endpoint: GET /logs/:sessionId/stream"}, "properties": {"repobilityId": "9b8176fcf42acb3a", "scanner": "scanner-primary", "fingerprint": "d4ba7de8e3743014", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}