{"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-72bfff57bfbad45e", "name": "Stray `console.log` in TS/JS \u2014 test/javascript/unicode.ts:89", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test/javascript/unicode.ts:89"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-329d252df83ff831", "name": "Stray `console.log` in TS/JS \u2014 test/javascript/multiline.js:41", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test/javascript/multiline.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-a13e8b1e6afd5c15", "name": "Stray `console.log` in TS/JS \u2014 test/javascript/test.ts:62", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test/javascript/test.ts:62"}, "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-86df59ece69ceb20", "name": "Stray `console.log` in TS/JS \u2014 test/javascript/generics.ts:294", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test/javascript/generics.ts:294"}, "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-3567d543b8f87059", "name": "Stray `console.log` in TS/JS \u2014 test/javascript/async.ts:315", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test/javascript/async.ts:315"}, "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-2e592b8c422dd405", "name": "Icon-only button without accessible name \u2014 test/web/test.svelte:149", "shortDescription": {"text": "Icon-only button without accessible name \u2014 test/web/test.svelte:149"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-94099139935a8e35", "name": "Stray `console.log` in TS/JS \u2014 test/web/test.svelte:62", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test/web/test.svelte:62"}, "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-cb36888c6e9a59df", "name": "Icon-only button without accessible name \u2014 test/web/test.vue:227", "shortDescription": {"text": "Icon-only button without accessible name \u2014 test/web/test.vue:227"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1469fcd92a034a70", "name": "Stray `console.log` in TS/JS \u2014 test/web/test.vue:168", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test/web/test.vue:168"}, "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-cf6ea39084f6d5dd", "name": "`truncate` class without `title=` for hover reveal \u2014 src/settings/sections/AgentsSection.tsx:181", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/settings/sections/AgentsSection.tsx:181"}, "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-6054ee592abc1358", "name": "`truncate` class without `title=` for hover reveal \u2014 src/settings/sections/EnvironmentSection.tsx:83", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/settings/sections/EnvironmentSection.tsx:83"}, "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-568327f09f61a480", "name": "`truncate` class without `title=` for hover reveal \u2014 src/settings/sections/ModelsSection.tsx:459", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/settings/sections/ModelsSection.tsx:459"}, "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-8c4b5f4b9b1cf058", "name": "`truncate` class without `title=` for hover reveal \u2014 src/settings/sections/ThemesSection.tsx:292", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/settings/sections/ThemesSection.tsx:292"}, "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-eeebd806df46cdcb", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/QuickFilePicker.tsx:215", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/QuickFilePicker.tsx:215"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4dd988d134024fde", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ShellHistoryOverlay.tsx:214", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ShellHistoryOverlay.tsx:214"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e6e30d6e1ddd37f1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/WorkspaceSwitcher.tsx:142", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/WorkspaceSwitcher.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-5ac1ff19efef77d8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/WorkspaceSearch.tsx:300", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/WorkspaceSearch.tsx:300"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-83f80ce1b6c6f220", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/WorkspaceSearch.tsx:351", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/WorkspaceSearch.tsx:351"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d445a29242615e6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ai-elements/tool.tsx:194", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ai-elements/tool.tsx:194"}, "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-a0092747723d092f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/shell-snippets/ShellSnippetsPanel.tsx:216", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/shell-snippets/ShellSnippetsPanel.tsx:216"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-84a46b9e93611a62", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/ai/components/AiInputBar.tsx:379", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/ai/components/AiInputBar.tsx:379"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4ed0927270bb1ae3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/ai/components/PlanDiffReview.tsx:150", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/ai/components/PlanDiffReview.tsx:150"}, "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-6750d7c78b65cb71", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/ai/components/AgentStatusPill.tsx:45", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/ai/components/AgentStatusPill.tsx:45"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-67fe63ecd5ade771", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/ai/components/AiMiniWindow.tsx:262", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/ai/components/AiMiniWindow.tsx:262"}, "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-6f643e6872f1860d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/ai/components/AiChat.tsx:97", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/ai/components/AiChat.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-6c3e47cff0150c46", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/ai/components/AiPanel.tsx:320", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/ai/components/AiPanel.tsx:320"}, "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-2a27ee9e5219f35c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/ai/components/AgentSwitcher.tsx:72", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/ai/components/AgentSwitcher.tsx:72"}, "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-fe64d3f344e7f27e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/ai/components/AiStatusBarControls.tsx:512", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/ai/components/AiStatusBarControls.tsx:512"}, "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-2b48ddff97b1d5a3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/ai/components/FilePicker.tsx:94", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/ai/components/FilePicker.tsx:94"}, "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-c001957589c6e208", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/debugger/DebuggerPanel.tsx:261", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/debugger/DebuggerPanel.tsx:261"}, "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-847cd2c93014b3f3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/explorer/ExplorerSearch.tsx:277", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/explorer/ExplorerSearch.tsx:277"}, "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-abb9e886d9598713", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/explorer/TreeRow.tsx:143", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/explorer/TreeRow.tsx:143"}, "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-edf85ce054b4d4a6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/explorer/InlineInput.tsx:98", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/explorer/InlineInput.tsx:98"}, "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-ac644a6c690607fa", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/statusbar/WorkspaceEnvSelector.tsx:59", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/statusbar/WorkspaceEnvSelector.tsx:59"}, "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-6ef0571d544094fe", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/statusbar/CwdBreadcrumb.tsx:296", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/statusbar/CwdBreadcrumb.tsx:296"}, "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-017f3b8625fa8a21", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/agent-queue/AgentQueuePanel.tsx:178", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/agent-queue/AgentQueuePanel.tsx:178"}, "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-347cf485ea66de48", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/recent-files/RecentFilesPanel.tsx:292", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/recent-files/RecentFilesPanel.tsx:292"}, "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-ce8aa72242337065", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/database/DatabasePanel.tsx:293", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/database/DatabasePanel.tsx:293"}, "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-f4d8e89ee6259b77", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/bookmarks/BookmarksPanel.tsx:141", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/bookmarks/BookmarksPanel.tsx:141"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4a19cfa9849ed32e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/preview/PreviewAddressBar.tsx:213", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/preview/PreviewAddressBar.tsx:213"}, "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-507f3c56ec36650b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/preview/PreviewPane.tsx:92", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/preview/PreviewPane.tsx:92"}, "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-bee8c7e00fce2223", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/workspace-notes/WorkspaceNotesPanel.tsx:191", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/workspace-notes/WorkspaceNotesPanel.tsx:191"}, "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-9b86d8cca7ca71cb", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/modules/workspace-notes/WorkspaceNotesPanel.tsx:218", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/modules/workspace-notes/WorkspaceNotesPanel.tsx:218"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0d4bd6b3bb5d5449", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/prompt-templates/PromptTemplatesPanel.tsx:272", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/prompt-templates/PromptTemplatesPanel.tsx:272"}, "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-fd696e0e69102d73", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/ml/MlStatusPill.tsx:55", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/ml/MlStatusPill.tsx:55"}, "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-7b142c4c570412fe", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/ml/MlPanel.tsx:164", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/ml/MlPanel.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-08d9d2c01a0fde55", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/terminal/TerminalPane.tsx:196", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/terminal/TerminalPane.tsx:196"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6eb751eee831fd6e", "name": "Stray `console.log` in TS/JS \u2014 src/modules/snippets/SnippetsPanel.tsx:133", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/modules/snippets/SnippetsPanel.tsx:133"}, "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-fe6c690c06d3bc96", "name": "Stray `console.log` in TS/JS \u2014 src/modules/snippets/codeSnippets.ts:41", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/modules/snippets/codeSnippets.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-876ba2661b9003db", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/markdown/MarkdownPreviewPane.tsx:110", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/markdown/MarkdownPreviewPane.tsx:110"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-175ca75a19c6bb2e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/ssh/SshPanel.tsx:197", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/ssh/SshPanel.tsx:197"}, "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-265ca8e4bc536eb4", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/ssh/SshKeyManager.tsx:200", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/ssh/SshKeyManager.tsx:200"}, "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-661552f3e4c2ac86", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/python/PythonEnvPill.tsx:84", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/python/PythonEnvPill.tsx:84"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-53a9f1923e538f4e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/share/SharePanel.tsx:236", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/share/SharePanel.tsx:236"}, "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-f0d69c4c5b7723e2", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/git-history/GitHistoryPane.tsx:768", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/git-history/GitHistoryPane.tsx:768"}, "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-d7e5b32f993ce0f7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/image-viewer/ImageViewerPane.tsx:148", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/image-viewer/ImageViewerPane.tsx:148"}, "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-17e144a067f7ff8b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/editor/GitDiffPane.tsx:328", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/editor/GitDiffPane.tsx:328"}, "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-d2fe3a003f263a2c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/editor/CodeActionDialog.tsx:232", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/editor/CodeActionDialog.tsx:232"}, "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-e98f2bc05e009cd2", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/editor/SymbolOutlinePanel.tsx:145", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/editor/SymbolOutlinePanel.tsx:145"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-caabe8b7669307ab", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/editor/RenameDialog.tsx:227", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/editor/RenameDialog.tsx:227"}, "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-819157466e750d2a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/editor/NewEditorDialog.tsx:117", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/editor/NewEditorDialog.tsx:117"}, "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-183de84fadb7b65f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/symbol-search/SymbolSearchPanel.tsx:289", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/symbol-search/SymbolSearchPanel.tsx:289"}, "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-253456cb754b182e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/profiles/ProfilesPanel.tsx:256", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/profiles/ProfilesPanel.tsx:256"}, "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-9cbf4e922ea80dd6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/problems/ProblemsPanel.tsx:167", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/problems/ProblemsPanel.tsx:167"}, "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-d81519bbedc3fb04", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/source-control/WorktreeSection.tsx:168", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/source-control/WorktreeSection.tsx:168"}, "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-5174183feb0726d0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/source-control/ConflictSection.tsx:142", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/source-control/ConflictSection.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-121736d95fc09fb0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/source-control/StashSection.tsx:238", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/source-control/StashSection.tsx:238"}, "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-615968bbcc73fbb3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/source-control/SubmoduleSection.tsx:158", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/source-control/SubmoduleSection.tsx:158"}, "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-b8c267a66a92cbe5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/source-control/SourceControlPanel.tsx:459", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/source-control/SourceControlPanel.tsx:459"}, "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-6fa6886c3b237087", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/ports/PortsPanel.tsx:238", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/ports/PortsPanel.tsx:238"}, "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-0bee7c6d2cf3608f", "name": "Privileged port 12 in use", "shortDescription": {"text": "Privileged port 12 in use"}, "fullDescription": {"text": "Port 12 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-01f34abf36d69101", "name": "Dockerfile runs as root: test/devops/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: test/devops/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-807cd15e31ea1ceb", "name": "Docker base image is tag-pinned but not digest-pinned: rust:${RUST_VERSION}-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: rust:${RUST_VERSION}-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-ab70606b46ad9cf9", "name": "Docker base image is tag-pinned but not digest-pinned: node:${NODE_VERSION}-alpine${ALPINE_VERSION}", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:${NODE_VERSION}-alpine${ALPINE_VERSION}"}, "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-4e85f1690d347e18", "name": "Docker base image is tag-pinned but not digest-pinned: alpine:${ALPINE_VERSION}", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: alpine:${ALPINE_VERSION}"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-907da5878807ea90", "name": "Insecure pattern 'cors_wildcard' in src-tauri/src/modules/http_share.rs:224", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in src-tauri/src/modules/http_share.rs:224"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-03c5ac81e5db8c60", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/WorkspaceSearch.tsx:351", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/WorkspaceSearch.tsx:351"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-71f020fc9cdcc040", "name": "Insecure pattern 'dangerous_innerhtml' in src/modules/workspace-notes/WorkspaceNotesPanel.tsx:218", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/modules/workspace-notes/WorkspaceNotesPanel.tsx:218"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8a770e47416147fa", "name": "Insecure pattern 'new_function_used' in src/modules/terminal/lib/keymap.test.mjs:16", "shortDescription": {"text": "Insecure pattern 'new_function_used' in src/modules/terminal/lib/keymap.test.mjs:16"}, "fullDescription": {"text": "Found a known-risky pattern (new_function_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8aec621d5c1474ce", "name": "Insecure pattern 'node_child_process' in e2e/wdio.conf.ts:7", "shortDescription": {"text": "Insecure pattern 'node_child_process' in e2e/wdio.conf.ts:7"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-397ffb69fd282511", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "dtolnay/rust-toolchain@stable can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-27924aa79fa4a517", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "pnpm/action-setup@v6 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-46c644c6227e4d4a", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "pnpm/action-setup@v6 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1838a141491ce38c", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-65c9bd56493a81d3", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "pnpm/action-setup@v6 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7446b0561b7c27d5", "name": "Very large file: src/app/App.tsx (1815 lines)", "shortDescription": {"text": "Very large file: src/app/App.tsx (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-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "39 test file(s) for 416 source file(s) (ratio 0.09). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 115 placeholder/mock markers across 48 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-9d79c4077342a7d0", "name": "Runtime service client appears to use placeholder configuration", "shortDescription": {"text": "Runtime service client appears to use placeholder configuration"}, "fullDescription": {"text": "A runtime source file appears to wire Supabase/Firebase/AI/payment-style clients to placeholder URLs, keys, or fallback values. In the Fable corpus this often means the UI/API shape is present while the backend service is not actually configured."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1360164774b77e96", "name": "Commented-code block (10 lines) in vite.config.ts:59", "shortDescription": {"text": "Commented-code block (10 lines) in vite.config.ts:59"}, "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-82896952bf8b9ce6", "name": "Commented-code block (5 lines) in src/components/ai-elements/tool.tsx:130", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/ai-elements/tool.tsx:130"}, "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-9a9a657216644960", "name": "Legacy-named symbol `id_rsa_old` in src/modules/ai/lib/security.ts:52", "shortDescription": {"text": "Legacy-named symbol `id_rsa_old` in src/modules/ai/lib/security.ts:52"}, "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-0c3b719a340241bb", "name": "Commented-code block (5 lines) in src/modules/ai/lib/security.ts:87", "shortDescription": {"text": "Commented-code block (5 lines) in src/modules/ai/lib/security.ts:87"}, "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-4ccd530d643d1c99", "name": "Legacy-named symbol `id_rsa_old` in src/modules/ai/lib/security.test.ts:53", "shortDescription": {"text": "Legacy-named symbol `id_rsa_old` in src/modules/ai/lib/security.test.ts:53"}, "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-190ad2823d08d662", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/modules/updater/useUpdater.ts:58", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/modules/updater/useUpdater.ts:58"}, "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-247fb3af677371bc", "name": "Commented-code block (6 lines) in src/modules/explorer/InlineInput.tsx:41", "shortDescription": {"text": "Commented-code block (6 lines) in src/modules/explorer/InlineInput.tsx:41"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6c3a5958ac53b54a", "name": "Commented-code block (5 lines) in src/modules/recent-files/RecentFilesPanel.tsx:40", "shortDescription": {"text": "Commented-code block (5 lines) in src/modules/recent-files/RecentFilesPanel.tsx: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-d3dcb513cc7be0b1", "name": "Commented-code block (6 lines) in src/modules/preview/PreviewPane.tsx:112", "shortDescription": {"text": "Commented-code block (6 lines) in src/modules/preview/PreviewPane.tsx:112"}, "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-d10c6abb80cd3277", "name": "Commented-code block (5 lines) in src/modules/terminal/lib/rendererPool.ts:140", "shortDescription": {"text": "Commented-code block (5 lines) in src/modules/terminal/lib/rendererPool.ts:140"}, "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-06242e53ae2c11b3", "name": "Commented-code block (8 lines) in src/modules/git-history/lib/graph.ts:12", "shortDescription": {"text": "Commented-code block (8 lines) in src/modules/git-history/lib/graph.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-947165dafa42310a", "name": "Commented-code block (6 lines) in src/modules/editor/GitDiffPane.tsx:273", "shortDescription": {"text": "Commented-code block (6 lines) in src/modules/editor/GitDiffPane.tsx:273"}, "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-60f4b2979bb815ad", "name": "Commented-code block (32 lines) in src/modules/editor/AiDiffPane.tsx:39", "shortDescription": {"text": "Commented-code block (32 lines) in src/modules/editor/AiDiffPane.tsx:39"}, "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-ce1d3d4e3a1c5ecc", "name": "Commented-code block (5 lines) in src/modules/editor/lib/linting.ts:63", "shortDescription": {"text": "Commented-code block (5 lines) in src/modules/editor/lib/linting.ts:63"}, "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-91c50c11249ecbda", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/modules/editor/lib/autocomplete/prompt.ts:63", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/modules/editor/lib/autocomplete/prompt.ts: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-319e66a630e14977", "name": "2 env vars used in code but missing from .env.example", "shortDescription": {"text": "2 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `TAURI_DEV_HOST`, `TAURI_ENV_PLATFORM`. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\ntest/scripting/test.py:unwrap, test/scripting/test.py:unwrap\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-be46ea126aa5d8dc", "name": "Near-duplicate function bodies in 3 places", "shortDescription": {"text": "Near-duplicate function bodies in 3 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\ntest/scripting/test.py:wrapper, test/scripting/test.py:wrapper, test/scripting/test.py:wrapper\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/18614"}, "properties": {"repository": "rwetz/Nexis", "repoUrl": "https://github.com/rwetz/Nexis", "branch": "main"}, "results": [{"ruleId": "scanner-72bfff57bfbad45e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test/javascript/unicode.ts:89"}, "properties": {"repobilityId": "ad30dc3f211fbe0a", "scanner": "scanner-primary", "fingerprint": "72bfff57bfbad45e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-329d252df83ff831", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test/javascript/multiline.js:41"}, "properties": {"repobilityId": "f1854edae12ba895", "scanner": "scanner-primary", "fingerprint": "329d252df83ff831", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a13e8b1e6afd5c15", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test/javascript/test.ts:62"}, "properties": {"repobilityId": "8b201b70f08423b8", "scanner": "scanner-primary", "fingerprint": "a13e8b1e6afd5c15", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-86df59ece69ceb20", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test/javascript/generics.ts:294"}, "properties": {"repobilityId": "d0f216d474f3cf02", "scanner": "scanner-primary", "fingerprint": "86df59ece69ceb20", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3567d543b8f87059", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test/javascript/async.ts:315"}, "properties": {"repobilityId": "a6ce99940d9ee943", "scanner": "scanner-primary", "fingerprint": "3567d543b8f87059", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2e592b8c422dd405", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 test/web/test.svelte:149"}, "properties": {"repobilityId": "a6e3edd8e7557c95", "scanner": "scanner-primary", "fingerprint": "2e592b8c422dd405", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-94099139935a8e35", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test/web/test.svelte:62"}, "properties": {"repobilityId": "891f3453e49b998f", "scanner": "scanner-primary", "fingerprint": "94099139935a8e35", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cb36888c6e9a59df", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 test/web/test.vue:227"}, "properties": {"repobilityId": "5477bff8ee1356fb", "scanner": "scanner-primary", "fingerprint": "cb36888c6e9a59df", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-1469fcd92a034a70", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test/web/test.vue:168"}, "properties": {"repobilityId": "be0e8cda63ee0df5", "scanner": "scanner-primary", "fingerprint": "1469fcd92a034a70", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cf6ea39084f6d5dd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/settings/sections/AgentsSection.tsx:181"}, "properties": {"repobilityId": "85b988db7ce66c76", "scanner": "scanner-primary", "fingerprint": "cf6ea39084f6d5dd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6054ee592abc1358", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/settings/sections/EnvironmentSection.tsx:83"}, "properties": {"repobilityId": "36d1211f2eb173e2", "scanner": "scanner-primary", "fingerprint": "6054ee592abc1358", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-568327f09f61a480", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/settings/sections/ModelsSection.tsx:459"}, "properties": {"repobilityId": "a4b8dbce742d9c4d", "scanner": "scanner-primary", "fingerprint": "568327f09f61a480", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8c4b5f4b9b1cf058", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/settings/sections/ThemesSection.tsx:292"}, "properties": {"repobilityId": "806283cca1d8c58c", "scanner": "scanner-primary", "fingerprint": "8c4b5f4b9b1cf058", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-eeebd806df46cdcb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/QuickFilePicker.tsx:215"}, "properties": {"repobilityId": "8d711e54085a77e6", "scanner": "scanner-primary", "fingerprint": "eeebd806df46cdcb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4dd988d134024fde", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ShellHistoryOverlay.tsx:214"}, "properties": {"repobilityId": "a6cda055dd4802cd", "scanner": "scanner-primary", "fingerprint": "4dd988d134024fde", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e6e30d6e1ddd37f1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/WorkspaceSwitcher.tsx:142"}, "properties": {"repobilityId": "6a3474e3892d61a6", "scanner": "scanner-primary", "fingerprint": "e6e30d6e1ddd37f1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5ac1ff19efef77d8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/WorkspaceSearch.tsx:300"}, "properties": {"repobilityId": "d7f952b0c7f7d5b9", "scanner": "scanner-primary", "fingerprint": "5ac1ff19efef77d8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-83f80ce1b6c6f220", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/WorkspaceSearch.tsx:351"}, "properties": {"repobilityId": "09abaa9e1766cca5", "scanner": "scanner-primary", "fingerprint": "83f80ce1b6c6f220", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-2d445a29242615e6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ai-elements/tool.tsx:194"}, "properties": {"repobilityId": "c6ec670a66d52285", "scanner": "scanner-primary", "fingerprint": "2d445a29242615e6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a0092747723d092f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/shell-snippets/ShellSnippetsPanel.tsx:216"}, "properties": {"repobilityId": "33958b5806517b2b", "scanner": "scanner-primary", "fingerprint": "a0092747723d092f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-84a46b9e93611a62", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/ai/components/AiInputBar.tsx:379"}, "properties": {"repobilityId": "10360cc137f657b3", "scanner": "scanner-primary", "fingerprint": "84a46b9e93611a62", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4ed0927270bb1ae3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/ai/components/PlanDiffReview.tsx:150"}, "properties": {"repobilityId": "3f9c8c183838b610", "scanner": "scanner-primary", "fingerprint": "4ed0927270bb1ae3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6750d7c78b65cb71", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/ai/components/AgentStatusPill.tsx:45"}, "properties": {"repobilityId": "65cb6deb1d3716d4", "scanner": "scanner-primary", "fingerprint": "6750d7c78b65cb71", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-67fe63ecd5ade771", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/ai/components/AiMiniWindow.tsx:262"}, "properties": {"repobilityId": "24ccd8253a7c02ab", "scanner": "scanner-primary", "fingerprint": "67fe63ecd5ade771", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6f643e6872f1860d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/ai/components/AiChat.tsx:97"}, "properties": {"repobilityId": "ad5140f3f42bfc58", "scanner": "scanner-primary", "fingerprint": "6f643e6872f1860d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6c3e47cff0150c46", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/ai/components/AiPanel.tsx:320"}, "properties": {"repobilityId": "0f30c702fcdb496f", "scanner": "scanner-primary", "fingerprint": "6c3e47cff0150c46", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2a27ee9e5219f35c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/ai/components/AgentSwitcher.tsx:72"}, "properties": {"repobilityId": "dba9b8b7189eb21e", "scanner": "scanner-primary", "fingerprint": "2a27ee9e5219f35c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fe64d3f344e7f27e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/ai/components/AiStatusBarControls.tsx:512"}, "properties": {"repobilityId": "1ce9e7984f0c90fd", "scanner": "scanner-primary", "fingerprint": "fe64d3f344e7f27e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2b48ddff97b1d5a3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/ai/components/FilePicker.tsx:94"}, "properties": {"repobilityId": "b745184d79796b31", "scanner": "scanner-primary", "fingerprint": "2b48ddff97b1d5a3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c001957589c6e208", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/debugger/DebuggerPanel.tsx:261"}, "properties": {"repobilityId": "b4e999624bce83b6", "scanner": "scanner-primary", "fingerprint": "c001957589c6e208", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-847cd2c93014b3f3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/explorer/ExplorerSearch.tsx:277"}, "properties": {"repobilityId": "d3f60d3bfaa5945f", "scanner": "scanner-primary", "fingerprint": "847cd2c93014b3f3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-abb9e886d9598713", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/explorer/TreeRow.tsx:143"}, "properties": {"repobilityId": "73c3c5118cd4c4ea", "scanner": "scanner-primary", "fingerprint": "abb9e886d9598713", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-edf85ce054b4d4a6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/explorer/InlineInput.tsx:98"}, "properties": {"repobilityId": "4f70592cbaeef2a7", "scanner": "scanner-primary", "fingerprint": "edf85ce054b4d4a6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ac644a6c690607fa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/statusbar/WorkspaceEnvSelector.tsx:59"}, "properties": {"repobilityId": "70bb9855c33c252e", "scanner": "scanner-primary", "fingerprint": "ac644a6c690607fa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6ef0571d544094fe", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/statusbar/CwdBreadcrumb.tsx:296"}, "properties": {"repobilityId": "9c5b97726f4861e9", "scanner": "scanner-primary", "fingerprint": "6ef0571d544094fe", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-017f3b8625fa8a21", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/agent-queue/AgentQueuePanel.tsx:178"}, "properties": {"repobilityId": "f59781209addd5fc", "scanner": "scanner-primary", "fingerprint": "017f3b8625fa8a21", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-347cf485ea66de48", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/recent-files/RecentFilesPanel.tsx:292"}, "properties": {"repobilityId": "f9fcc7fce46e260f", "scanner": "scanner-primary", "fingerprint": "347cf485ea66de48", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ce8aa72242337065", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/database/DatabasePanel.tsx:293"}, "properties": {"repobilityId": "34356d380a8b15aa", "scanner": "scanner-primary", "fingerprint": "ce8aa72242337065", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f4d8e89ee6259b77", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/bookmarks/BookmarksPanel.tsx:141"}, "properties": {"repobilityId": "e155fc918761d06f", "scanner": "scanner-primary", "fingerprint": "f4d8e89ee6259b77", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4a19cfa9849ed32e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/preview/PreviewAddressBar.tsx:213"}, "properties": {"repobilityId": "b16979ea0770deb4", "scanner": "scanner-primary", "fingerprint": "4a19cfa9849ed32e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-507f3c56ec36650b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/preview/PreviewPane.tsx:92"}, "properties": {"repobilityId": "78057f47c5343275", "scanner": "scanner-primary", "fingerprint": "507f3c56ec36650b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bee8c7e00fce2223", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/workspace-notes/WorkspaceNotesPanel.tsx:191"}, "properties": {"repobilityId": "5ae4b69e44ef19fe", "scanner": "scanner-primary", "fingerprint": "bee8c7e00fce2223", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9b86d8cca7ca71cb", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/modules/workspace-notes/WorkspaceNotesPanel.tsx:218"}, "properties": {"repobilityId": "acccf00c4fc4593f", "scanner": "scanner-primary", "fingerprint": "9b86d8cca7ca71cb", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-0d4bd6b3bb5d5449", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/prompt-templates/PromptTemplatesPanel.tsx:272"}, "properties": {"repobilityId": "1898927f717ace25", "scanner": "scanner-primary", "fingerprint": "0d4bd6b3bb5d5449", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fd696e0e69102d73", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/ml/MlStatusPill.tsx:55"}, "properties": {"repobilityId": "beee26f1bca75626", "scanner": "scanner-primary", "fingerprint": "fd696e0e69102d73", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7b142c4c570412fe", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/ml/MlPanel.tsx:164"}, "properties": {"repobilityId": "dd6a8bbc28f3fb90", "scanner": "scanner-primary", "fingerprint": "7b142c4c570412fe", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-08d9d2c01a0fde55", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/terminal/TerminalPane.tsx:196"}, "properties": {"repobilityId": "e106f8071565a6fc", "scanner": "scanner-primary", "fingerprint": "08d9d2c01a0fde55", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6eb751eee831fd6e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/modules/snippets/SnippetsPanel.tsx:133"}, "properties": {"repobilityId": "e2835be793e9b835", "scanner": "scanner-primary", "fingerprint": "6eb751eee831fd6e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fe6c690c06d3bc96", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/modules/snippets/codeSnippets.ts:41"}, "properties": {"repobilityId": "8528a8d4f0a9805e", "scanner": "scanner-primary", "fingerprint": "fe6c690c06d3bc96", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-876ba2661b9003db", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/markdown/MarkdownPreviewPane.tsx:110"}, "properties": {"repobilityId": "3e5442c75014af11", "scanner": "scanner-primary", "fingerprint": "876ba2661b9003db", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-175ca75a19c6bb2e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/ssh/SshPanel.tsx:197"}, "properties": {"repobilityId": "d3f1e6b3dffbb3bb", "scanner": "scanner-primary", "fingerprint": "175ca75a19c6bb2e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-265ca8e4bc536eb4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/ssh/SshKeyManager.tsx:200"}, "properties": {"repobilityId": "05d2ff7901347ef0", "scanner": "scanner-primary", "fingerprint": "265ca8e4bc536eb4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-661552f3e4c2ac86", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/python/PythonEnvPill.tsx:84"}, "properties": {"repobilityId": "88d989d8f62bfb05", "scanner": "scanner-primary", "fingerprint": "661552f3e4c2ac86", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-53a9f1923e538f4e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/share/SharePanel.tsx:236"}, "properties": {"repobilityId": "1b7f8b40be1f0079", "scanner": "scanner-primary", "fingerprint": "53a9f1923e538f4e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f0d69c4c5b7723e2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/git-history/GitHistoryPane.tsx:768"}, "properties": {"repobilityId": "735ef736214d290b", "scanner": "scanner-primary", "fingerprint": "f0d69c4c5b7723e2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d7e5b32f993ce0f7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/image-viewer/ImageViewerPane.tsx:148"}, "properties": {"repobilityId": "1b8bb96e204678c1", "scanner": "scanner-primary", "fingerprint": "d7e5b32f993ce0f7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-17e144a067f7ff8b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/editor/GitDiffPane.tsx:328"}, "properties": {"repobilityId": "cb123c351b26ee48", "scanner": "scanner-primary", "fingerprint": "17e144a067f7ff8b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d2fe3a003f263a2c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/editor/CodeActionDialog.tsx:232"}, "properties": {"repobilityId": "4826333598e1d589", "scanner": "scanner-primary", "fingerprint": "d2fe3a003f263a2c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e98f2bc05e009cd2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/editor/SymbolOutlinePanel.tsx:145"}, "properties": {"repobilityId": "c14ad6ccda16d153", "scanner": "scanner-primary", "fingerprint": "e98f2bc05e009cd2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-caabe8b7669307ab", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/editor/RenameDialog.tsx:227"}, "properties": {"repobilityId": "bf55dbd037f2d086", "scanner": "scanner-primary", "fingerprint": "caabe8b7669307ab", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-819157466e750d2a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/editor/NewEditorDialog.tsx:117"}, "properties": {"repobilityId": "e19176da324346d3", "scanner": "scanner-primary", "fingerprint": "819157466e750d2a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-183de84fadb7b65f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/symbol-search/SymbolSearchPanel.tsx:289"}, "properties": {"repobilityId": "25caa50f0f99e58a", "scanner": "scanner-primary", "fingerprint": "183de84fadb7b65f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-253456cb754b182e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/profiles/ProfilesPanel.tsx:256"}, "properties": {"repobilityId": "354b9fb187558cfb", "scanner": "scanner-primary", "fingerprint": "253456cb754b182e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9cbf4e922ea80dd6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/problems/ProblemsPanel.tsx:167"}, "properties": {"repobilityId": "967d1faf027e1db2", "scanner": "scanner-primary", "fingerprint": "9cbf4e922ea80dd6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d81519bbedc3fb04", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/source-control/WorktreeSection.tsx:168"}, "properties": {"repobilityId": "36d3ef7473c539ae", "scanner": "scanner-primary", "fingerprint": "d81519bbedc3fb04", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5174183feb0726d0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/source-control/ConflictSection.tsx:142"}, "properties": {"repobilityId": "01bea8f822668970", "scanner": "scanner-primary", "fingerprint": "5174183feb0726d0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-121736d95fc09fb0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/source-control/StashSection.tsx:238"}, "properties": {"repobilityId": "e7dfb61c0b288b80", "scanner": "scanner-primary", "fingerprint": "121736d95fc09fb0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-615968bbcc73fbb3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/source-control/SubmoduleSection.tsx:158"}, "properties": {"repobilityId": "881132d583ad5089", "scanner": "scanner-primary", "fingerprint": "615968bbcc73fbb3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b8c267a66a92cbe5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/source-control/SourceControlPanel.tsx:459"}, "properties": {"repobilityId": "9a2498716542700c", "scanner": "scanner-primary", "fingerprint": "b8c267a66a92cbe5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6fa6886c3b237087", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/ports/PortsPanel.tsx:238"}, "properties": {"repobilityId": "4621ddde4f2b3464", "scanner": "scanner-primary", "fingerprint": "6fa6886c3b237087", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0bee7c6d2cf3608f", "level": "warning", "message": {"text": "Privileged port 12 in use"}, "properties": {"repobilityId": "65e7eefa33f2def4", "scanner": "scanner-primary", "fingerprint": "0bee7c6d2cf3608f", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "test/config/test.yaml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-01f34abf36d69101", "level": "warning", "message": {"text": "Dockerfile runs as root: test/devops/Dockerfile"}, "properties": {"repobilityId": "3b7b1dddb83c4eb3", "scanner": "scanner-primary", "fingerprint": "01f34abf36d69101", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-807cd15e31ea1ceb", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: rust:${RUST_VERSION}-slim"}, "properties": {"repobilityId": "473f006ee294c04b", "scanner": "scanner-primary", "fingerprint": "807cd15e31ea1ceb", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "test/devops/Dockerfile"}, "region": {"startLine": 18}}}]}, {"ruleId": "scanner-807cd15e31ea1ceb", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: rust:${RUST_VERSION}-slim"}, "properties": {"repobilityId": "26db0f40f9c0889f", "scanner": "scanner-primary", "fingerprint": "807cd15e31ea1ceb", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "test/devops/Dockerfile"}, "region": {"startLine": 33}}}]}, {"ruleId": "scanner-ab70606b46ad9cf9", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:${NODE_VERSION}-alpine${ALPINE_VERSION}"}, "properties": {"repobilityId": "8c268fb2e6e856bd", "scanner": "scanner-primary", "fingerprint": "ab70606b46ad9cf9", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "test/devops/Dockerfile"}, "region": {"startLine": 62}}}]}, {"ruleId": "scanner-4e85f1690d347e18", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: alpine:${ALPINE_VERSION}"}, "properties": {"repobilityId": "2a61390c0e2d2651", "scanner": "scanner-primary", "fingerprint": "4e85f1690d347e18", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "test/devops/Dockerfile"}, "region": {"startLine": 85}}}]}, {"ruleId": "scanner-807cd15e31ea1ceb", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: rust:${RUST_VERSION}-slim"}, "properties": {"repobilityId": "0298dc471befb95a", "scanner": "scanner-primary", "fingerprint": "807cd15e31ea1ceb", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "test/devops/Dockerfile"}, "region": {"startLine": 159}}}]}, {"ruleId": "scanner-4e85f1690d347e18", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: alpine:${ALPINE_VERSION}"}, "properties": {"repobilityId": "827c6d45c89b1286", "scanner": "scanner-primary", "fingerprint": "4e85f1690d347e18", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "test/devops/Dockerfile"}, "region": {"startLine": 170}}}]}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"ruleId": "scanner-907da5878807ea90", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in src-tauri/src/modules/http_share.rs:224"}, "properties": {"repobilityId": "f64c761ad0f7c5fe", "scanner": "scanner-primary", "fingerprint": "907da5878807ea90", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src-tauri/src/modules/http_share.rs"}, "region": {"startLine": 224}}}]}, {"ruleId": "scanner-03c5ac81e5db8c60", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/WorkspaceSearch.tsx:351"}, "properties": {"repobilityId": "f8acac7477f832ad", "scanner": "scanner-primary", "fingerprint": "03c5ac81e5db8c60", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/WorkspaceSearch.tsx"}, "region": {"startLine": 351}}}]}, {"ruleId": "scanner-71f020fc9cdcc040", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/modules/workspace-notes/WorkspaceNotesPanel.tsx:218"}, "properties": {"repobilityId": "c77001eaa830e94f", "scanner": "scanner-primary", "fingerprint": "71f020fc9cdcc040", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/modules/workspace-notes/WorkspaceNotesPanel.tsx"}, "region": {"startLine": 218}}}]}, {"ruleId": "scanner-8a770e47416147fa", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in src/modules/terminal/lib/keymap.test.mjs:16"}, "properties": {"repobilityId": "b3609aae015b7d70", "scanner": "scanner-primary", "fingerprint": "8a770e47416147fa", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/modules/terminal/lib/keymap.test.mjs"}, "region": {"startLine": 16}}}]}, {"ruleId": "scanner-8aec621d5c1474ce", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in e2e/wdio.conf.ts:7"}, "properties": {"repobilityId": "d7dfeb3da1ffd59c", "scanner": "scanner-primary", "fingerprint": "8aec621d5c1474ce", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "e2e/wdio.conf.ts"}, "region": {"startLine": 7}}}]}, {"ruleId": "scanner-397ffb69fd282511", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "60858d49489d2071", "scanner": "scanner-primary", "fingerprint": "397ffb69fd282511", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/audit.yml"}, "region": {"startLine": 24}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "9e5617d449b061f6", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 24}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "4a63b1fd6887cae9", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 29}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ae83c03bfc0a4d34", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 65}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "7e761758ea56e585", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 69}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ae83c03bfc0a4d34", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 89}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "7e761758ea56e585", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 94}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ae83c03bfc0a4d34", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 118}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "7e761758ea56e585", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 121}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ae83c03bfc0a4d34", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 154}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "7e761758ea56e585", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 157}}}]}, {"ruleId": "scanner-46c644c6227e4d4a", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "9dfacdabb01880ef", "scanner": "scanner-primary", "fingerprint": "46c644c6227e4d4a", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release.yml"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-46c644c6227e4d4a", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "b28f2eb9ce3eea56", "scanner": "scanner-primary", "fingerprint": "46c644c6227e4d4a", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release.yml"}, "region": {"startLine": 31}}}]}, {"ruleId": "scanner-46c644c6227e4d4a", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "9e54fac6c290138e", "scanner": "scanner-primary", "fingerprint": "46c644c6227e4d4a", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release.yml"}, "region": {"startLine": 37}}}]}, {"ruleId": "scanner-46c644c6227e4d4a", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "a0f3bb36d11e757e", "scanner": "scanner-primary", "fingerprint": "46c644c6227e4d4a", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release.yml"}, "region": {"startLine": 40}}}]}, {"ruleId": "scanner-46c644c6227e4d4a", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "f0c3d4499b6cd885", "scanner": "scanner-primary", "fingerprint": "46c644c6227e4d4a", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release.yml"}, "region": {"startLine": 71}}}]}, {"ruleId": "scanner-1838a141491ce38c", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "b8fd4f5048f96576", "scanner": "scanner-primary", "fingerprint": "1838a141491ce38c", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-65c9bd56493a81d3", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "b74d4586a789d721", "scanner": "scanner-primary", "fingerprint": "65c9bd56493a81d3", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/e2e.yml"}, "region": {"startLine": 24}}}]}, {"ruleId": "scanner-65c9bd56493a81d3", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "0594fc417402ba44", "scanner": "scanner-primary", "fingerprint": "65c9bd56493a81d3", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/e2e.yml"}, "region": {"startLine": 29}}}]}, {"ruleId": "scanner-65c9bd56493a81d3", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "6c1a509e254502af", "scanner": "scanner-primary", "fingerprint": "65c9bd56493a81d3", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/e2e.yml"}, "region": {"startLine": 39}}}]}, {"ruleId": "scanner-65c9bd56493a81d3", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "348a2a2ba7979a8b", "scanner": "scanner-primary", "fingerprint": "65c9bd56493a81d3", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/e2e.yml"}, "region": {"startLine": 44}}}]}, {"ruleId": "scanner-7446b0561b7c27d5", "level": "note", "message": {"text": "Very large file: src/app/App.tsx (1815 lines)"}, "properties": {"repobilityId": "12615dbbb7692909", "scanner": "scanner-primary", "fingerprint": "7446b0561b7c27d5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "14dcda1e92138486", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-9d79c4077342a7d0", "level": "warning", "message": {"text": "Runtime service client appears to use placeholder configuration"}, "properties": {"repobilityId": "ce9594e49522964d", "scanner": "scanner-primary", "fingerprint": "9d79c4077342a7d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "runtime-config", "service-client", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "43ff2496ddd0e3a4", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "243ab08f17ac7990", "scanner": "scanner-primary", "fingerprint": "ea8f3013f588db25", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-8424db9c75e04ba4", "level": "none", "message": {"text": "Very short observed git history"}, "properties": {"repobilityId": "5ffca560cb976b60", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-1360164774b77e96", "level": "none", "message": {"text": "Commented-code block (10 lines) in vite.config.ts:59"}, "properties": {"repobilityId": "e34a6db37450fdc3", "scanner": "scanner-primary", "fingerprint": "1360164774b77e96", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-82896952bf8b9ce6", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/ai-elements/tool.tsx:130"}, "properties": {"repobilityId": "e50945486c9829dc", "scanner": "scanner-primary", "fingerprint": "82896952bf8b9ce6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9a9a657216644960", "level": "note", "message": {"text": "Legacy-named symbol `id_rsa_old` in src/modules/ai/lib/security.ts:52"}, "properties": {"repobilityId": "922bf408ffc15cbf", "scanner": "scanner-primary", "fingerprint": "9a9a657216644960", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-0c3b719a340241bb", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/modules/ai/lib/security.ts:87"}, "properties": {"repobilityId": "4e032f902b74c671", "scanner": "scanner-primary", "fingerprint": "0c3b719a340241bb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4ccd530d643d1c99", "level": "note", "message": {"text": "Legacy-named symbol `id_rsa_old` in src/modules/ai/lib/security.test.ts:53"}, "properties": {"repobilityId": "06eebbc38f1fa5dc", "scanner": "scanner-primary", "fingerprint": "4ccd530d643d1c99", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-190ad2823d08d662", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/modules/updater/useUpdater.ts:58"}, "properties": {"repobilityId": "1c38ea82bbc9f8e5", "scanner": "scanner-primary", "fingerprint": "190ad2823d08d662", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-247fb3af677371bc", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/modules/explorer/InlineInput.tsx:41"}, "properties": {"repobilityId": "833eeb6fa77bbaa5", "scanner": "scanner-primary", "fingerprint": "247fb3af677371bc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6c3a5958ac53b54a", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/modules/recent-files/RecentFilesPanel.tsx:40"}, "properties": {"repobilityId": "628277fd8f392acf", "scanner": "scanner-primary", "fingerprint": "6c3a5958ac53b54a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d3dcb513cc7be0b1", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/modules/preview/PreviewPane.tsx:112"}, "properties": {"repobilityId": "8be4924b4cfcc3cc", "scanner": "scanner-primary", "fingerprint": "d3dcb513cc7be0b1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d10c6abb80cd3277", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/modules/terminal/lib/rendererPool.ts:140"}, "properties": {"repobilityId": "44af3c5a3d375a86", "scanner": "scanner-primary", "fingerprint": "d10c6abb80cd3277", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-06242e53ae2c11b3", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/modules/git-history/lib/graph.ts:12"}, "properties": {"repobilityId": "d6884163a202027e", "scanner": "scanner-primary", "fingerprint": "06242e53ae2c11b3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-947165dafa42310a", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/modules/editor/GitDiffPane.tsx:273"}, "properties": {"repobilityId": "41d8dcb724ca4589", "scanner": "scanner-primary", "fingerprint": "947165dafa42310a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-60f4b2979bb815ad", "level": "none", "message": {"text": "Commented-code block (32 lines) in src/modules/editor/AiDiffPane.tsx:39"}, "properties": {"repobilityId": "e3955b4bbf44fcfa", "scanner": "scanner-primary", "fingerprint": "60f4b2979bb815ad", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ce1d3d4e3a1c5ecc", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/modules/editor/lib/linting.ts:63"}, "properties": {"repobilityId": "a19d8e60047eaa00", "scanner": "scanner-primary", "fingerprint": "ce1d3d4e3a1c5ecc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-91c50c11249ecbda", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/modules/editor/lib/autocomplete/prompt.ts:63"}, "properties": {"repobilityId": "e1709795d1206b07", "scanner": "scanner-primary", "fingerprint": "91c50c11249ecbda", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-319e66a630e14977", "level": "none", "message": {"text": "2 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "d838d1fc5d8231c9", "scanner": "scanner-primary", "fingerprint": "319e66a630e14977", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "608bc2da69176547", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "9f3120b75a188a07", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "74ea670dc885109c", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "536dae73edb35845", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "3c51a87ff9e95ae9", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "16d75972a2911ce2", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "b3e09f0e409a985c", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}]}]}