{"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-bead75b0f9233e05", "name": "No API endpoints detected", "shortDescription": {"text": "No API endpoints detected"}, "fullDescription": {"text": "The scanner did not find FastAPI/Flask/Express/NestJS/GraphQL/gRPC routes. If this repo exposes APIs, the framework may be unsupported."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a4d924f41d7d1c3c", "name": "Stray `console.log` in TS/JS \u2014 scripts/migrate.ts:57", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate.ts:57"}, "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-dc5741d5b9d8132f", "name": "Stray `console.log` in TS/JS \u2014 src/instrumentation.ts:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/instrumentation.ts:9"}, "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-8cb1ba5aafc26166", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/agent/[id]/page.tsx:497", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/agent/[id]/page.tsx:497"}, "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-72648bf9c2fb8f2e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/agents/wizard/framework-step.tsx:136", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/agents/wizard/framework-step.tsx:136"}, "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-bf0c6583b0738f66", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/agents/wizard/summary-step.tsx:109", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/agents/wizard/summary-step.tsx:109"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5e72a4f9fd898355", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/app-shell.tsx:437", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/app-shell.tsx:437"}, "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-0644785203fe3771", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/ui-cards.tsx:297", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/ui-cards.tsx:297"}, "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-d8251251834acf4c", "name": "TODO/FIXME marker in shipping code \u2014 src/components/mission-control/ui-cards.tsx:442", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/components/mission-control/ui-cards.tsx:442"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fd6b015a84eb1623", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/agents-filter-popover.tsx:157", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/agents-filter-popover.tsx:157"}, "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-aa96c93d87498548", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/kill-confirm-modal.tsx:334", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/kill-confirm-modal.tsx:334"}, "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-394985f81e7f1daf", "name": "Stray `console.log` in TS/JS \u2014 src/components/mission-control/kill-confirm-modal.tsx:76", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/mission-control/kill-confirm-modal.tsx:76"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-abb5521c1183a16a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/kit-extras.tsx:98", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/kit-extras.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-138e306cf52c7071", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/arkonos.tsx:485", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/arkonos.tsx:485"}, "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-cb99b7ad8f2b5c5d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/command-palette.tsx:223", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/command-palette.tsx:223"}, "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-21b527706a5b227a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/client-dashboard.tsx:148", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/client-dashboard.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-b6507a0971b36c6d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/active-run-banner.tsx:146", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/active-run-banner.tsx:146"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-46dc8755786854f4", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/costs.tsx:1005", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/costs.tsx:1005"}, "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-f619f28c37800464", "name": "React Flow <MiniMap> without dark background \u2014 src/components/mission-control/infrastructure.tsx:744", "shortDescription": {"text": "React Flow <MiniMap> without dark background \u2014 src/components/mission-control/infrastructure.tsx:744"}, "fullDescription": {"text": "A bare <MiniMap> renders with the vendor's white default in dark themes. Wrap the canvas in a class that overrides `.react-flow__minimap` background, or pass an explicit `style`/`maskColor`/`bgColor`.\n\nWhy: P1 in CHECKLIST.md \u2014 vendor defaults bleed light through.\nRule id: fq.minimap.no-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c8cc26be089fb86f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/client-shell.tsx:79", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/client-shell.tsx:79"}, "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-e859d5541bbe123e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/floating-kill-switch.tsx:185", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/floating-kill-switch.tsx:185"}, "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-f40ef0cca2e8e715", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/security.tsx:788", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/security.tsx:788"}, "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-945b47a5c3888a8a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/fleet.tsx:227", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/fleet.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-9c894a70e49c43c2", "name": "Icon-only button without accessible name \u2014 src/components/mission-control/intake.tsx:133", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/mission-control/intake.tsx:133"}, "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-a74f37016191aa6b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/workflows.tsx:540", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/workflows.tsx:540"}, "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-7a41fddaf0167e82", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/quick-kill-dialog.tsx:108", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/quick-kill-dialog.tsx:108"}, "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-38c4ab082450dc7e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/incidents.tsx:273", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/incidents.tsx:273"}, "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-b1f1b360fe60595c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/dashboard.tsx:357", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/dashboard.tsx:357"}, "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-0357148934b3f604", "name": "TODO/FIXME marker in shipping code \u2014 src/components/mission-control/dashboard.tsx:570", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/components/mission-control/dashboard.tsx:570"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-586b7a31e0d2b67a", "name": "React Flow <Controls> without dark theming \u2014 src/components/mission-control/workflow-builder.tsx:659", "shortDescription": {"text": "React Flow <Controls> without dark theming \u2014 src/components/mission-control/workflow-builder.tsx:659"}, "fullDescription": {"text": "`<Controls>` ships with white buttons. Override `.react-flow__controls` and `.react-flow__controls-button` in your stylesheet or pass a styled wrapper.\n\nWhy: P1 in CHECKLIST.md \u2014 vendor defaults bleed light through.\nRule id: fq.controls.no-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5f96a92cf955cde5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/workflow-builder.tsx:144", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/workflow-builder.tsx:144"}, "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-cb23184edc1e0255", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/crons.tsx:177", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/crons.tsx:177"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c1c053b61459d9b2", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/tenant-switcher.tsx:75", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/tenant-switcher.tsx:75"}, "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-6dca424e38181547", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/mcp-gateway.tsx:183", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/mcp-gateway.tsx:183"}, "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-3436138202da807e", "name": "Icon-only button without accessible name \u2014 src/components/mission-control/mcp.tsx:373", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/mission-control/mcp.tsx:373"}, "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-aceb21314f7b4945", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/mcp.tsx:156", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/mcp.tsx:156"}, "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-548080a677c095b7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/agent-drawer-detail.tsx:82", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/agent-drawer-detail.tsx:82"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-27c5189a3b17f0f3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/tools.tsx:1115", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/tools.tsx:1115"}, "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-744139c535a9d54a", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/mission-control/tools.tsx:740", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/mission-control/tools.tsx:740"}, "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-945bfbcb9c31463f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/mobile-kill-bar.tsx:49", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/mobile-kill-bar.tsx:49"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5166ee5ea64d9c5e", "name": "Stray `console.log` in TS/JS \u2014 src/lib/active-runs.ts:93", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/active-runs.ts:93"}, "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-dbe0bfedd6ae32ac", "name": "Stray `console.log` in TS/JS \u2014 src/lib/workflow-engine.ts:240", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/workflow-engine.ts:240"}, "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-07b2f31365e4abdc", "name": "Stray `console.log` in TS/JS \u2014 src/lib/workflow-scheduler.ts:151", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/workflow-scheduler.ts:151"}, "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-5bea7d0cad4c0a77", "name": "Custom React Flow node registered without explicit width/height \u2014 src/lib/workflow-engine.test.ts:80", "shortDescription": {"text": "Custom React Flow node registered without explicit width/height \u2014 src/lib/workflow-engine.test.ts:80"}, "fullDescription": {"text": "When you register a custom node type via `nodeTypes`, the RFNode object you build must include `width` and `height` props. Without them, MiniMap renders ZERO mini-nodes for that type and `fitView` underestimates the bounds (cuts off lane labels, etc.). Add `width: \u2026, height: \u2026` to the node object. See P-I.\n\nWhy: P-I in CHECKLIST.md \u2014 RF MiniMap + fitView need explicit dims on custom nodes.\nRule id: fq.rfnode.no-dims"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8987d6d1c30c7202", "name": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f69dc147ad508713", "name": "Insecure pattern 'cors_wildcard' in src/app/api/intake/route.ts:7", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in src/app/api/intake/route.ts:7"}, "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-4d83980cda91b724", "name": "Insecure pattern 'node_child_process' in src/app/api/gateway/restart-gateway/route.ts:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in src/app/api/gateway/restart-gateway/route.ts:2"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-815febf7eac6a343", "name": "Insecure pattern 'node_child_process' in src/app/api/gateway/stop-gateway/route.ts:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in src/app/api/gateway/stop-gateway/route.ts:2"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-eca9303df57df45a", "name": "Insecure pattern 'node_child_process' in src/app/api/gateway/kill-agent/route.ts:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in src/app/api/gateway/kill-agent/route.ts:2"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f570b09e9e08c23b", "name": "Insecure pattern 'node_child_process' in src/app/api/gateway/probe/route.ts:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in src/app/api/gateway/probe/route.ts:2"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-594406a0d4912665", "name": "Insecure pattern 'node_child_process' in src/app/api/infra/collect/route.ts:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in src/app/api/infra/collect/route.ts:2"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-38a90d4477fc34be", "name": "Insecure pattern 'node_child_process' in src/app/api/infra/nodes/[id]/action/route.ts:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in src/app/api/infra/nodes/[id]/action/route.ts:2"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5a6057d01e5f5a3b", "name": "Insecure pattern 'local_storage_auth_token' in src/components/mission-control/app-shell.tsx:414", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in src/components/mission-control/app-shell.tsx:414"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ba86f244cc186be7", "name": "Insecure pattern 'local_storage_auth_token' in src/components/mission-control/client-shell.tsx:59", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in src/components/mission-control/client-shell.tsx:59"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9f2afe137a285f9e", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/mission-control/tools.tsx:740", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/mission-control/tools.tsx:740"}, "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-03fe95db52dda571", "name": "Possible secret in src/lib/threat-scanner.test.ts", "shortDescription": {"text": "Possible secret in src/lib/threat-scanner.test.ts"}, "fullDescription": {"text": "Detected pattern matching github_token. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-f8cdfffd70600cb1", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-358a90e37ac3a91e", "name": "Very large file: src/components/mission-control/costs.tsx (1777 lines)", "shortDescription": {"text": "Very large file: src/components/mission-control/costs.tsx (1777 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-d3bac5dd5ef78413", "name": "Very large file: src/components/mission-control/workflows.tsx (1182 lines)", "shortDescription": {"text": "Very large file: src/components/mission-control/workflows.tsx (1182 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-01e8649e33fa8df0", "name": "Very large file: src/components/mission-control/dashboard.tsx (2058 lines)", "shortDescription": {"text": "Very large file: src/components/mission-control/dashboard.tsx (2058 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-013e99f28468ed0d", "name": "Very large file: src/components/mission-control/tools.tsx (1400 lines)", "shortDescription": {"text": "Very large file: src/components/mission-control/tools.tsx (1400 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-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 44 console/debugger/print-style debug statements in non-test source. This is a common fast-generation residue before production cleanup."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 164 placeholder/mock markers across 34 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0b94d2ff69d92897", "name": "Commented-code block (5 lines) in next.config.ts:8", "shortDescription": {"text": "Commented-code block (5 lines) in next.config.ts:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7df6619b2d69f5bf", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/agents/add/page.tsx:28", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/agents/add/page.tsx:28"}, "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-fef192f8000e9647", "name": "Legacy-named symbol `audit_log_v2` in src/app/api/health/route.ts:67", "shortDescription": {"text": "Legacy-named symbol `audit_log_v2` in src/app/api/health/route.ts:67"}, "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-bd2b55cb5c40efd0", "name": "Legacy-named symbol `audit_log_v2` in src/app/api/audit/route.ts:73", "shortDescription": {"text": "Legacy-named symbol `audit_log_v2` in src/app/api/audit/route.ts:73"}, "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-a9bf0cc773fa29a8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/gateway/probe/route.ts:400", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/gateway/probe/route.ts:400"}, "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-2e459d29da248c39", "name": "Commented-code block (6 lines) in src/app/api/fleet/agents/route.ts:106", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/fleet/agents/route.ts:106"}, "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-ef0329484058add1", "name": "Commented-code block (5 lines) in src/app/api/mcp/proxy/[serverId]/route.ts:276", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/mcp/proxy/[serverId]/route.ts:276"}, "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-620c35b5ad6a3559", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/traces/page.tsx:101", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/traces/page.tsx:101"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-573ba227c246fc48", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/use-active-runs.ts:106", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/use-active-runs.ts:106"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-741fb4f38161f3d6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/agents/wizard/address-step.tsx:37", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/agents/wizard/address-step.tsx:37"}, "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-b2d0233933806d84", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/agents/wizard/test-step.tsx:49", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/agents/wizard/test-step.tsx:49"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d5b4cac81bb46bad", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/agents/wizard/emergency-step.tsx:39", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/agents/wizard/emergency-step.tsx:39"}, "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-5f5ad9e181294321", "name": "Commented-code block (7 lines) in src/components/mission-control/app-shell.tsx:149", "shortDescription": {"text": "Commented-code block (7 lines) in src/components/mission-control/app-shell.tsx:149"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-25c96b2b77b90a36", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/mission-control/service-worker-registration.tsx:34", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/mission-control/service-worker-registration.tsx:34"}, "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-a44e7c27a2e75a4e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/mission-control/api.ts:123", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/mission-control/api.ts:123"}, "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-9b65de9eb444e7d6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/mission-control/arkonos.tsx:128", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/mission-control/arkonos.tsx:128"}, "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-51131accae2dfa06", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/mission-control/command-palette.tsx:110", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/mission-control/command-palette.tsx:110"}, "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-5b2c1b4784a62a1d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/mission-control/journal.tsx:54", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/mission-control/journal.tsx:54"}, "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-a83f43ebb0b376b1", "name": "Commented-code block (5 lines) in src/components/mission-control/charts.tsx:169", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/mission-control/charts.tsx:169"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1a8df84aef18eb60", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/mission-control/costs.tsx:97", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/mission-control/costs.tsx:97"}, "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-ccda30dd4e5da21b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/mission-control/compliance.tsx:224", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/mission-control/compliance.tsx:224"}, "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-c2cd219cb395b55c", "name": "Commented-code block (6 lines) in src/components/mission-control/integrations.tsx:93", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/mission-control/integrations.tsx:93"}, "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-ba4a7599cc244e9e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/mission-control/benchmarks.tsx:67", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/mission-control/benchmarks.tsx:67"}, "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-1eaf874d99d7d901", "name": "Commented-code block (6 lines) in src/lib/workflow-engine.ts:122", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/workflow-engine.ts:122"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c3c04da65056635a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/workflow-engine.ts:159", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/workflow-engine.ts:159"}, "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-0a0a12ea474cd55f", "name": "Commented-code block (8 lines) in src/lib/exfil-guard.ts:56", "shortDescription": {"text": "Commented-code block (8 lines) in src/lib/exfil-guard.ts:56"}, "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-4a2acc1d92f393e6", "name": "Legacy-named symbol `audit_log_v2` in src/lib/audit.ts:19", "shortDescription": {"text": "Legacy-named symbol `audit_log_v2` in src/lib/audit.ts:19"}, "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-4bced875e6cf1f05", "name": "`fetch()` without try/.catch or AbortSignal \u2014 public/sw.js:84", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 public/sw.js:84"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-39f8ebfe57a6f60f", "name": "35 env vars used in code but missing from .env.example", "shortDescription": {"text": "35 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ALERT_GATEWAY_TOKEN`, `ALERT_GATEWAY_URL`, `ALERT_MIN_LEVEL`, `ALERT_TELEGRAM_BOT_TOKEN`, `ALERT_TELEGRAM_CHAT_ID`, `ARKON_ALLOW_MAGIC_LINK_DEBUG_URL`, `CI`, `CRON_SECRET` + 27 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\ntools/discord-journal-bot/bot.py:tasks_cmd, tools/discord-journal-bot/bot.py:done_cmd\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/24305"}, "properties": {"repository": "arkon-ai/arkon", "repoUrl": "https://github.com/arkon-ai/arkon", "branch": "main"}, "results": [{"ruleId": "scanner-bead75b0f9233e05", "level": "none", "message": {"text": "No API endpoints detected"}, "properties": {"repobilityId": "0f8bb852027c38f8", "scanner": "scanner-primary", "fingerprint": "bead75b0f9233e05", "layer": "api", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-a4d924f41d7d1c3c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate.ts:57"}, "properties": {"repobilityId": "886ea65b2e117422", "scanner": "scanner-primary", "fingerprint": "a4d924f41d7d1c3c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-dc5741d5b9d8132f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/instrumentation.ts:9"}, "properties": {"repobilityId": "1791378cdc59d011", "scanner": "scanner-primary", "fingerprint": "dc5741d5b9d8132f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8cb1ba5aafc26166", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/agent/[id]/page.tsx:497"}, "properties": {"repobilityId": "71fcf0a072d3ee92", "scanner": "scanner-primary", "fingerprint": "8cb1ba5aafc26166", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-72648bf9c2fb8f2e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/agents/wizard/framework-step.tsx:136"}, "properties": {"repobilityId": "a45c1686c20b1d25", "scanner": "scanner-primary", "fingerprint": "72648bf9c2fb8f2e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bf0c6583b0738f66", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/agents/wizard/summary-step.tsx:109"}, "properties": {"repobilityId": "c16dd8391ac4dca3", "scanner": "scanner-primary", "fingerprint": "bf0c6583b0738f66", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5e72a4f9fd898355", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/app-shell.tsx:437"}, "properties": {"repobilityId": "9c85511894abab28", "scanner": "scanner-primary", "fingerprint": "5e72a4f9fd898355", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0644785203fe3771", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/ui-cards.tsx:297"}, "properties": {"repobilityId": "88a0d09c9be67ac1", "scanner": "scanner-primary", "fingerprint": "0644785203fe3771", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d8251251834acf4c", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/components/mission-control/ui-cards.tsx:442"}, "properties": {"repobilityId": "f18ed62fa1737d43", "scanner": "scanner-primary", "fingerprint": "d8251251834acf4c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-fd6b015a84eb1623", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/agents-filter-popover.tsx:157"}, "properties": {"repobilityId": "834c2d920527d9c5", "scanner": "scanner-primary", "fingerprint": "fd6b015a84eb1623", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-aa96c93d87498548", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/kill-confirm-modal.tsx:334"}, "properties": {"repobilityId": "6cb718e52ffe21ea", "scanner": "scanner-primary", "fingerprint": "aa96c93d87498548", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-394985f81e7f1daf", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/mission-control/kill-confirm-modal.tsx:76"}, "properties": {"repobilityId": "096a3ffe4b88845e", "scanner": "scanner-primary", "fingerprint": "394985f81e7f1daf", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-abb5521c1183a16a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/kit-extras.tsx:98"}, "properties": {"repobilityId": "528a6cfcbf29466a", "scanner": "scanner-primary", "fingerprint": "abb5521c1183a16a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-138e306cf52c7071", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/arkonos.tsx:485"}, "properties": {"repobilityId": "cdcc2f1ec4a75f3e", "scanner": "scanner-primary", "fingerprint": "138e306cf52c7071", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cb99b7ad8f2b5c5d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/command-palette.tsx:223"}, "properties": {"repobilityId": "2d215f6c0ab0298d", "scanner": "scanner-primary", "fingerprint": "cb99b7ad8f2b5c5d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-21b527706a5b227a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/client-dashboard.tsx:148"}, "properties": {"repobilityId": "f0c59b29d87afb37", "scanner": "scanner-primary", "fingerprint": "21b527706a5b227a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b6507a0971b36c6d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/active-run-banner.tsx:146"}, "properties": {"repobilityId": "f30e2a18c604e6e8", "scanner": "scanner-primary", "fingerprint": "b6507a0971b36c6d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-46dc8755786854f4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/costs.tsx:1005"}, "properties": {"repobilityId": "e8af7cf2a601a466", "scanner": "scanner-primary", "fingerprint": "46dc8755786854f4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f619f28c37800464", "level": "note", "message": {"text": "React Flow <MiniMap> without dark background \u2014 src/components/mission-control/infrastructure.tsx:744"}, "properties": {"repobilityId": "8ee07254173cb7e4", "scanner": "scanner-primary", "fingerprint": "f619f28c37800464", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.minimap.no-bg"]}}, {"ruleId": "scanner-c8cc26be089fb86f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/client-shell.tsx:79"}, "properties": {"repobilityId": "6aa9b99c8b79fbe0", "scanner": "scanner-primary", "fingerprint": "c8cc26be089fb86f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e859d5541bbe123e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/floating-kill-switch.tsx:185"}, "properties": {"repobilityId": "7fbece221d152203", "scanner": "scanner-primary", "fingerprint": "e859d5541bbe123e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f40ef0cca2e8e715", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/security.tsx:788"}, "properties": {"repobilityId": "4cd3afc249b8583c", "scanner": "scanner-primary", "fingerprint": "f40ef0cca2e8e715", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-945b47a5c3888a8a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/fleet.tsx:227"}, "properties": {"repobilityId": "85b11a34a46db402", "scanner": "scanner-primary", "fingerprint": "945b47a5c3888a8a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9c894a70e49c43c2", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/mission-control/intake.tsx:133"}, "properties": {"repobilityId": "60fbd1d77029456d", "scanner": "scanner-primary", "fingerprint": "9c894a70e49c43c2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-a74f37016191aa6b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/workflows.tsx:540"}, "properties": {"repobilityId": "23aa19963f4f7372", "scanner": "scanner-primary", "fingerprint": "a74f37016191aa6b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7a41fddaf0167e82", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/quick-kill-dialog.tsx:108"}, "properties": {"repobilityId": "64c206516dda155f", "scanner": "scanner-primary", "fingerprint": "7a41fddaf0167e82", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-38c4ab082450dc7e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/incidents.tsx:273"}, "properties": {"repobilityId": "016e2e1a2e352529", "scanner": "scanner-primary", "fingerprint": "38c4ab082450dc7e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b1f1b360fe60595c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/dashboard.tsx:357"}, "properties": {"repobilityId": "b6c048e5d9b21d16", "scanner": "scanner-primary", "fingerprint": "b1f1b360fe60595c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0357148934b3f604", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/components/mission-control/dashboard.tsx:570"}, "properties": {"repobilityId": "6a22fca5b2ad20c4", "scanner": "scanner-primary", "fingerprint": "0357148934b3f604", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-586b7a31e0d2b67a", "level": "note", "message": {"text": "React Flow <Controls> without dark theming \u2014 src/components/mission-control/workflow-builder.tsx:659"}, "properties": {"repobilityId": "d401d84b7454c95f", "scanner": "scanner-primary", "fingerprint": "586b7a31e0d2b67a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.controls.no-bg"]}}, {"ruleId": "scanner-5f96a92cf955cde5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/workflow-builder.tsx:144"}, "properties": {"repobilityId": "0c52cae38c5863ed", "scanner": "scanner-primary", "fingerprint": "5f96a92cf955cde5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cb23184edc1e0255", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/crons.tsx:177"}, "properties": {"repobilityId": "4fd18220ca8baaa9", "scanner": "scanner-primary", "fingerprint": "cb23184edc1e0255", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c1c053b61459d9b2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/tenant-switcher.tsx:75"}, "properties": {"repobilityId": "d76084f56e8886f2", "scanner": "scanner-primary", "fingerprint": "c1c053b61459d9b2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6dca424e38181547", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/mcp-gateway.tsx:183"}, "properties": {"repobilityId": "0a9c8cd8d1d3ff42", "scanner": "scanner-primary", "fingerprint": "6dca424e38181547", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3436138202da807e", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/mission-control/mcp.tsx:373"}, "properties": {"repobilityId": "68755f57d98b559a", "scanner": "scanner-primary", "fingerprint": "3436138202da807e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-aceb21314f7b4945", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/mcp.tsx:156"}, "properties": {"repobilityId": "ea65b282381ffb43", "scanner": "scanner-primary", "fingerprint": "aceb21314f7b4945", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-548080a677c095b7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/agent-drawer-detail.tsx:82"}, "properties": {"repobilityId": "01b45562b9bd7162", "scanner": "scanner-primary", "fingerprint": "548080a677c095b7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-27c5189a3b17f0f3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/tools.tsx:1115"}, "properties": {"repobilityId": "941bfb3a9f4cd4ee", "scanner": "scanner-primary", "fingerprint": "27c5189a3b17f0f3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-744139c535a9d54a", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/mission-control/tools.tsx:740"}, "properties": {"repobilityId": "ffa831d9da8308e7", "scanner": "scanner-primary", "fingerprint": "744139c535a9d54a", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-945bfbcb9c31463f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mission-control/mobile-kill-bar.tsx:49"}, "properties": {"repobilityId": "31f781c2548ea5bf", "scanner": "scanner-primary", "fingerprint": "945bfbcb9c31463f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5166ee5ea64d9c5e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/active-runs.ts:93"}, "properties": {"repobilityId": "e360f9311974144b", "scanner": "scanner-primary", "fingerprint": "5166ee5ea64d9c5e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-dbe0bfedd6ae32ac", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/workflow-engine.ts:240"}, "properties": {"repobilityId": "876bae5ce7e6a6b5", "scanner": "scanner-primary", "fingerprint": "dbe0bfedd6ae32ac", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-07b2f31365e4abdc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/workflow-scheduler.ts:151"}, "properties": {"repobilityId": "760e9469c8f24244", "scanner": "scanner-primary", "fingerprint": "07b2f31365e4abdc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5bea7d0cad4c0a77", "level": "warning", "message": {"text": "Custom React Flow node registered without explicit width/height \u2014 src/lib/workflow-engine.test.ts:80"}, "properties": {"repobilityId": "c4e2fbe67cc9330a", "scanner": "scanner-primary", "fingerprint": "5bea7d0cad4c0a77", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.rfnode.no-dims"]}}, {"ruleId": "scanner-8987d6d1c30c7202", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "properties": {"repobilityId": "d6fd15736272b050", "scanner": "scanner-primary", "fingerprint": "8987d6d1c30c7202", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-8987d6d1c30c7202", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "properties": {"repobilityId": "fc81a3ec28b1285e", "scanner": "scanner-primary", "fingerprint": "8987d6d1c30c7202", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 9}}}]}, {"ruleId": "scanner-8987d6d1c30c7202", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "properties": {"repobilityId": "6c301d833f94dff8", "scanner": "scanner-primary", "fingerprint": "8987d6d1c30c7202", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-f69dc147ad508713", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in src/app/api/intake/route.ts:7"}, "properties": {"repobilityId": "a8f4bc22dabbc5c2", "scanner": "scanner-primary", "fingerprint": "f69dc147ad508713", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/api/intake/route.ts"}, "region": {"startLine": 7}}}]}, {"ruleId": "scanner-4d83980cda91b724", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in src/app/api/gateway/restart-gateway/route.ts:2"}, "properties": {"repobilityId": "80bd5751d837e53f", "scanner": "scanner-primary", "fingerprint": "4d83980cda91b724", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/api/gateway/restart-gateway/route.ts"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-815febf7eac6a343", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in src/app/api/gateway/stop-gateway/route.ts:2"}, "properties": {"repobilityId": "335e71d1c57cffdf", "scanner": "scanner-primary", "fingerprint": "815febf7eac6a343", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/api/gateway/stop-gateway/route.ts"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-eca9303df57df45a", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in src/app/api/gateway/kill-agent/route.ts:2"}, "properties": {"repobilityId": "e72e3930317221d4", "scanner": "scanner-primary", "fingerprint": "eca9303df57df45a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/api/gateway/kill-agent/route.ts"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-f570b09e9e08c23b", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in src/app/api/gateway/probe/route.ts:2"}, "properties": {"repobilityId": "fa0bc8a2c875382b", "scanner": "scanner-primary", "fingerprint": "f570b09e9e08c23b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/api/gateway/probe/route.ts"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-594406a0d4912665", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in src/app/api/infra/collect/route.ts:2"}, "properties": {"repobilityId": "f43c31b9d60b2086", "scanner": "scanner-primary", "fingerprint": "594406a0d4912665", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/api/infra/collect/route.ts"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-38a90d4477fc34be", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in src/app/api/infra/nodes/[id]/action/route.ts:2"}, "properties": {"repobilityId": "300ebb9f82f26a37", "scanner": "scanner-primary", "fingerprint": "38a90d4477fc34be", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/api/infra/nodes/[id]/action/route.ts"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-5a6057d01e5f5a3b", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in src/components/mission-control/app-shell.tsx:414"}, "properties": {"repobilityId": "c0e60f73ede15d71", "scanner": "scanner-primary", "fingerprint": "5a6057d01e5f5a3b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/mission-control/app-shell.tsx"}, "region": {"startLine": 414}}}]}, {"ruleId": "scanner-ba86f244cc186be7", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in src/components/mission-control/client-shell.tsx:59"}, "properties": {"repobilityId": "9b953239b6cd1d20", "scanner": "scanner-primary", "fingerprint": "ba86f244cc186be7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/mission-control/client-shell.tsx"}, "region": {"startLine": 59}}}]}, {"ruleId": "scanner-9f2afe137a285f9e", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/mission-control/tools.tsx:740"}, "properties": {"repobilityId": "602ccc46c0a93747", "scanner": "scanner-primary", "fingerprint": "9f2afe137a285f9e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/mission-control/tools.tsx"}, "region": {"startLine": 740}}}]}, {"ruleId": "scanner-03fe95db52dda571", "level": "error", "message": {"text": "Possible secret in src/lib/threat-scanner.test.ts"}, "properties": {"repobilityId": "81b3aecb9abdedcd", "scanner": "scanner-primary", "fingerprint": "03fe95db52dda571", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/threat-scanner.test.ts"}, "region": {"startLine": 71}}}]}, {"ruleId": "scanner-f8cdfffd70600cb1", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "6dceb4e4bc113aab", "scanner": "scanner-primary", "fingerprint": "f8cdfffd70600cb1", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/playwright.yml"}, "region": {"startLine": 42}}}]}, {"ruleId": "scanner-f8cdfffd70600cb1", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "30b6d4ff20a5afff", "scanner": "scanner-primary", "fingerprint": "f8cdfffd70600cb1", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/playwright.yml"}, "region": {"startLine": 45}}}]}, {"ruleId": "scanner-f8cdfffd70600cb1", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "6531e16af1d99538", "scanner": "scanner-primary", "fingerprint": "f8cdfffd70600cb1", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/playwright.yml"}, "region": {"startLine": 78}}}]}, {"ruleId": "scanner-358a90e37ac3a91e", "level": "note", "message": {"text": "Very large file: src/components/mission-control/costs.tsx (1777 lines)"}, "properties": {"repobilityId": "6b75d2b754a4a245", "scanner": "scanner-primary", "fingerprint": "358a90e37ac3a91e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d3bac5dd5ef78413", "level": "note", "message": {"text": "Very large file: src/components/mission-control/workflows.tsx (1182 lines)"}, "properties": {"repobilityId": "d989ed0e695c5f6b", "scanner": "scanner-primary", "fingerprint": "d3bac5dd5ef78413", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-01e8649e33fa8df0", "level": "note", "message": {"text": "Very large file: src/components/mission-control/dashboard.tsx (2058 lines)"}, "properties": {"repobilityId": "e6355d4628aff36c", "scanner": "scanner-primary", "fingerprint": "01e8649e33fa8df0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-013e99f28468ed0d", "level": "note", "message": {"text": "Very large file: src/components/mission-control/tools.tsx (1400 lines)"}, "properties": {"repobilityId": "5df42404efc62fd4", "scanner": "scanner-primary", "fingerprint": "013e99f28468ed0d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "8e4e89660bfe59b6", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "1be1f07c2cc2cb0c", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "f6a59a5fd5e65f30", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-0b94d2ff69d92897", "level": "none", "message": {"text": "Commented-code block (5 lines) in next.config.ts:8"}, "properties": {"repobilityId": "cae308964a2601b1", "scanner": "scanner-primary", "fingerprint": "0b94d2ff69d92897", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7df6619b2d69f5bf", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/agents/add/page.tsx:28"}, "properties": {"repobilityId": "080aa61ecbf26a71", "scanner": "scanner-primary", "fingerprint": "7df6619b2d69f5bf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fef192f8000e9647", "level": "note", "message": {"text": "Legacy-named symbol `audit_log_v2` in src/app/api/health/route.ts:67"}, "properties": {"repobilityId": "05d4921f3b2ab482", "scanner": "scanner-primary", "fingerprint": "fef192f8000e9647", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-bd2b55cb5c40efd0", "level": "note", "message": {"text": "Legacy-named symbol `audit_log_v2` in src/app/api/audit/route.ts:73"}, "properties": {"repobilityId": "08aaea3cb0c39bc8", "scanner": "scanner-primary", "fingerprint": "bd2b55cb5c40efd0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a9bf0cc773fa29a8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/gateway/probe/route.ts:400"}, "properties": {"repobilityId": "589a2625b4f9c31d", "scanner": "scanner-primary", "fingerprint": "a9bf0cc773fa29a8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2e459d29da248c39", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/fleet/agents/route.ts:106"}, "properties": {"repobilityId": "5e156fd38bc023d5", "scanner": "scanner-primary", "fingerprint": "2e459d29da248c39", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ef0329484058add1", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/mcp/proxy/[serverId]/route.ts:276"}, "properties": {"repobilityId": "d10736e5cd49bdfb", "scanner": "scanner-primary", "fingerprint": "ef0329484058add1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-620c35b5ad6a3559", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/traces/page.tsx:101"}, "properties": {"repobilityId": "b5d8adb83f70616e", "scanner": "scanner-primary", "fingerprint": "620c35b5ad6a3559", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-573ba227c246fc48", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/use-active-runs.ts:106"}, "properties": {"repobilityId": "dd69b7add158247c", "scanner": "scanner-primary", "fingerprint": "573ba227c246fc48", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-741fb4f38161f3d6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/agents/wizard/address-step.tsx:37"}, "properties": {"repobilityId": "7906c6028c781845", "scanner": "scanner-primary", "fingerprint": "741fb4f38161f3d6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b2d0233933806d84", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/agents/wizard/test-step.tsx:49"}, "properties": {"repobilityId": "594156e5024313da", "scanner": "scanner-primary", "fingerprint": "b2d0233933806d84", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d5b4cac81bb46bad", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/agents/wizard/emergency-step.tsx:39"}, "properties": {"repobilityId": "fe148a753e0e38d3", "scanner": "scanner-primary", "fingerprint": "d5b4cac81bb46bad", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5f5ad9e181294321", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/components/mission-control/app-shell.tsx:149"}, "properties": {"repobilityId": "790b4e74e6e10271", "scanner": "scanner-primary", "fingerprint": "5f5ad9e181294321", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-25c96b2b77b90a36", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/mission-control/service-worker-registration.tsx:34"}, "properties": {"repobilityId": "333a2fafa35217c3", "scanner": "scanner-primary", "fingerprint": "25c96b2b77b90a36", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a44e7c27a2e75a4e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/mission-control/api.ts:123"}, "properties": {"repobilityId": "25f2bb3219357fd2", "scanner": "scanner-primary", "fingerprint": "a44e7c27a2e75a4e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9b65de9eb444e7d6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/mission-control/arkonos.tsx:128"}, "properties": {"repobilityId": "3b5d181e3401797d", "scanner": "scanner-primary", "fingerprint": "9b65de9eb444e7d6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-51131accae2dfa06", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/mission-control/command-palette.tsx:110"}, "properties": {"repobilityId": "4ff3d172ec17e0bb", "scanner": "scanner-primary", "fingerprint": "51131accae2dfa06", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5b2c1b4784a62a1d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/mission-control/journal.tsx:54"}, "properties": {"repobilityId": "c80bec3e61415e36", "scanner": "scanner-primary", "fingerprint": "5b2c1b4784a62a1d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a83f43ebb0b376b1", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/mission-control/charts.tsx:169"}, "properties": {"repobilityId": "ccf0ab2c5ebef712", "scanner": "scanner-primary", "fingerprint": "a83f43ebb0b376b1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1a8df84aef18eb60", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/mission-control/costs.tsx:97"}, "properties": {"repobilityId": "ba0d826c1ee1a293", "scanner": "scanner-primary", "fingerprint": "1a8df84aef18eb60", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ccda30dd4e5da21b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/mission-control/compliance.tsx:224"}, "properties": {"repobilityId": "1c8cf2aebc07716a", "scanner": "scanner-primary", "fingerprint": "ccda30dd4e5da21b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c2cd219cb395b55c", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/mission-control/integrations.tsx:93"}, "properties": {"repobilityId": "80f5bae78a6ed19b", "scanner": "scanner-primary", "fingerprint": "c2cd219cb395b55c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ba4a7599cc244e9e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/mission-control/benchmarks.tsx:67"}, "properties": {"repobilityId": "c9737a2f047eae5c", "scanner": "scanner-primary", "fingerprint": "ba4a7599cc244e9e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1eaf874d99d7d901", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/workflow-engine.ts:122"}, "properties": {"repobilityId": "05410176772436f9", "scanner": "scanner-primary", "fingerprint": "1eaf874d99d7d901", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c3c04da65056635a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/workflow-engine.ts:159"}, "properties": {"repobilityId": "8c8d8f0fef65203f", "scanner": "scanner-primary", "fingerprint": "c3c04da65056635a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0a0a12ea474cd55f", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/lib/exfil-guard.ts:56"}, "properties": {"repobilityId": "db0bc22b4967a0b5", "scanner": "scanner-primary", "fingerprint": "0a0a12ea474cd55f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4a2acc1d92f393e6", "level": "note", "message": {"text": "Legacy-named symbol `audit_log_v2` in src/lib/audit.ts:19"}, "properties": {"repobilityId": "99c83cddf9ee96d7", "scanner": "scanner-primary", "fingerprint": "4a2acc1d92f393e6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-4bced875e6cf1f05", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 public/sw.js:84"}, "properties": {"repobilityId": "9cc14140e2d64227", "scanner": "scanner-primary", "fingerprint": "4bced875e6cf1f05", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-39f8ebfe57a6f60f", "level": "note", "message": {"text": "35 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "d6a41686c51dc14b", "scanner": "scanner-primary", "fingerprint": "39f8ebfe57a6f60f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "6d7162bc07441f5b", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}]}]}