{"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-afb8d5ab143ff4e4", "name": "Possibly dead Python function: handle_request", "shortDescription": {"text": "Possibly dead Python function: handle_request"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5c1c4bc53bf025a7", "name": "Possibly dead Python function: stdin_reader", "shortDescription": {"text": "Possibly dead Python function: stdin_reader"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bead75b0f9233e05", "name": "No API endpoints detected", "shortDescription": {"text": "No API endpoints detected"}, "fullDescription": {"text": "The scanner did not find FastAPI/Flask/Express/NestJS/GraphQL/gRPC routes. If this repo exposes APIs, the framework may be unsupported."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8578a5f1f9a0285c", "name": "Stray `console.log` in TS/JS \u2014 crates/biorouter-cli/static/script.js:147", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 crates/biorouter-cli/static/script.js:147"}, "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-4cfa580387ad94da", "name": "TODO/FIXME marker in shipping code \u2014 crates/biorouter-bench/src/assets/vscode_config_registry.ts:698", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 crates/biorouter-bench/src/assets/vscode_config_registry.ts:698"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9a1547835a8fd3fc", "name": "Stray `console.log` in TS/JS \u2014 ui/desktop/tests/e2e/bioroffice-install.spec.ts:45", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/tests/e2e/bioroffice-install.spec.ts:45"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-752c40d9769fe610", "name": "Stray `console.log` in TS/JS \u2014 ui/desktop/tests/e2e/bioroffice-verify.spec.ts:107", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/tests/e2e/bioroffice-verify.spec.ts:107"}, "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-81ae1c9767eadfff", "name": "Stray `console.log` in TS/JS \u2014 ui/desktop/tests/e2e/app.spec.ts:45", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/tests/e2e/app.spec.ts:45"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-955ab8cf05bae0e8", "name": "Stray `console.log` in TS/JS \u2014 ui/desktop/tests/e2e/spokeagent-skills.spec.ts:160", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/tests/e2e/spokeagent-skills.spec.ts:160"}, "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-6991bac2ce328794", "name": "Stray `console.log` in TS/JS \u2014 ui/desktop/tests/e2e/brxt-spoke-install.spec.ts:30", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/tests/e2e/brxt-spoke-install.spec.ts:30"}, "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-e192111bf7417f65", "name": "Stray `console.log` in TS/JS \u2014 ui/desktop/scripts/unregister-deeplink-protocols.js:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/scripts/unregister-deeplink-protocols.js:13"}, "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-6c48169d8a62582e", "name": "Stray `console.log` in TS/JS \u2014 ui/desktop/scripts/fetch-llama-server.js:72", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/scripts/fetch-llama-server.js:72"}, "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-cd2b47ea528803a8", "name": "Stray `console.log` in TS/JS \u2014 ui/desktop/scripts/prepare-platform-binaries.js:41", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/scripts/prepare-platform-binaries.js:41"}, "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-5df8b7b2e08031a4", "name": "Stray `console.log` in TS/JS \u2014 ui/desktop/scripts/build-main.js:41", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/scripts/build-main.js:41"}, "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-adfd60d5e44a9f74", "name": "Stray `console.log` in TS/JS \u2014 ui/desktop/scripts/download-mingit.js:83", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/scripts/download-mingit.js:83"}, "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-c877bee2f96e8507", "name": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/renderer.tsx:51", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/renderer.tsx: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-209bd4a42980557e", "name": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/main.ts:113", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/main.ts:113"}, "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-afeb9e6c69059593", "name": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/App.test.tsx:297", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/App.test.tsx:297"}, "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-8144215e3a87b2cd", "name": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/App.tsx:97", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/App.tsx:97"}, "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-b2a496bdcd0ad4c7", "name": "TODO/FIXME marker in shipping code \u2014 ui/desktop/src/workflow/index.ts:17", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 ui/desktop/src/workflow/index.ts:17"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c7abadaee6f4348d", "name": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/workflow/index.ts:41", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/workflow/index.ts:41"}, "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-cd7ddcfb5834bcda", "name": "TODO/FIXME marker in shipping code \u2014 ui/desktop/src/api/client/client.gen.ts:246", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 ui/desktop/src/api/client/client.gen.ts:246"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-70dc3b5b77044833", "name": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/utils/providerUtils.ts:33", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/utils/providerUtils.ts:33"}, "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-9ca4d521bfdfd0db", "name": "TODO/FIXME marker in shipping code \u2014 ui/desktop/src/utils/sessionNameSync.test.ts:60", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 ui/desktop/src/utils/sessionNameSync.test.ts:60"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-43a58d43946f4249", "name": "TODO/FIXME marker in shipping code \u2014 ui/desktop/src/contexts/ChatContext.tsx:5", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 ui/desktop/src/contexts/ChatContext.tsx:5"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-94674d2002fbfb14", "name": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/hooks/useWorkflowManager.ts:78", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/hooks/useWorkflowManager.ts:78"}, "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-e06d8f995e21c2c8", "name": "TODO/FIXME marker in shipping code \u2014 ui/desktop/src/hooks/useChatStream.ts:660", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 ui/desktop/src/hooks/useChatStream.ts:660"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7c55c758323c8c9c", "name": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/hooks/useChatStream.ts:326", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/hooks/useChatStream.ts:326"}, "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-046b9e14a3ad6c75", "name": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/hooks/useCostTracking.ts:65", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/hooks/useCostTracking.ts:65"}, "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-fca032ee6cea14f8", "name": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/ChatInput.tsx:1587", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/ChatInput.tsx:1587"}, "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-c0afa4561c12cc83", "name": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/components/ChatInput.tsx:470", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/components/ChatInput.tsx:470"}, "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-5015a779f3418f02", "name": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/components/MarkdownContent.test.tsx:91", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/components/MarkdownContent.test.tsx:91"}, "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-b40b89d58e64dabd", "name": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/components/ExtensionInstallModal.tsx:163", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/components/ExtensionInstallModal.tsx:163"}, "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-b4fe3338233d3480", "name": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/ToolCallWithResponse.tsx:258", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/ToolCallWithResponse.tsx:258"}, "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-07aaf8fa25198c85", "name": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/components/ConfigContext.tsx:116", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/components/ConfigContext.tsx:116"}, "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-319b1ea91b41b416", "name": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/GroupedExtensionLoadingToast.tsx:103", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/GroupedExtensionLoadingToast.tsx:103"}, "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-360e33537e7400a8", "name": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/MentionPopover.tsx:719", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/MentionPopover.tsx:719"}, "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-a5399c3fcfe8b1c8", "name": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/components/AnnouncementModal.tsx:97", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/components/AnnouncementModal.tsx:97"}, "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-7d310cb6f2217e0b", "name": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/components/ModelAndProviderContext.tsx:122", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/components/ModelAndProviderContext.tsx:122"}, "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-35cd379d71f1da82", "name": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/components/McpApps/McpAppRenderer.tsx:184", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/components/McpApps/McpAppRenderer.tsx:184"}, "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-8fa7490a964f7aa4", "name": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/sessions/SessionsInsights.tsx:285", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/sessions/SessionsInsights.tsx:285"}, "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-ab30fd115742749c", "name": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/sessions/SessionListView.tsx:606", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/sessions/SessionListView.tsx:606"}, "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-0bd1b00f931f8414", "name": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/Dashboard/WindowTitleBar.tsx:74", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/Dashboard/WindowTitleBar.tsx:74"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ba987b766ede4681", "name": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/Dashboard/FoldedCard.tsx:149", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/Dashboard/FoldedCard.tsx:149"}, "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-69e581be5bae4a46", "name": "TODO/FIXME marker in shipping code \u2014 ui/desktop/src/components/alerts/useToolCount.ts:4", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 ui/desktop/src/components/alerts/useToolCount.ts:4"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3033ecbce588f3fe", "name": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/components/settings/extensions/deeplink.ts:177", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/components/settings/extensions/deeplink.ts:177"}, "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-014eb0ca4c054c8e", "name": "TODO/FIXME marker in shipping code \u2014 ui/desktop/src/components/settings/extensions/utils.ts:4", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 ui/desktop/src/components/settings/extensions/utils.ts:4"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4a5b3c9e3fa69d48", "name": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/settings/extensions/subcomponents/Extensi", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/settings/extensions/subcomponents/ExtensionItem.tsx:65"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b9ff5f2fecf98de8", "name": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/components/settings/extensions/modal/ExtensionModal.tsx:308", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/components/settings/extensions/modal/ExtensionModal.tsx:308"}, "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-e7aa1f17b38d85f5", "name": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/settings/providers/subcomponents/Provider", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/settings/providers/subcomponents/ProviderCard.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-2936052a3b88681e", "name": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/settings/providers/subcomponents/CardHead", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/settings/providers/subcomponents/CardHeader.tsx:13"}, "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-e3369af9cbb57623", "name": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/components/settings/dictation/ElevenLabsKeyInput.tsx:56", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/components/settings/dictation/ElevenLabsKeyInput.tsx:56"}, "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-d64b465d89fcaac4", "name": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/components/settings/dictation/VoiceDictationToggle.tsx:48", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/components/settings/dictation/VoiceDictationToggle.tsx:48"}, "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-c7aa4cba109004df", "name": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/settings/chat/BioRouterHintsModal.tsx:38", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/settings/chat/BioRouterHintsModal.tsx:38"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ba46c3898cb45e63", "name": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/components/settings/sessions/SessionSharingSection.tsx:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/components/settings/sessions/SessionSharingSection.tsx:10"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-dad206bbe15e071b", "name": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/settings/models/bottom_bar/ModelsBottomBa", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/settings/models/bottom_bar/ModelsBottomBar.tsx:164"}, "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-07000ccea46d4e47", "name": "TODO/FIXME marker in shipping code \u2014 ui/desktop/src/components/settings/permission/PermissionSetting.tsx:53", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 ui/desktop/src/components/settings/permission/PermissionSetting.tsx:53"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b00879213122d85e", "name": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/components/settings/permission/PermissionModal.tsx:98", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/components/settings/permission/PermissionModal.tsx:98"}, "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-3495cc53c8d57834", "name": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/onboarding/LlamaServerInlineCard.tsx:206", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/onboarding/LlamaServerInlineCard.tsx:206"}, "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-63c35ce8b1909f2f", "name": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/workflows/CreateEditWorkflowModal.tsx:443", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/workflows/CreateEditWorkflowModal.tsx:443"}, "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-ce02e75e8d36d7e6", "name": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/workflows/WorkflowsView.tsx:457", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/workflows/WorkflowsView.tsx:457"}, "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-e84168fa74892653", "name": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/workflows/shared/WorkflowResourcePicker.t", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/workflows/shared/WorkflowResourcePicker.tsx:142"}, "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-de649f611566167b", "name": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/components/workflows/shared/__tests__/WorkflowFormFields.test.tsx:33", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/components/workflows/shared/__tests__/WorkflowFormFields.test.tsx:33"}, "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-9ba4422916f32985", "name": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/knowledge/IngestPanel/IngestModelPicker.t", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/knowledge/IngestPanel/IngestModelPicker.tsx:128"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1a4d000a18ff37d8", "name": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/knowledge/IngestPanel/StagedList.tsx:49", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/knowledge/IngestPanel/StagedList.tsx:49"}, "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-91d65d16c0fadeb4", "name": "TODO/FIXME marker in shipping code \u2014 ui/desktop/src/components/knowledge/IngestPanel/IngestPanel.tsx:20", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 ui/desktop/src/components/knowledge/IngestPanel/IngestPanel.tsx:20"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-52783a7171f331b4", "name": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/knowledge/KBSelector/KBSelectorPalette.ts", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/knowledge/KBSelector/KBSelectorPalette.tsx:313"}, "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-e23e3d5527470847", "name": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/knowledge/KBSelector/KBSelectorTrigger.ts", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/knowledge/KBSelector/KBSelectorTrigger.tsx:35"}, "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-6e7acb531fdf9bf5", "name": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/knowledge/graph/KnowledgeGraphPanel.tsx:5", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/knowledge/graph/KnowledgeGraphPanel.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-519430b5a2c45af1", "name": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/knowledge/graph/NodePreview.tsx:51", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/knowledge/graph/NodePreview.tsx:51"}, "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-0f557854d52ee28e", "name": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/bottom_menu/BottomMenuKnowledgeSelection.", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/bottom_menu/BottomMenuKnowledgeSelection.tsx:44"}, "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-90c1793af5e23898", "name": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/bottom_menu/DirSwitcher.tsx:97", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/bottom_menu/DirSwitcher.tsx:97"}, "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-dbc70a1f505d274c", "name": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/bottom_menu/BottomMenuSkillSelection.tsx:", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/bottom_menu/BottomMenuSkillSelection.tsx:305"}, "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-81740aff807da8b8", "name": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/bottom_menu/BottomMenuExtensionSelection.", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/bottom_menu/BottomMenuExtensionSelection.tsx:387"}, "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-1e967eec578c64ad", "name": "Docker base image is tag-pinned but not digest-pinned: rust:1.82-bookworm", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: rust:1.82-bookworm"}, "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-5c726ef27fab0084", "name": "Docker base image is tag-pinned but not digest-pinned: debian:bookworm-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: debian:bookworm-slim"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea2f7eda9be17d45", "name": "Dockerfile pipes a remote installer into a shell", "shortDescription": {"text": "Dockerfile pipes a remote installer into a shell"}, "fullDescription": {"text": "Executing downloaded code during image build gives the remote endpoint build-time code execution. Prefer pinned packages or verify downloaded installers by checksum/signature."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4a210ac3b4b59ff4", "name": "Dockerfile runs as root: .devcontainer/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: .devcontainer/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-043a18363bcce260", "name": "Docker base image is tag-pinned but not digest-pinned: mcr.microsoft.com/devcontainers/rust:1", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: mcr.microsoft.com/devcontainers/rust:1"}, "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-da3f383e2f9a9a54", "name": "Runtime dotenv file present in repo: ui/desktop/.env", "shortDescription": {"text": "Runtime dotenv file present in repo: ui/desktop/.env"}, "fullDescription": {"text": "`ui/desktop/.env` looks like a runtime dotenv file. No high-confidence secret value was matched, but runtime dotenv files often drift into live credentials. Move real values to a secret manager and keep only `.env.example` style templates in source control."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-07500b273af0f917", "name": "Possible secret in scripts/release.sh", "shortDescription": {"text": "Possible secret in scripts/release.sh"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-4b3f87c1e2c388b2", "name": "Insecure pattern 'direct_innerhtml_assignment' in crates/biorouter-cli/static/script.js:62", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in crates/biorouter-cli/static/script.js:62"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8c872b953938e9ac", "name": "Insecure pattern 'subprocess_shell_true' in crates/biorouter-mcp/src/computercontroller/platform/linux.rs:183", "shortDescription": {"text": "Insecure pattern 'subprocess_shell_true' in crates/biorouter-mcp/src/computercontroller/platform/linux.rs:183"}, "fullDescription": {"text": "Found a known-risky pattern (subprocess_shell_true). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ccabf5d65b51ca99", "name": "Insecure pattern 'private_key_in_repo' in crates/biorouter/src/providers/gcpauth.rs:879", "shortDescription": {"text": "Insecure pattern 'private_key_in_repo' in crates/biorouter/src/providers/gcpauth.rs:879"}, "fullDescription": {"text": "Found a known-risky pattern (private_key_in_repo). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-92daccbfdeb027f0", "name": "Insecure pattern 'node_child_process' in ui/desktop/scripts/unregister-deeplink-protocols.js:8", "shortDescription": {"text": "Insecure pattern 'node_child_process' in ui/desktop/scripts/unregister-deeplink-protocols.js:8"}, "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-abfb598568613736", "name": "Insecure pattern 'node_child_process' in ui/desktop/scripts/fetch-llama-server.js:19", "shortDescription": {"text": "Insecure pattern 'node_child_process' in ui/desktop/scripts/fetch-llama-server.js:19"}, "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-e4e991c568c9c1fe", "name": "Insecure pattern 'node_child_process' in ui/desktop/scripts/download-mingit.js:16", "shortDescription": {"text": "Insecure pattern 'node_child_process' in ui/desktop/scripts/download-mingit.js:16"}, "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-e13c970a15626c4d", "name": "Insecure pattern 'node_child_process' in ui/desktop/src/main.ts:29", "shortDescription": {"text": "Insecure pattern 'node_child_process' in ui/desktop/src/main.ts:29"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0be2e6e51f67f561", "name": "Insecure pattern 'node_child_process' in ui/desktop/src/biorouterd.ts:3", "shortDescription": {"text": "Insecure pattern 'node_child_process' in ui/desktop/src/biorouterd.ts:3"}, "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-7b35cce4f6a63bfe", "name": "Insecure pattern 'node_child_process' in ui/desktop/src/utils/extensionUpdater.ts:16", "shortDescription": {"text": "Insecure pattern 'node_child_process' in ui/desktop/src/utils/extensionUpdater.ts:16"}, "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-ad19931dad9bfaf7", "name": "Insecure pattern 'node_child_process' in ui/desktop/src/utils/dependencyChecker.ts:14", "shortDescription": {"text": "Insecure pattern 'node_child_process' in ui/desktop/src/utils/dependencyChecker.ts:14"}, "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-a27ff4e3223b8b41", "name": "Insecure pattern 'local_storage_auth_token' in ui/desktop/src/components/settings/sessions/SessionSharingSection.tsx:37", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in ui/desktop/src/components/settings/sessions/SessionSharingSection.tsx:37"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-84da2aa7983ef8f5", "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-64068561d22fe6dd", "name": "Very large file: crates/biorouter-cli/src/cli.rs (1941 lines)", "shortDescription": {"text": "Very large file: crates/biorouter-cli/src/cli.rs (1941 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-5bed439266dd6066", "name": "Very large file: crates/biorouter-cli/src/commands/configure.rs (2174 lines)", "shortDescription": {"text": "Very large file: crates/biorouter-cli/src/commands/configure.rs (2174 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-c563c561c17d1ff8", "name": "Very large file: crates/biorouter-cli/src/session/mod.rs (1921 lines)", "shortDescription": {"text": "Very large file: crates/biorouter-cli/src/session/mod.rs (1921 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-c17331020ab38958", "name": "Very large file: crates/biorouter-mcp/src/developer/rmcp_developer.rs (3755 lines)", "shortDescription": {"text": "Very large file: crates/biorouter-mcp/src/developer/rmcp_developer.rs (3755 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-e7157a14a63d8628", "name": "Very large file: crates/biorouter-mcp/src/autovisualiser/mod.rs (1625 lines)", "shortDescription": {"text": "Very large file: crates/biorouter-mcp/src/autovisualiser/mod.rs (1625 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-25162fb1ed96a6ad", "name": "Very large file: crates/biorouter-mcp/src/knowledge/service.rs (1815 lines)", "shortDescription": {"text": "Very large file: crates/biorouter-mcp/src/knowledge/service.rs (1815 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-203dba5f41ce24ac", "name": "Very large file: crates/biorouter-mcp/src/computercontroller/mod.rs (1360 lines)", "shortDescription": {"text": "Very large file: crates/biorouter-mcp/src/computercontroller/mod.rs (1360 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-e8cbc74ed19ec70e", "name": "Very large file: crates/biorouter/src/agents/agent.rs (2258 lines)", "shortDescription": {"text": "Very large file: crates/biorouter/src/agents/agent.rs (2258 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-abb87bbca77afc4e", "name": "Very large file: crates/biorouter/src/agents/code_execution_extension.rs (1320 lines)", "shortDescription": {"text": "Very large file: crates/biorouter/src/agents/code_execution_extension.rs (1320 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-28b1d7eeca763bfb", "name": "Very large file: crates/biorouter/src/agents/extension_manager.rs (2071 lines)", "shortDescription": {"text": "Very large file: crates/biorouter/src/agents/extension_manager.rs (2071 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-630521025f9986fa", "name": "Very large file: crates/biorouter/src/providers/formats/databricks.rs (1465 lines)", "shortDescription": {"text": "Very large file: crates/biorouter/src/providers/formats/databricks.rs (1465 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a2207cd8346ee23b", "name": "Very large file: crates/biorouter/src/providers/formats/openai.rs (1476 lines)", "shortDescription": {"text": "Very large file: crates/biorouter/src/providers/formats/openai.rs (1476 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-b5af9ec131f0efe2", "name": "Very large file: crates/biorouter/src/providers/formats/google.rs (1544 lines)", "shortDescription": {"text": "Very large file: crates/biorouter/src/providers/formats/google.rs (1544 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-adf63371b9a4e5e8", "name": "Very large file: crates/biorouter/src/session/session_manager.rs (1635 lines)", "shortDescription": {"text": "Very large file: crates/biorouter/src/session/session_manager.rs (1635 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-199c338636803ee6", "name": "Very large file: crates/biorouter/src/config/base.rs (1989 lines)", "shortDescription": {"text": "Very large file: crates/biorouter/src/config/base.rs (1989 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-b672e777ff9d194b", "name": "Very large file: crates/biorouter-server/tests/knowledge_routes.rs (1824 lines)", "shortDescription": {"text": "Very large file: crates/biorouter-server/tests/knowledge_routes.rs (1824 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-f46abf433f338ad0", "name": "Very large file: crates/biorouter-server/src/routes/knowledge.rs (1525 lines)", "shortDescription": {"text": "Very large file: crates/biorouter-server/src/routes/knowledge.rs (1525 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-4c3be331c31d139c", "name": "Very large file: ui/desktop/src/main.ts (3609 lines)", "shortDescription": {"text": "Very large file: ui/desktop/src/main.ts (3609 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-1ebcc9706e5ccf02", "name": "Very large file: ui/desktop/src/api/types.gen.ts (4360 lines)", "shortDescription": {"text": "Very large file: ui/desktop/src/api/types.gen.ts (4360 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-9354d5d311f71f59", "name": "Very large file: ui/desktop/src/components/ChatInput.tsx (1791 lines)", "shortDescription": {"text": "Very large file: ui/desktop/src/components/ChatInput.tsx (1791 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-ea3b5e389d8c9c0f", "name": "Low test-to-source ratio", "shortDescription": {"text": "Low test-to-source ratio"}, "fullDescription": {"text": "100 tests / 823 src (ratio 0.12)."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2fbe176a90ede8a4", "name": "33 TODO/FIXME markers", "shortDescription": {"text": "33 TODO/FIXME markers"}, "fullDescription": {"text": "High count of TODO/FIXME/HACK markers \u2014 track them as issues so they're not forgotten."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 226 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 220 placeholder/mock markers across 83 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-bea357a6497a2d5d", "name": "Agent authority lacks a verifier contract: CLAUDE.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: CLAUDE.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-98a76726d370a771", "name": "Agent authority lacks a verifier contract: crates/biorouter/src/agents/builtin_skills/about-biorouter/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: crates/biorouter/src/agents/builtin_skills/about-biorouter/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-1860fab9f5a9110f", "name": "Agent authority lacks a verifier contract: ui/desktop/tests/fixtures/skills/ucsfomopagent/omop-phenotype-query/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: ui/desktop/tests/fixtures/skills/ucsfomopagent/omop-phenotype-query/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-bf1c116cd5e675cb", "name": "Network/subprocess call without timeout or try/except \u2014 test_acp_client.py:46", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 test_acp_client.py:46"}, "fullDescription": {"text": "`subprocess.Popen(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3f9d160a549e87bc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 crates/biorouter-mcp/src/autovisualiser/templates/assets/d3.min.js:2", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 crates/biorouter-mcp/src/autovisualiser/templates/assets/d3.min.js:2"}, "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-f7bcd21707ad2d97", "name": "Commented-code block (6 lines) in .claude/workflows/release.js:9", "shortDescription": {"text": "Commented-code block (6 lines) in .claude/workflows/release.js:9"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5246125e02d353b0", "name": "Commented-code block (5 lines) in ui/desktop/tests/e2e/brxt.spec.ts:395", "shortDescription": {"text": "Commented-code block (5 lines) in ui/desktop/tests/e2e/brxt.spec.ts:395"}, "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-81662cba3a9a0c27", "name": "Commented-code block (5 lines) in ui/desktop/tests/e2e/spokeagent-skills.spec.ts:251", "shortDescription": {"text": "Commented-code block (5 lines) in ui/desktop/tests/e2e/spokeagent-skills.spec.ts:251"}, "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-3f6cbf0b4f5bac7f", "name": "Commented-code block (7 lines) in ui/desktop/scripts/fetch-llama-server.js:8", "shortDescription": {"text": "Commented-code block (7 lines) in ui/desktop/scripts/fetch-llama-server.js:8"}, "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-ad9fa8bd5372a871", "name": "Legacy-named symbol `warnOffDeprecated` in ui/desktop/src/preload.ts:8", "shortDescription": {"text": "Legacy-named symbol `warnOffDeprecated` in ui/desktop/src/preload.ts:8"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a21e09dc731df683", "name": "Commented-code block (5 lines) in ui/desktop/src/main.ts:1637", "shortDescription": {"text": "Commented-code block (5 lines) in ui/desktop/src/main.ts:1637"}, "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-b0cce6e44361d73b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 ui/desktop/src/main.ts:3366", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 ui/desktop/src/main.ts:3366"}, "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-4c9d41ad52c688a0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 ui/desktop/src/utils/extensionUpdater.ts:116", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 ui/desktop/src/utils/extensionUpdater.ts:116"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b44432e7057032c0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 ui/desktop/src/utils/githubUpdater.ts:49", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 ui/desktop/src/utils/githubUpdater.ts:49"}, "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-66af92cddf0bdc7f", "name": "Commented-code block (5 lines) in ui/desktop/src/utils/dependencyChecker.ts:58", "shortDescription": {"text": "Commented-code block (5 lines) in ui/desktop/src/utils/dependencyChecker.ts:58"}, "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-34edcd1fb9e5b46f", "name": "Commented-code block (15 lines) in ui/desktop/src/utils/sessionNameSync.ts:12", "shortDescription": {"text": "Commented-code block (15 lines) in ui/desktop/src/utils/sessionNameSync.ts:12"}, "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-1b67a7e2edcac37e", "name": "Commented-code block (6 lines) in ui/desktop/src/hooks/useWorkflowManager.ts:149", "shortDescription": {"text": "Commented-code block (6 lines) in ui/desktop/src/hooks/useWorkflowManager.ts:149"}, "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-a4bf9047fa1efba5", "name": "Commented-code block (5 lines) in ui/desktop/src/hooks/useFileDrop.ts:74", "shortDescription": {"text": "Commented-code block (5 lines) in ui/desktop/src/hooks/useFileDrop.ts:74"}, "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-803991d16e33da98", "name": "`fetch()` without try/.catch or AbortSignal \u2014 ui/desktop/src/hooks/useWhisper.ts:190", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 ui/desktop/src/hooks/useWhisper.ts:190"}, "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-9ad2ecd40bd9d78a", "name": "Commented-code block (6 lines) in ui/desktop/src/hooks/useChatStream.ts:40", "shortDescription": {"text": "Commented-code block (6 lines) in ui/desktop/src/hooks/useChatStream.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-6d40fb224c200ed9", "name": "Commented-code block (5 lines) in ui/desktop/src/components/ChatInput.tsx:346", "shortDescription": {"text": "Commented-code block (5 lines) in ui/desktop/src/components/ChatInput.tsx:346"}, "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-e8a480240676aed2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 ui/desktop/src/components/UpdateAvailableModal.tsx:63", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 ui/desktop/src/components/UpdateAvailableModal.tsx:63"}, "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-1c0ef053f7986ca8", "name": "Commented-code block (5 lines) in ui/desktop/src/components/BaseChat.tsx:122", "shortDescription": {"text": "Commented-code block (5 lines) in ui/desktop/src/components/BaseChat.tsx:122"}, "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-505b548529d055b8", "name": "Commented-code block (6 lines) in ui/desktop/src/components/Dashboard/DashboardProvider.tsx:303", "shortDescription": {"text": "Commented-code block (6 lines) in ui/desktop/src/components/Dashboard/DashboardProvider.tsx:303"}, "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-9aca5b529923a302", "name": "Commented-code block (9 lines) in ui/desktop/src/components/Dashboard/DashboardBoard.tsx:21", "shortDescription": {"text": "Commented-code block (9 lines) in ui/desktop/src/components/Dashboard/DashboardBoard.tsx:21"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fd5f930f405a881b", "name": "Commented-code block (6 lines) in ui/desktop/src/components/Dashboard/ChatWindow.tsx:54", "shortDescription": {"text": "Commented-code block (6 lines) in ui/desktop/src/components/Dashboard/ChatWindow.tsx:54"}, "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-e38d0e53046104d3", "name": "Commented-code block (6 lines) in ui/desktop/src/components/Dashboard/canvasLayout.ts:162", "shortDescription": {"text": "Commented-code block (6 lines) in ui/desktop/src/components/Dashboard/canvasLayout.ts:162"}, "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-f30c22037b5c5f5d", "name": "Commented-code block (5 lines) in ui/desktop/src/components/Dashboard/DashboardRoute.tsx:6", "shortDescription": {"text": "Commented-code block (5 lines) in ui/desktop/src/components/Dashboard/DashboardRoute.tsx:6"}, "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-6966212768aef234", "name": "Legacy-named symbol `parsedLegacy` in ui/desktop/src/components/Dashboard/dashboardStorage.ts:125", "shortDescription": {"text": "Legacy-named symbol `parsedLegacy` in ui/desktop/src/components/Dashboard/dashboardStorage.ts:125"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b243298ea4d20970", "name": "Commented-code block (10 lines) in ui/desktop/src/components/Dashboard/layoutEngine.test.ts:283", "shortDescription": {"text": "Commented-code block (10 lines) in ui/desktop/src/components/Dashboard/layoutEngine.test.ts:283"}, "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-f792a8007c5d7db4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 ui/desktop/src/components/settings/sessions/SessionSharingSection.tsx:106", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 ui/desktop/src/components/settings/sessions/SessionSharingSection.tsx:106"}, "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-41339da13e004607", "name": "Commented-code block (5 lines) in ui/desktop/src/components/settings/models/subcomponents/SwitchModelModal.tsx:61", "shortDescription": {"text": "Commented-code block (5 lines) in ui/desktop/src/components/settings/models/subcomponents/SwitchModelModal.tsx:61"}, "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-64bff9d667faebd9", "name": "Legacy-named symbol `another_unused` in ui/desktop/src/components/workflows/shared/__tests__/WorkflowFormFields.test.tsx", "shortDescription": {"text": "Legacy-named symbol `another_unused` in ui/desktop/src/components/workflows/shared/__tests__/WorkflowFormFields.test.tsx:531"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fe220427b6a7b6a6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 ui/desktop/src/components/knowledge/hooks/knowledgeRequest.ts:52", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 ui/desktop/src/components/knowledge/hooks/knowledgeRequest.ts:52"}, "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-fa71ea1c5f895346", "name": "Commented-code block (6 lines) in ui/desktop/src/components/knowledge/graph/labelText.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in ui/desktop/src/components/knowledge/graph/labelText.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-4ad7e83600ab4258", "name": "Commented-code block (6 lines) in ui/desktop/src/components/Layout/MainPanelLayout.tsx:8", "shortDescription": {"text": "Commented-code block (6 lines) in ui/desktop/src/components/Layout/MainPanelLayout.tsx:8"}, "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-584b730dd5cec8ca", "name": "Commented-code block (5 lines) in ui/desktop/src/components/ui/scroll-area.tsx:156", "shortDescription": {"text": "Commented-code block (5 lines) in ui/desktop/src/components/ui/scroll-area.tsx:156"}, "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-94b96c40213c0f47", "name": "Frontend route `launcher` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx", "shortDescription": {"text": "Frontend route `launcher` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c0b8786d34d9d4b3", "name": "Frontend route `welcome` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx", "shortDescription": {"text": "Frontend route `welcome` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ae2b355f24f4fd3b", "name": "Frontend route `configure-providers` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx", "shortDescription": {"text": "Frontend route `configure-providers` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bc66d8da61c16c42", "name": "Frontend route `standalone-app` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx", "shortDescription": {"text": "Frontend route `standalone-app` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-37e872887a4712bf", "name": "Frontend route `pair` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx", "shortDescription": {"text": "Frontend route `pair` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3d84871afae3ba68", "name": "Frontend route `settings` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx", "shortDescription": {"text": "Frontend route `settings` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bd0c9cd9caba1a1d", "name": "Frontend route `extensions` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx", "shortDescription": {"text": "Frontend route `extensions` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1dce978e9042c387", "name": "Frontend route `apps` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx", "shortDescription": {"text": "Frontend route `apps` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d47037596c8aa3a6", "name": "Frontend route `sessions` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx", "shortDescription": {"text": "Frontend route `sessions` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8352e25e31a8e917", "name": "Frontend route `schedules` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx", "shortDescription": {"text": "Frontend route `schedules` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1e7682ac857126a0", "name": "Frontend route `workflows` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx", "shortDescription": {"text": "Frontend route `workflows` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3c67a409ed2063dd", "name": "Frontend route `skills` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx", "shortDescription": {"text": "Frontend route `skills` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a4086f2a1b692a7c", "name": "Frontend route `knowledge` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx", "shortDescription": {"text": "Frontend route `knowledge` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cd1016ea8803b2fa", "name": "Frontend route `dashboard` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx", "shortDescription": {"text": "Frontend route `dashboard` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4ac6feeea467a295", "name": "Frontend route `shared-session` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx", "shortDescription": {"text": "Frontend route `shared-session` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-47f84d676ffcc427", "name": "Frontend route `permission` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx", "shortDescription": {"text": "Frontend route `permission` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/24479"}, "properties": {"repository": "BaranziniLab/biorouter", "repoUrl": "https://github.com/BaranziniLab/biorouter", "branch": "main"}, "results": [{"ruleId": "scanner-afb8d5ab143ff4e4", "level": "note", "message": {"text": "Possibly dead Python function: handle_request"}, "properties": {"repobilityId": "d9622bac4e22d36b", "scanner": "scanner-primary", "fingerprint": "afb8d5ab143ff4e4", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/provider-error-proxy/proxy.py:448"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5c1c4bc53bf025a7", "level": "note", "message": {"text": "Possibly dead Python function: stdin_reader"}, "properties": {"repobilityId": "c8638c940e964ce3", "scanner": "scanner-primary", "fingerprint": "5c1c4bc53bf025a7", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/provider-error-proxy/proxy.py:656"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bead75b0f9233e05", "level": "none", "message": {"text": "No API endpoints detected"}, "properties": {"repobilityId": "0f8bb852027c38f8", "scanner": "scanner-primary", "fingerprint": "bead75b0f9233e05", "layer": "api", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-8578a5f1f9a0285c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 crates/biorouter-cli/static/script.js:147"}, "properties": {"repobilityId": "b3142632ea3b7f0e", "scanner": "scanner-primary", "fingerprint": "8578a5f1f9a0285c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4cfa580387ad94da", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 crates/biorouter-bench/src/assets/vscode_config_registry.ts:698"}, "properties": {"repobilityId": "5371149577709843", "scanner": "scanner-primary", "fingerprint": "4cfa580387ad94da", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-9a1547835a8fd3fc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/tests/e2e/bioroffice-install.spec.ts:45"}, "properties": {"repobilityId": "f73ee4a9ed278f46", "scanner": "scanner-primary", "fingerprint": "9a1547835a8fd3fc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-752c40d9769fe610", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/tests/e2e/bioroffice-verify.spec.ts:107"}, "properties": {"repobilityId": "4b044dbce2349046", "scanner": "scanner-primary", "fingerprint": "752c40d9769fe610", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-81ae1c9767eadfff", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/tests/e2e/app.spec.ts:45"}, "properties": {"repobilityId": "ec00bd505dcb86d5", "scanner": "scanner-primary", "fingerprint": "81ae1c9767eadfff", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-955ab8cf05bae0e8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/tests/e2e/spokeagent-skills.spec.ts:160"}, "properties": {"repobilityId": "dd4b836807dd371a", "scanner": "scanner-primary", "fingerprint": "955ab8cf05bae0e8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6991bac2ce328794", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/tests/e2e/brxt-spoke-install.spec.ts:30"}, "properties": {"repobilityId": "cff909a4c219a003", "scanner": "scanner-primary", "fingerprint": "6991bac2ce328794", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e192111bf7417f65", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/scripts/unregister-deeplink-protocols.js:13"}, "properties": {"repobilityId": "f5d1e3efa6d2b78f", "scanner": "scanner-primary", "fingerprint": "e192111bf7417f65", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6c48169d8a62582e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/scripts/fetch-llama-server.js:72"}, "properties": {"repobilityId": "1256b4cf2576a469", "scanner": "scanner-primary", "fingerprint": "6c48169d8a62582e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cd2b47ea528803a8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/scripts/prepare-platform-binaries.js:41"}, "properties": {"repobilityId": "75109dfd2aa724ad", "scanner": "scanner-primary", "fingerprint": "cd2b47ea528803a8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5df8b7b2e08031a4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/scripts/build-main.js:41"}, "properties": {"repobilityId": "f27ae74cd1b91b84", "scanner": "scanner-primary", "fingerprint": "5df8b7b2e08031a4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-adfd60d5e44a9f74", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/scripts/download-mingit.js:83"}, "properties": {"repobilityId": "89ea5a5aa10a8e3a", "scanner": "scanner-primary", "fingerprint": "adfd60d5e44a9f74", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c877bee2f96e8507", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/renderer.tsx:51"}, "properties": {"repobilityId": "0f94c74ccc161d7c", "scanner": "scanner-primary", "fingerprint": "c877bee2f96e8507", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-209bd4a42980557e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/main.ts:113"}, "properties": {"repobilityId": "3992439d6df6b59c", "scanner": "scanner-primary", "fingerprint": "209bd4a42980557e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-afeb9e6c69059593", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/App.test.tsx:297"}, "properties": {"repobilityId": "a1309134a178e8e7", "scanner": "scanner-primary", "fingerprint": "afeb9e6c69059593", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8144215e3a87b2cd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/App.tsx:97"}, "properties": {"repobilityId": "c5b93017bb44acd7", "scanner": "scanner-primary", "fingerprint": "8144215e3a87b2cd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b2a496bdcd0ad4c7", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 ui/desktop/src/workflow/index.ts:17"}, "properties": {"repobilityId": "da8789320186acf4", "scanner": "scanner-primary", "fingerprint": "b2a496bdcd0ad4c7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-c7abadaee6f4348d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/workflow/index.ts:41"}, "properties": {"repobilityId": "fa42505addb33fb8", "scanner": "scanner-primary", "fingerprint": "c7abadaee6f4348d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cd7ddcfb5834bcda", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 ui/desktop/src/api/client/client.gen.ts:246"}, "properties": {"repobilityId": "608562ed7b10d2c1", "scanner": "scanner-primary", "fingerprint": "cd7ddcfb5834bcda", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-70dc3b5b77044833", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/utils/providerUtils.ts:33"}, "properties": {"repobilityId": "9d17cbfbc1ca6dff", "scanner": "scanner-primary", "fingerprint": "70dc3b5b77044833", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9ca4d521bfdfd0db", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 ui/desktop/src/utils/sessionNameSync.test.ts:60"}, "properties": {"repobilityId": "bb2443079f113cb4", "scanner": "scanner-primary", "fingerprint": "9ca4d521bfdfd0db", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-43a58d43946f4249", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 ui/desktop/src/contexts/ChatContext.tsx:5"}, "properties": {"repobilityId": "d17609a5067b7c94", "scanner": "scanner-primary", "fingerprint": "43a58d43946f4249", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-94674d2002fbfb14", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/hooks/useWorkflowManager.ts:78"}, "properties": {"repobilityId": "0ae901b6c306986e", "scanner": "scanner-primary", "fingerprint": "94674d2002fbfb14", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e06d8f995e21c2c8", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 ui/desktop/src/hooks/useChatStream.ts:660"}, "properties": {"repobilityId": "cdffd44016162fe2", "scanner": "scanner-primary", "fingerprint": "e06d8f995e21c2c8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-7c55c758323c8c9c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/hooks/useChatStream.ts:326"}, "properties": {"repobilityId": "832f901a43a6df54", "scanner": "scanner-primary", "fingerprint": "7c55c758323c8c9c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-046b9e14a3ad6c75", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/hooks/useCostTracking.ts:65"}, "properties": {"repobilityId": "eea45fe0a4e9f8b6", "scanner": "scanner-primary", "fingerprint": "046b9e14a3ad6c75", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fca032ee6cea14f8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/ChatInput.tsx:1587"}, "properties": {"repobilityId": "e5e250d3c9ba09ad", "scanner": "scanner-primary", "fingerprint": "fca032ee6cea14f8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c0afa4561c12cc83", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/components/ChatInput.tsx:470"}, "properties": {"repobilityId": "dfd77b242ec0b14e", "scanner": "scanner-primary", "fingerprint": "c0afa4561c12cc83", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5015a779f3418f02", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/components/MarkdownContent.test.tsx:91"}, "properties": {"repobilityId": "e7430899635137dc", "scanner": "scanner-primary", "fingerprint": "5015a779f3418f02", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b40b89d58e64dabd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/components/ExtensionInstallModal.tsx:163"}, "properties": {"repobilityId": "d44bc4792f6db55f", "scanner": "scanner-primary", "fingerprint": "b40b89d58e64dabd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b4fe3338233d3480", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/ToolCallWithResponse.tsx:258"}, "properties": {"repobilityId": "7bd435af64d2e8ba", "scanner": "scanner-primary", "fingerprint": "b4fe3338233d3480", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-07aaf8fa25198c85", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/components/ConfigContext.tsx:116"}, "properties": {"repobilityId": "e81836c433bc11b0", "scanner": "scanner-primary", "fingerprint": "07aaf8fa25198c85", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-319b1ea91b41b416", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/GroupedExtensionLoadingToast.tsx:103"}, "properties": {"repobilityId": "bdab2d9baffa5814", "scanner": "scanner-primary", "fingerprint": "319b1ea91b41b416", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-360e33537e7400a8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/MentionPopover.tsx:719"}, "properties": {"repobilityId": "d9f74d1734258873", "scanner": "scanner-primary", "fingerprint": "360e33537e7400a8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a5399c3fcfe8b1c8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/components/AnnouncementModal.tsx:97"}, "properties": {"repobilityId": "91804069ae3876d2", "scanner": "scanner-primary", "fingerprint": "a5399c3fcfe8b1c8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7d310cb6f2217e0b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/components/ModelAndProviderContext.tsx:122"}, "properties": {"repobilityId": "e008deaff676c202", "scanner": "scanner-primary", "fingerprint": "7d310cb6f2217e0b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-35cd379d71f1da82", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/components/McpApps/McpAppRenderer.tsx:184"}, "properties": {"repobilityId": "b6549fb2fdfcad38", "scanner": "scanner-primary", "fingerprint": "35cd379d71f1da82", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8fa7490a964f7aa4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/sessions/SessionsInsights.tsx:285"}, "properties": {"repobilityId": "57d4a17f427f954a", "scanner": "scanner-primary", "fingerprint": "8fa7490a964f7aa4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ab30fd115742749c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/sessions/SessionListView.tsx:606"}, "properties": {"repobilityId": "d306e3479262517b", "scanner": "scanner-primary", "fingerprint": "ab30fd115742749c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0bd1b00f931f8414", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/Dashboard/WindowTitleBar.tsx:74"}, "properties": {"repobilityId": "665317d6396ef5be", "scanner": "scanner-primary", "fingerprint": "0bd1b00f931f8414", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ba987b766ede4681", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/Dashboard/FoldedCard.tsx:149"}, "properties": {"repobilityId": "2977c485cdc4a5e9", "scanner": "scanner-primary", "fingerprint": "ba987b766ede4681", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-69e581be5bae4a46", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 ui/desktop/src/components/alerts/useToolCount.ts:4"}, "properties": {"repobilityId": "479758ce5ba989d7", "scanner": "scanner-primary", "fingerprint": "69e581be5bae4a46", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-3033ecbce588f3fe", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/components/settings/extensions/deeplink.ts:177"}, "properties": {"repobilityId": "e0b6016f1968db14", "scanner": "scanner-primary", "fingerprint": "3033ecbce588f3fe", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-014eb0ca4c054c8e", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 ui/desktop/src/components/settings/extensions/utils.ts:4"}, "properties": {"repobilityId": "39f74ac92ca42b02", "scanner": "scanner-primary", "fingerprint": "014eb0ca4c054c8e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-4a5b3c9e3fa69d48", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/settings/extensions/subcomponents/ExtensionItem.tsx:65"}, "properties": {"repobilityId": "69206c072c75280e", "scanner": "scanner-primary", "fingerprint": "4a5b3c9e3fa69d48", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b9ff5f2fecf98de8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/components/settings/extensions/modal/ExtensionModal.tsx:308"}, "properties": {"repobilityId": "34e5b9ca9b3c10c6", "scanner": "scanner-primary", "fingerprint": "b9ff5f2fecf98de8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e7aa1f17b38d85f5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/settings/providers/subcomponents/ProviderCard.tsx:57"}, "properties": {"repobilityId": "66b8dc9c9367fb75", "scanner": "scanner-primary", "fingerprint": "e7aa1f17b38d85f5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2936052a3b88681e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/settings/providers/subcomponents/CardHeader.tsx:13"}, "properties": {"repobilityId": "81e58b0be3478393", "scanner": "scanner-primary", "fingerprint": "2936052a3b88681e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e3369af9cbb57623", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/components/settings/dictation/ElevenLabsKeyInput.tsx:56"}, "properties": {"repobilityId": "eb16de46cb97fb4f", "scanner": "scanner-primary", "fingerprint": "e3369af9cbb57623", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d64b465d89fcaac4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/components/settings/dictation/VoiceDictationToggle.tsx:48"}, "properties": {"repobilityId": "2e73a62305cabdba", "scanner": "scanner-primary", "fingerprint": "d64b465d89fcaac4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c7aa4cba109004df", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/settings/chat/BioRouterHintsModal.tsx:38"}, "properties": {"repobilityId": "5a1e88e8aa6ba588", "scanner": "scanner-primary", "fingerprint": "c7aa4cba109004df", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ba46c3898cb45e63", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/components/settings/sessions/SessionSharingSection.tsx:10"}, "properties": {"repobilityId": "06db78179e13f004", "scanner": "scanner-primary", "fingerprint": "ba46c3898cb45e63", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-dad206bbe15e071b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/settings/models/bottom_bar/ModelsBottomBar.tsx:164"}, "properties": {"repobilityId": "06426bdac157bdc4", "scanner": "scanner-primary", "fingerprint": "dad206bbe15e071b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-07000ccea46d4e47", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 ui/desktop/src/components/settings/permission/PermissionSetting.tsx:53"}, "properties": {"repobilityId": "2f22d3dbf5703540", "scanner": "scanner-primary", "fingerprint": "07000ccea46d4e47", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-b00879213122d85e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/components/settings/permission/PermissionModal.tsx:98"}, "properties": {"repobilityId": "e7809158cdd4608a", "scanner": "scanner-primary", "fingerprint": "b00879213122d85e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3495cc53c8d57834", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/onboarding/LlamaServerInlineCard.tsx:206"}, "properties": {"repobilityId": "cae95f5436a098a6", "scanner": "scanner-primary", "fingerprint": "3495cc53c8d57834", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-63c35ce8b1909f2f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/workflows/CreateEditWorkflowModal.tsx:443"}, "properties": {"repobilityId": "98cf4b824fbc5e27", "scanner": "scanner-primary", "fingerprint": "63c35ce8b1909f2f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ce02e75e8d36d7e6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/workflows/WorkflowsView.tsx:457"}, "properties": {"repobilityId": "5b46d515628f626e", "scanner": "scanner-primary", "fingerprint": "ce02e75e8d36d7e6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e84168fa74892653", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/workflows/shared/WorkflowResourcePicker.tsx:142"}, "properties": {"repobilityId": "3525ce37a920cb32", "scanner": "scanner-primary", "fingerprint": "e84168fa74892653", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-de649f611566167b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 ui/desktop/src/components/workflows/shared/__tests__/WorkflowFormFields.test.tsx:33"}, "properties": {"repobilityId": "bc9c343819a38596", "scanner": "scanner-primary", "fingerprint": "de649f611566167b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9ba4422916f32985", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/knowledge/IngestPanel/IngestModelPicker.tsx:128"}, "properties": {"repobilityId": "6aba41ed76e1f0ca", "scanner": "scanner-primary", "fingerprint": "9ba4422916f32985", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1a4d000a18ff37d8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/knowledge/IngestPanel/StagedList.tsx:49"}, "properties": {"repobilityId": "1824541abccea7e0", "scanner": "scanner-primary", "fingerprint": "1a4d000a18ff37d8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-91d65d16c0fadeb4", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 ui/desktop/src/components/knowledge/IngestPanel/IngestPanel.tsx:20"}, "properties": {"repobilityId": "3bfab044fb58cdd2", "scanner": "scanner-primary", "fingerprint": "91d65d16c0fadeb4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-52783a7171f331b4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/knowledge/KBSelector/KBSelectorPalette.tsx:313"}, "properties": {"repobilityId": "62b0a75a44a3a1d6", "scanner": "scanner-primary", "fingerprint": "52783a7171f331b4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e23e3d5527470847", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/knowledge/KBSelector/KBSelectorTrigger.tsx:35"}, "properties": {"repobilityId": "3f0c7749966bf954", "scanner": "scanner-primary", "fingerprint": "e23e3d5527470847", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6e7acb531fdf9bf5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/knowledge/graph/KnowledgeGraphPanel.tsx:53"}, "properties": {"repobilityId": "95767968fb613192", "scanner": "scanner-primary", "fingerprint": "6e7acb531fdf9bf5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-519430b5a2c45af1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/knowledge/graph/NodePreview.tsx:51"}, "properties": {"repobilityId": "9d3260c6156a1873", "scanner": "scanner-primary", "fingerprint": "519430b5a2c45af1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0f557854d52ee28e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/bottom_menu/BottomMenuKnowledgeSelection.tsx:44"}, "properties": {"repobilityId": "dbf0fe4053643da1", "scanner": "scanner-primary", "fingerprint": "0f557854d52ee28e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-90c1793af5e23898", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/bottom_menu/DirSwitcher.tsx:97"}, "properties": {"repobilityId": "a3dce1e209d3991c", "scanner": "scanner-primary", "fingerprint": "90c1793af5e23898", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dbc70a1f505d274c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/bottom_menu/BottomMenuSkillSelection.tsx:305"}, "properties": {"repobilityId": "f0873e04ca5ebcff", "scanner": "scanner-primary", "fingerprint": "dbc70a1f505d274c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-81740aff807da8b8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 ui/desktop/src/components/bottom_menu/BottomMenuExtensionSelection.tsx:387"}, "properties": {"repobilityId": "ce1d12dbb8c4190a", "scanner": "scanner-primary", "fingerprint": "81740aff807da8b8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1e967eec578c64ad", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: rust:1.82-bookworm"}, "properties": {"repobilityId": "ddd17c7bf749a79d", "scanner": "scanner-primary", "fingerprint": "1e967eec578c64ad", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 6}}}]}, {"ruleId": "scanner-5c726ef27fab0084", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: debian:bookworm-slim"}, "properties": {"repobilityId": "fe632ff633d8d83e", "scanner": "scanner-primary", "fingerprint": "5c726ef27fab0084", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "recipe-scanner/Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ea2f7eda9be17d45", "level": "error", "message": {"text": "Dockerfile pipes a remote installer into a shell"}, "properties": {"repobilityId": "3c6989df404d0718", "scanner": "scanner-primary", "fingerprint": "ea2f7eda9be17d45", "layer": "hardware", "severity": "high", "confidence": 1.0, "tags": ["supply-chain", "docker", "remote-installer"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "recipe-scanner/Dockerfile"}, "region": {"startLine": 35}}}]}, {"ruleId": "scanner-ea2f7eda9be17d45", "level": "error", "message": {"text": "Dockerfile pipes a remote installer into a shell"}, "properties": {"repobilityId": "6af484d446423153", "scanner": "scanner-primary", "fingerprint": "ea2f7eda9be17d45", "layer": "hardware", "severity": "high", "confidence": 1.0, "tags": ["supply-chain", "docker", "remote-installer"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "recipe-scanner/Dockerfile"}, "region": {"startLine": 41}}}]}, {"ruleId": "scanner-4a210ac3b4b59ff4", "level": "warning", "message": {"text": "Dockerfile runs as root: .devcontainer/Dockerfile"}, "properties": {"repobilityId": "7855b1f55d0800cf", "scanner": "scanner-primary", "fingerprint": "4a210ac3b4b59ff4", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-043a18363bcce260", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: mcr.microsoft.com/devcontainers/rust:1"}, "properties": {"repobilityId": "0e34a24855c1c327", "scanner": "scanner-primary", "fingerprint": "043a18363bcce260", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".devcontainer/Dockerfile"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-da3f383e2f9a9a54", "level": "error", "message": {"text": "Runtime dotenv file present in repo: ui/desktop/.env"}, "properties": {"repobilityId": "c8857af642522529", "scanner": "scanner-primary", "fingerprint": "da3f383e2f9a9a54", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["secrets", "config", "env-file", "runtime-env"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "ui/desktop/.env"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-07500b273af0f917", "level": "error", "message": {"text": "Possible secret in scripts/release.sh"}, "properties": {"repobilityId": "2b354c57fe087f73", "scanner": "scanner-primary", "fingerprint": "07500b273af0f917", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/release.sh"}, "region": {"startLine": 63}}}]}, {"ruleId": "scanner-4b3f87c1e2c388b2", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in crates/biorouter-cli/static/script.js:62"}, "properties": {"repobilityId": "043d80bf0681b2a3", "scanner": "scanner-primary", "fingerprint": "4b3f87c1e2c388b2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "crates/biorouter-cli/static/script.js"}, "region": {"startLine": 62}}}]}, {"ruleId": "scanner-8c872b953938e9ac", "level": "error", "message": {"text": "Insecure pattern 'subprocess_shell_true' in crates/biorouter-mcp/src/computercontroller/platform/linux.rs:183"}, "properties": {"repobilityId": "9d225c57feb007b0", "scanner": "scanner-primary", "fingerprint": "8c872b953938e9ac", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "subprocess_shell_true"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "crates/biorouter-mcp/src/computercontroller/platform/linux.rs"}, "region": {"startLine": 183}}}]}, {"ruleId": "scanner-ccabf5d65b51ca99", "level": "error", "message": {"text": "Insecure pattern 'private_key_in_repo' in crates/biorouter/src/providers/gcpauth.rs:879"}, "properties": {"repobilityId": "13b20d6b362a3a2d", "scanner": "scanner-primary", "fingerprint": "ccabf5d65b51ca99", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["owasp", "private_key_in_repo"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "crates/biorouter/src/providers/gcpauth.rs"}, "region": {"startLine": 879}}}]}, {"ruleId": "scanner-92daccbfdeb027f0", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in ui/desktop/scripts/unregister-deeplink-protocols.js:8"}, "properties": {"repobilityId": "301ceea11f8e1a62", "scanner": "scanner-primary", "fingerprint": "92daccbfdeb027f0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "ui/desktop/scripts/unregister-deeplink-protocols.js"}, "region": {"startLine": 8}}}]}, {"ruleId": "scanner-abfb598568613736", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in ui/desktop/scripts/fetch-llama-server.js:19"}, "properties": {"repobilityId": "5ec9fe1a77b5a654", "scanner": "scanner-primary", "fingerprint": "abfb598568613736", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "ui/desktop/scripts/fetch-llama-server.js"}, "region": {"startLine": 19}}}]}, {"ruleId": "scanner-e4e991c568c9c1fe", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in ui/desktop/scripts/download-mingit.js:16"}, "properties": {"repobilityId": "d1ad56058e9cc48d", "scanner": "scanner-primary", "fingerprint": "e4e991c568c9c1fe", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "ui/desktop/scripts/download-mingit.js"}, "region": {"startLine": 16}}}]}, {"ruleId": "scanner-e13c970a15626c4d", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in ui/desktop/src/main.ts:29"}, "properties": {"repobilityId": "ff8b182a53f909bb", "scanner": "scanner-primary", "fingerprint": "e13c970a15626c4d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "ui/desktop/src/main.ts"}, "region": {"startLine": 29}}}]}, {"ruleId": "scanner-0be2e6e51f67f561", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in ui/desktop/src/biorouterd.ts:3"}, "properties": {"repobilityId": "7176934d1acf863b", "scanner": "scanner-primary", "fingerprint": "0be2e6e51f67f561", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "ui/desktop/src/biorouterd.ts"}, "region": {"startLine": 3}}}]}, {"ruleId": "scanner-7b35cce4f6a63bfe", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in ui/desktop/src/utils/extensionUpdater.ts:16"}, "properties": {"repobilityId": "fda1fbdd470b23f1", "scanner": "scanner-primary", "fingerprint": "7b35cce4f6a63bfe", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "ui/desktop/src/utils/extensionUpdater.ts"}, "region": {"startLine": 16}}}]}, {"ruleId": "scanner-ad19931dad9bfaf7", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in ui/desktop/src/utils/dependencyChecker.ts:14"}, "properties": {"repobilityId": "82a71eab1181f979", "scanner": "scanner-primary", "fingerprint": "ad19931dad9bfaf7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "ui/desktop/src/utils/dependencyChecker.ts"}, "region": {"startLine": 14}}}]}, {"ruleId": "scanner-a27ff4e3223b8b41", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in ui/desktop/src/components/settings/sessions/SessionSharingSection.tsx:37"}, "properties": {"repobilityId": "dac0489080de4965", "scanner": "scanner-primary", "fingerprint": "a27ff4e3223b8b41", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "ui/desktop/src/components/settings/sessions/SessionSharingSection.tsx"}, "region": {"startLine": 37}}}]}, {"ruleId": "scanner-84da2aa7983ef8f5", "level": "note", "message": {"text": "package.json defines install-time lifecycle scripts"}, "properties": {"repobilityId": "94e41cdb75925e17", "scanner": "scanner-primary", "fingerprint": "84da2aa7983ef8f5", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "npm", "install-scripts"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "ui/desktop/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-64068561d22fe6dd", "level": "note", "message": {"text": "Very large file: crates/biorouter-cli/src/cli.rs (1941 lines)"}, "properties": {"repobilityId": "e84dca24ca085e41", "scanner": "scanner-primary", "fingerprint": "64068561d22fe6dd", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-5bed439266dd6066", "level": "note", "message": {"text": "Very large file: crates/biorouter-cli/src/commands/configure.rs (2174 lines)"}, "properties": {"repobilityId": "1d1ac1a17e973b1a", "scanner": "scanner-primary", "fingerprint": "5bed439266dd6066", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c563c561c17d1ff8", "level": "note", "message": {"text": "Very large file: crates/biorouter-cli/src/session/mod.rs (1921 lines)"}, "properties": {"repobilityId": "216bde7af981eedb", "scanner": "scanner-primary", "fingerprint": "c563c561c17d1ff8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c17331020ab38958", "level": "note", "message": {"text": "Very large file: crates/biorouter-mcp/src/developer/rmcp_developer.rs (3755 lines)"}, "properties": {"repobilityId": "fbaef59c5472792f", "scanner": "scanner-primary", "fingerprint": "c17331020ab38958", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e7157a14a63d8628", "level": "note", "message": {"text": "Very large file: crates/biorouter-mcp/src/autovisualiser/mod.rs (1625 lines)"}, "properties": {"repobilityId": "6d903c8a38c0b133", "scanner": "scanner-primary", "fingerprint": "e7157a14a63d8628", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-25162fb1ed96a6ad", "level": "note", "message": {"text": "Very large file: crates/biorouter-mcp/src/knowledge/service.rs (1815 lines)"}, "properties": {"repobilityId": "ce58165ccb41d263", "scanner": "scanner-primary", "fingerprint": "25162fb1ed96a6ad", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-203dba5f41ce24ac", "level": "note", "message": {"text": "Very large file: crates/biorouter-mcp/src/computercontroller/mod.rs (1360 lines)"}, "properties": {"repobilityId": "aac043d0c7e34a70", "scanner": "scanner-primary", "fingerprint": "203dba5f41ce24ac", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e8cbc74ed19ec70e", "level": "note", "message": {"text": "Very large file: crates/biorouter/src/agents/agent.rs (2258 lines)"}, "properties": {"repobilityId": "97fbe79dbfaac43c", "scanner": "scanner-primary", "fingerprint": "e8cbc74ed19ec70e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-abb87bbca77afc4e", "level": "note", "message": {"text": "Very large file: crates/biorouter/src/agents/code_execution_extension.rs (1320 lines)"}, "properties": {"repobilityId": "c716eb8e5a3f074a", "scanner": "scanner-primary", "fingerprint": "abb87bbca77afc4e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-28b1d7eeca763bfb", "level": "note", "message": {"text": "Very large file: crates/biorouter/src/agents/extension_manager.rs (2071 lines)"}, "properties": {"repobilityId": "0b4815a0b094805c", "scanner": "scanner-primary", "fingerprint": "28b1d7eeca763bfb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-630521025f9986fa", "level": "note", "message": {"text": "Very large file: crates/biorouter/src/providers/formats/databricks.rs (1465 lines)"}, "properties": {"repobilityId": "2d0c5d81eddda9ee", "scanner": "scanner-primary", "fingerprint": "630521025f9986fa", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a2207cd8346ee23b", "level": "note", "message": {"text": "Very large file: crates/biorouter/src/providers/formats/openai.rs (1476 lines)"}, "properties": {"repobilityId": "2c996ffb553783e0", "scanner": "scanner-primary", "fingerprint": "a2207cd8346ee23b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b5af9ec131f0efe2", "level": "note", "message": {"text": "Very large file: crates/biorouter/src/providers/formats/google.rs (1544 lines)"}, "properties": {"repobilityId": "33b9897bfd7bcbec", "scanner": "scanner-primary", "fingerprint": "b5af9ec131f0efe2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-adf63371b9a4e5e8", "level": "note", "message": {"text": "Very large file: crates/biorouter/src/session/session_manager.rs (1635 lines)"}, "properties": {"repobilityId": "4a68ff65e57d15db", "scanner": "scanner-primary", "fingerprint": "adf63371b9a4e5e8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-199c338636803ee6", "level": "note", "message": {"text": "Very large file: crates/biorouter/src/config/base.rs (1989 lines)"}, "properties": {"repobilityId": "13c388553bb8d5bb", "scanner": "scanner-primary", "fingerprint": "199c338636803ee6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b672e777ff9d194b", "level": "note", "message": {"text": "Very large file: crates/biorouter-server/tests/knowledge_routes.rs (1824 lines)"}, "properties": {"repobilityId": "065d275adcf28622", "scanner": "scanner-primary", "fingerprint": "b672e777ff9d194b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f46abf433f338ad0", "level": "note", "message": {"text": "Very large file: crates/biorouter-server/src/routes/knowledge.rs (1525 lines)"}, "properties": {"repobilityId": "0340ed278e0a7d4e", "scanner": "scanner-primary", "fingerprint": "f46abf433f338ad0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4c3be331c31d139c", "level": "note", "message": {"text": "Very large file: ui/desktop/src/main.ts (3609 lines)"}, "properties": {"repobilityId": "099449e75d93a74d", "scanner": "scanner-primary", "fingerprint": "4c3be331c31d139c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1ebcc9706e5ccf02", "level": "note", "message": {"text": "Very large file: ui/desktop/src/api/types.gen.ts (4360 lines)"}, "properties": {"repobilityId": "d82464eaf76e7ac0", "scanner": "scanner-primary", "fingerprint": "1ebcc9706e5ccf02", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9354d5d311f71f59", "level": "note", "message": {"text": "Very large file: ui/desktop/src/components/ChatInput.tsx (1791 lines)"}, "properties": {"repobilityId": "f64789929f4a88e0", "scanner": "scanner-primary", "fingerprint": "9354d5d311f71f59", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ea3b5e389d8c9c0f", "level": "note", "message": {"text": "Low test-to-source ratio"}, "properties": {"repobilityId": "ef7b2552cc00a375", "scanner": "scanner-primary", "fingerprint": "ea3b5e389d8c9c0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["tests"]}}, {"ruleId": "scanner-2fbe176a90ede8a4", "level": "note", "message": {"text": "33 TODO/FIXME markers"}, "properties": {"repobilityId": "4b38c118003e07d2", "scanner": "scanner-primary", "fingerprint": "2fbe176a90ede8a4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["maintenance"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "e09dcd623a9c8156", "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": "830f05ab69457358", "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": "2b911fa0e17f00bb", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-bea357a6497a2d5d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: CLAUDE.md"}, "properties": {"repobilityId": "aae72df3934829ac", "scanner": "scanner-primary", "fingerprint": "bea357a6497a2d5d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "CLAUDE.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-98a76726d370a771", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: crates/biorouter/src/agents/builtin_skills/about-biorouter/SKILL.md"}, "properties": {"repobilityId": "dbb73ffd00af6e52", "scanner": "scanner-primary", "fingerprint": "98a76726d370a771", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "crates/biorouter/src/agents/builtin_skills/about-biorouter/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1860fab9f5a9110f", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: ui/desktop/tests/fixtures/skills/ucsfomopagent/omop-phenotype-query/SKILL.md"}, "properties": {"repobilityId": "fdd7d9b9b42d9a7d", "scanner": "scanner-primary", "fingerprint": "1860fab9f5a9110f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "ui/desktop/tests/fixtures/skills/ucsfomopagent/omop-phenotype-query/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bf1c116cd5e675cb", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 test_acp_client.py:46"}, "properties": {"repobilityId": "444851c0efd2d119", "scanner": "scanner-primary", "fingerprint": "bf1c116cd5e675cb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3f9d160a549e87bc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 crates/biorouter-mcp/src/autovisualiser/templates/assets/d3.min.js:2"}, "properties": {"repobilityId": "92a411738fa258bb", "scanner": "scanner-primary", "fingerprint": "3f9d160a549e87bc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f7bcd21707ad2d97", "level": "none", "message": {"text": "Commented-code block (6 lines) in .claude/workflows/release.js:9"}, "properties": {"repobilityId": "8a42813ffbb3899c", "scanner": "scanner-primary", "fingerprint": "f7bcd21707ad2d97", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5246125e02d353b0", "level": "none", "message": {"text": "Commented-code block (5 lines) in ui/desktop/tests/e2e/brxt.spec.ts:395"}, "properties": {"repobilityId": "3ea00384fbb33836", "scanner": "scanner-primary", "fingerprint": "5246125e02d353b0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-81662cba3a9a0c27", "level": "none", "message": {"text": "Commented-code block (5 lines) in ui/desktop/tests/e2e/spokeagent-skills.spec.ts:251"}, "properties": {"repobilityId": "56c551c91af65161", "scanner": "scanner-primary", "fingerprint": "81662cba3a9a0c27", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3f6cbf0b4f5bac7f", "level": "none", "message": {"text": "Commented-code block (7 lines) in ui/desktop/scripts/fetch-llama-server.js:8"}, "properties": {"repobilityId": "9e8f3fe08a0cb97c", "scanner": "scanner-primary", "fingerprint": "3f6cbf0b4f5bac7f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ad9fa8bd5372a871", "level": "note", "message": {"text": "Legacy-named symbol `warnOffDeprecated` in ui/desktop/src/preload.ts:8"}, "properties": {"repobilityId": "57274d2d2a23852b", "scanner": "scanner-primary", "fingerprint": "ad9fa8bd5372a871", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a21e09dc731df683", "level": "none", "message": {"text": "Commented-code block (5 lines) in ui/desktop/src/main.ts:1637"}, "properties": {"repobilityId": "5639d7746ec6d907", "scanner": "scanner-primary", "fingerprint": "a21e09dc731df683", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b0cce6e44361d73b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 ui/desktop/src/main.ts:3366"}, "properties": {"repobilityId": "6b3cf8d9e21dd8de", "scanner": "scanner-primary", "fingerprint": "b0cce6e44361d73b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4c9d41ad52c688a0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 ui/desktop/src/utils/extensionUpdater.ts:116"}, "properties": {"repobilityId": "5bdee5b7534e4a09", "scanner": "scanner-primary", "fingerprint": "4c9d41ad52c688a0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b44432e7057032c0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 ui/desktop/src/utils/githubUpdater.ts:49"}, "properties": {"repobilityId": "ddfc0f85a0eed26c", "scanner": "scanner-primary", "fingerprint": "b44432e7057032c0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-66af92cddf0bdc7f", "level": "none", "message": {"text": "Commented-code block (5 lines) in ui/desktop/src/utils/dependencyChecker.ts:58"}, "properties": {"repobilityId": "62b0107fa801f94a", "scanner": "scanner-primary", "fingerprint": "66af92cddf0bdc7f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-34edcd1fb9e5b46f", "level": "none", "message": {"text": "Commented-code block (15 lines) in ui/desktop/src/utils/sessionNameSync.ts:12"}, "properties": {"repobilityId": "434853e9fc230f25", "scanner": "scanner-primary", "fingerprint": "34edcd1fb9e5b46f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1b67a7e2edcac37e", "level": "none", "message": {"text": "Commented-code block (6 lines) in ui/desktop/src/hooks/useWorkflowManager.ts:149"}, "properties": {"repobilityId": "e2c1f1a3e39bb336", "scanner": "scanner-primary", "fingerprint": "1b67a7e2edcac37e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a4bf9047fa1efba5", "level": "none", "message": {"text": "Commented-code block (5 lines) in ui/desktop/src/hooks/useFileDrop.ts:74"}, "properties": {"repobilityId": "cef7020ba36460ff", "scanner": "scanner-primary", "fingerprint": "a4bf9047fa1efba5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-803991d16e33da98", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 ui/desktop/src/hooks/useWhisper.ts:190"}, "properties": {"repobilityId": "57469f4a36ddc2d0", "scanner": "scanner-primary", "fingerprint": "803991d16e33da98", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9ad2ecd40bd9d78a", "level": "none", "message": {"text": "Commented-code block (6 lines) in ui/desktop/src/hooks/useChatStream.ts:40"}, "properties": {"repobilityId": "f30a17fe2bb8102d", "scanner": "scanner-primary", "fingerprint": "9ad2ecd40bd9d78a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6d40fb224c200ed9", "level": "none", "message": {"text": "Commented-code block (5 lines) in ui/desktop/src/components/ChatInput.tsx:346"}, "properties": {"repobilityId": "7d1a1028116568cd", "scanner": "scanner-primary", "fingerprint": "6d40fb224c200ed9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e8a480240676aed2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 ui/desktop/src/components/UpdateAvailableModal.tsx:63"}, "properties": {"repobilityId": "644899f372c66e20", "scanner": "scanner-primary", "fingerprint": "e8a480240676aed2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1c0ef053f7986ca8", "level": "none", "message": {"text": "Commented-code block (5 lines) in ui/desktop/src/components/BaseChat.tsx:122"}, "properties": {"repobilityId": "f535130e934739ac", "scanner": "scanner-primary", "fingerprint": "1c0ef053f7986ca8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-505b548529d055b8", "level": "none", "message": {"text": "Commented-code block (6 lines) in ui/desktop/src/components/Dashboard/DashboardProvider.tsx:303"}, "properties": {"repobilityId": "8c82452d9a55da9e", "scanner": "scanner-primary", "fingerprint": "505b548529d055b8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9aca5b529923a302", "level": "none", "message": {"text": "Commented-code block (9 lines) in ui/desktop/src/components/Dashboard/DashboardBoard.tsx:21"}, "properties": {"repobilityId": "26149041e2853599", "scanner": "scanner-primary", "fingerprint": "9aca5b529923a302", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fd5f930f405a881b", "level": "none", "message": {"text": "Commented-code block (6 lines) in ui/desktop/src/components/Dashboard/ChatWindow.tsx:54"}, "properties": {"repobilityId": "79e7c2e08765e164", "scanner": "scanner-primary", "fingerprint": "fd5f930f405a881b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e38d0e53046104d3", "level": "none", "message": {"text": "Commented-code block (6 lines) in ui/desktop/src/components/Dashboard/canvasLayout.ts:162"}, "properties": {"repobilityId": "c2d659b10f7f322b", "scanner": "scanner-primary", "fingerprint": "e38d0e53046104d3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f30c22037b5c5f5d", "level": "none", "message": {"text": "Commented-code block (5 lines) in ui/desktop/src/components/Dashboard/DashboardRoute.tsx:6"}, "properties": {"repobilityId": "31f07ae36576e431", "scanner": "scanner-primary", "fingerprint": "f30c22037b5c5f5d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6966212768aef234", "level": "note", "message": {"text": "Legacy-named symbol `parsedLegacy` in ui/desktop/src/components/Dashboard/dashboardStorage.ts:125"}, "properties": {"repobilityId": "e07255626d92d004", "scanner": "scanner-primary", "fingerprint": "6966212768aef234", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b243298ea4d20970", "level": "none", "message": {"text": "Commented-code block (10 lines) in ui/desktop/src/components/Dashboard/layoutEngine.test.ts:283"}, "properties": {"repobilityId": "1908688ca7e0ca14", "scanner": "scanner-primary", "fingerprint": "b243298ea4d20970", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f792a8007c5d7db4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 ui/desktop/src/components/settings/sessions/SessionSharingSection.tsx:106"}, "properties": {"repobilityId": "5b0abd914b8fb60c", "scanner": "scanner-primary", "fingerprint": "f792a8007c5d7db4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-41339da13e004607", "level": "none", "message": {"text": "Commented-code block (5 lines) in ui/desktop/src/components/settings/models/subcomponents/SwitchModelModal.tsx:61"}, "properties": {"repobilityId": "3c2593b444a20a56", "scanner": "scanner-primary", "fingerprint": "41339da13e004607", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-64bff9d667faebd9", "level": "note", "message": {"text": "Legacy-named symbol `another_unused` in ui/desktop/src/components/workflows/shared/__tests__/WorkflowFormFields.test.tsx:531"}, "properties": {"repobilityId": "846b505e73a276a7", "scanner": "scanner-primary", "fingerprint": "64bff9d667faebd9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-fe220427b6a7b6a6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 ui/desktop/src/components/knowledge/hooks/knowledgeRequest.ts:52"}, "properties": {"repobilityId": "75fc72198545e838", "scanner": "scanner-primary", "fingerprint": "fe220427b6a7b6a6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fa71ea1c5f895346", "level": "none", "message": {"text": "Commented-code block (6 lines) in ui/desktop/src/components/knowledge/graph/labelText.ts:3"}, "properties": {"repobilityId": "4bb696450c6e0e08", "scanner": "scanner-primary", "fingerprint": "fa71ea1c5f895346", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4ad7e83600ab4258", "level": "none", "message": {"text": "Commented-code block (6 lines) in ui/desktop/src/components/Layout/MainPanelLayout.tsx:8"}, "properties": {"repobilityId": "d16812e55ef23978", "scanner": "scanner-primary", "fingerprint": "4ad7e83600ab4258", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-584b730dd5cec8ca", "level": "none", "message": {"text": "Commented-code block (5 lines) in ui/desktop/src/components/ui/scroll-area.tsx:156"}, "properties": {"repobilityId": "d1e59f3d2411b316", "scanner": "scanner-primary", "fingerprint": "584b730dd5cec8ca", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-94b96c40213c0f47", "level": "warning", "message": {"text": "Frontend route `launcher` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx"}, "properties": {"repobilityId": "50b78a9949905c18", "scanner": "scanner-primary", "fingerprint": "94b96c40213c0f47", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c0b8786d34d9d4b3", "level": "warning", "message": {"text": "Frontend route `welcome` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx"}, "properties": {"repobilityId": "79439d85e959b995", "scanner": "scanner-primary", "fingerprint": "c0b8786d34d9d4b3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-ae2b355f24f4fd3b", "level": "warning", "message": {"text": "Frontend route `configure-providers` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx"}, "properties": {"repobilityId": "0a4f7095580d2d92", "scanner": "scanner-primary", "fingerprint": "ae2b355f24f4fd3b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-bc66d8da61c16c42", "level": "warning", "message": {"text": "Frontend route `standalone-app` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx"}, "properties": {"repobilityId": "70ec4abb7aa4c009", "scanner": "scanner-primary", "fingerprint": "bc66d8da61c16c42", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-37e872887a4712bf", "level": "warning", "message": {"text": "Frontend route `pair` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx"}, "properties": {"repobilityId": "c141f545b64df48f", "scanner": "scanner-primary", "fingerprint": "37e872887a4712bf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-3d84871afae3ba68", "level": "warning", "message": {"text": "Frontend route `settings` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx"}, "properties": {"repobilityId": "11f3fb4cbf280beb", "scanner": "scanner-primary", "fingerprint": "3d84871afae3ba68", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-bd0c9cd9caba1a1d", "level": "warning", "message": {"text": "Frontend route `extensions` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx"}, "properties": {"repobilityId": "d6eb7c52ec7a3e05", "scanner": "scanner-primary", "fingerprint": "bd0c9cd9caba1a1d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-1dce978e9042c387", "level": "warning", "message": {"text": "Frontend route `apps` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx"}, "properties": {"repobilityId": "b3fa2a3800e78ec9", "scanner": "scanner-primary", "fingerprint": "1dce978e9042c387", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d47037596c8aa3a6", "level": "warning", "message": {"text": "Frontend route `sessions` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx"}, "properties": {"repobilityId": "39eeac8b691db5ca", "scanner": "scanner-primary", "fingerprint": "d47037596c8aa3a6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-8352e25e31a8e917", "level": "warning", "message": {"text": "Frontend route `schedules` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx"}, "properties": {"repobilityId": "2f807ca0fe56ec98", "scanner": "scanner-primary", "fingerprint": "8352e25e31a8e917", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-1e7682ac857126a0", "level": "warning", "message": {"text": "Frontend route `workflows` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx"}, "properties": {"repobilityId": "975fb21f17c146ae", "scanner": "scanner-primary", "fingerprint": "1e7682ac857126a0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-3c67a409ed2063dd", "level": "warning", "message": {"text": "Frontend route `skills` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx"}, "properties": {"repobilityId": "721df0acd5ee1060", "scanner": "scanner-primary", "fingerprint": "3c67a409ed2063dd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a4086f2a1b692a7c", "level": "warning", "message": {"text": "Frontend route `knowledge` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx"}, "properties": {"repobilityId": "ccd639d8b140bd55", "scanner": "scanner-primary", "fingerprint": "a4086f2a1b692a7c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-cd1016ea8803b2fa", "level": "warning", "message": {"text": "Frontend route `dashboard` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx"}, "properties": {"repobilityId": "99e80a2479baa569", "scanner": "scanner-primary", "fingerprint": "cd1016ea8803b2fa", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-4ac6feeea467a295", "level": "warning", "message": {"text": "Frontend route `shared-session` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx"}, "properties": {"repobilityId": "b4348a4b582186b9", "scanner": "scanner-primary", "fingerprint": "4ac6feeea467a295", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-47f84d676ffcc427", "level": "warning", "message": {"text": "Frontend route `permission` has no Link/navigate to it \u2014 ui/desktop/src/App.tsx"}, "properties": {"repobilityId": "06d5ac2c8ac04de7", "scanner": "scanner-primary", "fingerprint": "47f84d676ffcc427", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}]}]}