{"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-c1ed42954100dcdd", "name": "Stray `console.log` in TS/JS \u2014 landingpage/js/main.js:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 landingpage/js/main.js:11"}, "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-034414c939a2ba29", "name": "Stray `console.log` in TS/JS \u2014 packages/board-app/src/api.ts:3341", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/board-app/src/api.ts:3341"}, "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-6d9a94124b6fa2f7", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/board-app/src/components/SettingsView.tsx:1004", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/board-app/src/components/SettingsView.tsx:1004"}, "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-20b3279adcdf1deb", "name": "TODO/FIXME marker in shipping code \u2014 packages/board-app/src/components/planner/InspectorArtifactBody.tsx:163", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 packages/board-app/src/components/planner/InspectorArtifactBody.tsx:163"}, "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-070631bfd2888140", "name": "TODO/FIXME marker in shipping code \u2014 packages/board-app/src/components/planner/PlannerNodeCard.tsx:1558", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 packages/board-app/src/components/planner/PlannerNodeCard.tsx:1558"}, "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-aa22e5562194d5bc", "name": "React Flow <Controls> without dark theming \u2014 packages/board-app/src/components/planner/PlannerGraph.tsx:2508", "shortDescription": {"text": "React Flow <Controls> without dark theming \u2014 packages/board-app/src/components/planner/PlannerGraph.tsx:2508"}, "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-3d4e3590e4111d0d", "name": "TODO/FIXME marker in shipping code \u2014 packages/board-app/src/components/planner/PlannerGraph.tsx:1142", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 packages/board-app/src/components/planner/PlannerGraph.tsx:1142"}, "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-4e5ab344b23051c6", "name": "Stray `console.log` in TS/JS \u2014 extension/src/content-chatgpt.js:25", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 extension/src/content-chatgpt.js:25"}, "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-9e468ee71e096a08", "name": "Stray `console.log` in TS/JS \u2014 extension/src/content-claude-web.js:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 extension/src/content-claude-web.js:22"}, "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-780ad33ef3897c38", "name": "Insecure pattern 'node_child_process' in scripts/e2e/team-desktop-sync.mjs:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/e2e/team-desktop-sync.mjs:2"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e2e0450fb11a713e", "name": "Insecure pattern 'local_storage_auth_token' in packages/board-app/src/components/SessionLauncherView.test.tsx:326", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in packages/board-app/src/components/SessionLauncherView.test.tsx:326"}, "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-5df523a3d699ff10", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/setup-node@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-27924aa79fa4a517", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/setup-node@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-46c644c6227e4d4a", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/setup-node@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-1838a141491ce38c", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8cb4d9ffb4eba83a", "name": "Very large file: packages/board-app/src/api.ts (3548 lines)", "shortDescription": {"text": "Very large file: packages/board-app/src/api.ts (3548 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-b26f646aea62aff5", "name": "Very large file: packages/board-app/src/App.tsx (1465 lines)", "shortDescription": {"text": "Very large file: packages/board-app/src/App.tsx (1465 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-68987bbd4607b4b1", "name": "Very large file: packages/board-app/src/types.ts (2023 lines)", "shortDescription": {"text": "Very large file: packages/board-app/src/types.ts (2023 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-292dffa3f23cfd0f", "name": "Very large file: packages/board-app/src/components/SettingsView.tsx (1822 lines)", "shortDescription": {"text": "Very large file: packages/board-app/src/components/SettingsView.tsx (1822 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-114a1cee2e545982", "name": "Very large file: packages/board-app/src/components/CanvasToolbar.tsx (2049 lines)", "shortDescription": {"text": "Very large file: packages/board-app/src/components/CanvasToolbar.tsx (2049 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-0c890963a454e083", "name": "Very large file: packages/board-app/src/components/SessionLauncherView.test.tsx (1264 lines)", "shortDescription": {"text": "Very large file: packages/board-app/src/components/SessionLauncherView.test.tsx (1264 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-4575204b5964e4fa", "name": "Very large file: packages/board-app/src/components/SessionsView.tsx (1654 lines)", "shortDescription": {"text": "Very large file: packages/board-app/src/components/SessionsView.tsx (1654 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-a4f62c915ad38ddb", "name": "Very large file: packages/board-app/src/components/SessionLauncherView.tsx (2441 lines)", "shortDescription": {"text": "Very large file: packages/board-app/src/components/SessionLauncherView.tsx (2441 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-513f61c51b68970a", "name": "Very large file: packages/board-app/src/components/planner/InspectorArtifactBody.tsx (1556 lines)", "shortDescription": {"text": "Very large file: packages/board-app/src/components/planner/InspectorArtifactBody.tsx (1556 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-a911e2128b618571", "name": "Very large file: packages/board-app/src/components/planner/plannerGraphAdapter.ts (1347 lines)", "shortDescription": {"text": "Very large file: packages/board-app/src/components/planner/plannerGraphAdapter.ts (1347 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-13cf93f306b6b3e7", "name": "Very large file: packages/board-app/src/components/planner/PlannerNodeCard.tsx (1955 lines)", "shortDescription": {"text": "Very large file: packages/board-app/src/components/planner/PlannerNodeCard.tsx (1955 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-d5115e15452caab0", "name": "Very large file: packages/board-app/src/components/planner/PlannerProposalPanel.tsx (2181 lines)", "shortDescription": {"text": "Very large file: packages/board-app/src/components/planner/PlannerProposalPanel.tsx (2181 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-f9a5f68d4d391249", "name": "Very large file: packages/board-app/src/components/planner/PlannerGraph.tsx (3710 lines)", "shortDescription": {"text": "Very large file: packages/board-app/src/components/planner/PlannerGraph.tsx (3710 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-9db66841cf8707f3", "name": "Very large file: packages/board-app/src/lib/i18n.tsx (1801 lines)", "shortDescription": {"text": "Very large file: packages/board-app/src/lib/i18n.tsx (1801 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-1ed0bbb1e988f49c", "name": "Very large file: packages/board-ui/src/TranscriptView.tsx (1471 lines)", "shortDescription": {"text": "Very large file: packages/board-ui/src/TranscriptView.tsx (1471 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea3b5e389d8c9c0f", "name": "Low test-to-source ratio", "shortDescription": {"text": "Low test-to-source ratio"}, "fullDescription": {"text": "34 tests / 146 src (ratio 0.23)."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-23da539d77568dcf", "name": "Node manifest has dependencies but no lockfile: packages/board-cards/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: packages/board-cards/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c0e53d063c0b15a", "name": "Node manifest has dependencies but no lockfile: packages/board-persistence-http/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: packages/board-persistence-http/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-03384bc414545cd2", "name": "Node manifest has dependencies but no lockfile: packages/board-ui/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: packages/board-ui/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f71a262bf1cfc29d", "name": "Node manifest has dependencies but no lockfile: packages/recap-core/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: packages/recap-core/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f2244f3eb56b9b22", "name": "Node manifest has dependencies but no lockfile: packages/board-core/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: packages/board-core/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 66 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 67 placeholder/mock markers across 27 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing lockfile. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e725d2ab884fbd49", "name": "Multiple root agent instruction files without precedence", "shortDescription": {"text": "Multiple root agent instruction files without precedence"}, "fullDescription": {"text": "The repo has multiple top-level AI-coder instruction files. Without precedence rules, different agents may follow different policies."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-73f7f72b320c000e", "name": "Commented-code block (6 lines) in scripts/e2e/planner-dispatch-observability.py:81", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/e2e/planner-dispatch-observability.py:81"}, "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-4b2d2a1aa71bcc71", "name": "Commented-code block (5 lines) in scripts/e2e/planner-dispatch-prompt-delivery.py:37", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/e2e/planner-dispatch-prompt-delivery.py:37"}, "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-a6dbca17ebac948f", "name": "Commented-code block (5 lines) in packages/board-cards/src/cardTemplateStore.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in packages/board-cards/src/cardTemplateStore.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-851cba94b062184c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/board-cards/src/cardTemplateStore.ts:23", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/board-cards/src/cardTemplateStore.ts:23"}, "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-6c609df08ef26272", "name": "Commented-code block (5 lines) in packages/board-cards/src/defaultTemplate.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in packages/board-cards/src/defaultTemplate.ts:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e5383dccef2234eb", "name": "Commented-code block (5 lines) in packages/board-app/vite.config.ts:9", "shortDescription": {"text": "Commented-code block (5 lines) in packages/board-app/vite.config.ts:9"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2a2c17e66c88dde1", "name": "Commented-code block (5 lines) in packages/board-app/src/api.ts:3444", "shortDescription": {"text": "Commented-code block (5 lines) in packages/board-app/src/api.ts:3444"}, "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-5c03844cabc4d094", "name": "Commented-code block (6 lines) in packages/board-app/src/notifications.ts:9", "shortDescription": {"text": "Commented-code block (6 lines) in packages/board-app/src/notifications.ts:9"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d8ccd39c5911f879", "name": "Commented-code block (5 lines) in packages/board-app/src/preferences.ts:115", "shortDescription": {"text": "Commented-code block (5 lines) in packages/board-app/src/preferences.ts:115"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cedc6d48b16adefd", "name": "Commented-code block (7 lines) in packages/board-app/src/connectEvents.test.ts:50", "shortDescription": {"text": "Commented-code block (7 lines) in packages/board-app/src/connectEvents.test.ts:50"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-20d2319b709994a3", "name": "Commented-code block (6 lines) in packages/board-app/src/useBoardState.ts:92", "shortDescription": {"text": "Commented-code block (6 lines) in packages/board-app/src/useBoardState.ts:92"}, "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-1eeb04386c9c95c4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/board-app/src/useBoardState.ts:42", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/board-app/src/useBoardState.ts:42"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d753a58f7f0f9bbf", "name": "Commented-code block (5 lines) in packages/board-app/src/App.tsx:296", "shortDescription": {"text": "Commented-code block (5 lines) in packages/board-app/src/App.tsx:296"}, "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-1607169c49edd37f", "name": "Commented-code block (5 lines) in packages/board-app/src/types.ts:774", "shortDescription": {"text": "Commented-code block (5 lines) in packages/board-app/src/types.ts:774"}, "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-c6685eedc3754afd", "name": "Commented-code block (5 lines) in packages/board-app/src/components/ChatComposer.tsx:4", "shortDescription": {"text": "Commented-code block (5 lines) in packages/board-app/src/components/ChatComposer.tsx:4"}, "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-009ac0a98560866e", "name": "Legacy-named symbol `view__copy` in packages/board-app/src/components/TeamView.tsx:184", "shortDescription": {"text": "Legacy-named symbol `view__copy` in packages/board-app/src/components/TeamView.tsx:184"}, "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-6aa1a41b293e2f8e", "name": "Legacy-named symbol `panel__copy` in packages/board-app/src/components/SettingsView.tsx:1684", "shortDescription": {"text": "Legacy-named symbol `panel__copy` in packages/board-app/src/components/SettingsView.tsx:1684"}, "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-9bd7156d04adcfc4", "name": "Legacy-named symbol `check__copy` in packages/board-app/src/components/ReadinessChecklist.tsx:24", "shortDescription": {"text": "Legacy-named symbol `check__copy` in packages/board-app/src/components/ReadinessChecklist.tsx:24"}, "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-620774de5fd81bd3", "name": "Commented-code block (6 lines) in packages/board-app/src/components/CanvasToolbar.tsx:109", "shortDescription": {"text": "Commented-code block (6 lines) in packages/board-app/src/components/CanvasToolbar.tsx:109"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c49e0e513ea487ca", "name": "Legacy-named symbol `row__copy` in packages/board-app/src/components/AgentRuntimeSetupModal.tsx:117", "shortDescription": {"text": "Legacy-named symbol `row__copy` in packages/board-app/src/components/AgentRuntimeSetupModal.tsx:117"}, "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-ade53a23a8d719fd", "name": "Legacy-named symbol `step__copy` in packages/board-app/src/components/FirstRunOnboarding.tsx:121", "shortDescription": {"text": "Legacy-named symbol `step__copy` in packages/board-app/src/components/FirstRunOnboarding.tsx:121"}, "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-9ebc522da9f037da", "name": "Commented-code block (6 lines) in packages/board-app/src/components/planner/labels.ts:58", "shortDescription": {"text": "Commented-code block (6 lines) in packages/board-app/src/components/planner/labels.ts:58"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-647630dda870d891", "name": "Commented-code block (6 lines) in packages/board-app/src/components/planner/PlannerAgentChatPanel.tsx:3", "shortDescription": {"text": "Commented-code block (6 lines) in packages/board-app/src/components/planner/PlannerAgentChatPanel.tsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0f590b3ffdb0aefa", "name": "Commented-code block (5 lines) in packages/board-app/src/components/planner/widgetDataResolver.ts:97", "shortDescription": {"text": "Commented-code block (5 lines) in packages/board-app/src/components/planner/widgetDataResolver.ts:97"}, "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-82569e41654ebd67", "name": "Commented-code block (8 lines) in packages/board-app/src/components/planner/InspectorArtifactBody.tsx:3", "shortDescription": {"text": "Commented-code block (8 lines) in packages/board-app/src/components/planner/InspectorArtifactBody.tsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fe4126ea98c9bce2", "name": "Commented-code block (8 lines) in packages/board-app/src/components/planner/NodeInspectorModal.tsx:160", "shortDescription": {"text": "Commented-code block (8 lines) in packages/board-app/src/components/planner/NodeInspectorModal.tsx:160"}, "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-567665736cfcc814", "name": "Legacy-named symbol `scene__copy` in packages/board-app/src/components/planner/CanvasSceneLayer.tsx:114", "shortDescription": {"text": "Legacy-named symbol `scene__copy` in packages/board-app/src/components/planner/CanvasSceneLayer.tsx:114"}, "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-5dff2163fe6c0bf8", "name": "Commented-code block (5 lines) in packages/board-app/src/components/planner/plannerGraphAdapter.ts:31", "shortDescription": {"text": "Commented-code block (5 lines) in packages/board-app/src/components/planner/plannerGraphAdapter.ts:31"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d60464111964299f", "name": "Commented-code block (5 lines) in packages/board-app/src/components/planner/PlannerNodeCard.tsx:80", "shortDescription": {"text": "Commented-code block (5 lines) in packages/board-app/src/components/planner/PlannerNodeCard.tsx:80"}, "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-766b7acca59aa804", "name": "Legacy-named symbol `recommendation__copy` in packages/board-app/src/components/planner/PlannerProposalPanel.tsx:822", "shortDescription": {"text": "Legacy-named symbol `recommendation__copy` in packages/board-app/src/components/planner/PlannerProposalPanel.tsx:822"}, "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-b7d4b56d36d7f660", "name": "Commented-code block (10 lines) in packages/board-app/src/components/planner/AIRecapDrawer.tsx:128", "shortDescription": {"text": "Commented-code block (10 lines) in packages/board-app/src/components/planner/AIRecapDrawer.tsx:128"}, "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-3a5a5006be565731", "name": "Legacy-named symbol `hint__copy` in packages/board-app/src/components/planner/CanvasKindHint.tsx:73", "shortDescription": {"text": "Legacy-named symbol `hint__copy` in packages/board-app/src/components/planner/CanvasKindHint.tsx: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-0e34a6a51260e305", "name": "Legacy-named symbol `banner__copy` in packages/board-app/src/components/planner/PlannerGraph.tsx:2411", "shortDescription": {"text": "Legacy-named symbol `banner__copy` in packages/board-app/src/components/planner/PlannerGraph.tsx:2411"}, "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-f8d6dc5ce28858c9", "name": "Commented-code block (6 lines) in packages/board-app/src/components/planner/PlannerGraph.tsx:411", "shortDescription": {"text": "Commented-code block (6 lines) in packages/board-app/src/components/planner/PlannerGraph.tsx:411"}, "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-14dd32ccb07d76ea", "name": "Legacy-named symbol `notice__copy` in packages/board-app/src/components/feedback/Notice.tsx:40", "shortDescription": {"text": "Legacy-named symbol `notice__copy` in packages/board-app/src/components/feedback/Notice.tsx:40"}, "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-1eab0c1c975bf35c", "name": "Commented-code block (6 lines) in packages/board-app/src/lib/plannerTelemetry.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in packages/board-app/src/lib/plannerTelemetry.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7ba84b11a8d1c71a", "name": "Commented-code block (6 lines) in packages/board-app/src/lib/plannerIntent.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in packages/board-app/src/lib/plannerIntent.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cb55ee61a9b99bca", "name": "Commented-code block (10 lines) in packages/board-persistence-http/src/HttpCanvasPersistence.ts:4", "shortDescription": {"text": "Commented-code block (10 lines) in packages/board-persistence-http/src/HttpCanvasPersistence.ts:4"}, "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-a08dc51a724d8aee", "name": "Commented-code block (6 lines) in packages/board-ui/src/CardHost.tsx:3", "shortDescription": {"text": "Commented-code block (6 lines) in packages/board-ui/src/CardHost.tsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-84ee8014b9a71fdf", "name": "Commented-code block (5 lines) in packages/board-ui/src/BoardCanvas.tsx:4", "shortDescription": {"text": "Commented-code block (5 lines) in packages/board-ui/src/BoardCanvas.tsx:4"}, "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-5e6f5308af613066", "name": "Commented-code block (5 lines) in packages/board-core/src/transcript.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in packages/board-core/src/transcript.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-38227176aa19abe0", "name": "Commented-code block (5 lines) in Bridge/mcp-meee2/server.js:545", "shortDescription": {"text": "Commented-code block (5 lines) in Bridge/mcp-meee2/server.js:545"}, "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-d19ee4dfda3e1732", "name": "Commented-code block (5 lines) in extension/src/content-claude-web.js:4", "shortDescription": {"text": "Commented-code block (5 lines) in extension/src/content-claude-web.js:4"}, "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-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:\nscripts/e2e/planner-dispatch-dedup.py:api, scripts/e2e/planner-dispatch-prompt-delivery.py:api\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/21281"}, "properties": {"repository": "tianqixinxi/meee2", "repoUrl": "https://github.com/tianqixinxi/meee2", "branch": "main"}, "results": [{"ruleId": "scanner-c1ed42954100dcdd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 landingpage/js/main.js:11"}, "properties": {"repobilityId": "cf63fb843eb889ec", "scanner": "scanner-primary", "fingerprint": "c1ed42954100dcdd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-034414c939a2ba29", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/board-app/src/api.ts:3341"}, "properties": {"repobilityId": "e6f8adaf7ff2db14", "scanner": "scanner-primary", "fingerprint": "034414c939a2ba29", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6d9a94124b6fa2f7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/board-app/src/components/SettingsView.tsx:1004"}, "properties": {"repobilityId": "5ef236e2f0a8f6c2", "scanner": "scanner-primary", "fingerprint": "6d9a94124b6fa2f7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-20b3279adcdf1deb", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 packages/board-app/src/components/planner/InspectorArtifactBody.tsx:163"}, "properties": {"repobilityId": "d25c40bbc6b309b6", "scanner": "scanner-primary", "fingerprint": "20b3279adcdf1deb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-070631bfd2888140", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 packages/board-app/src/components/planner/PlannerNodeCard.tsx:1558"}, "properties": {"repobilityId": "2584a4d539e4e65d", "scanner": "scanner-primary", "fingerprint": "070631bfd2888140", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-aa22e5562194d5bc", "level": "note", "message": {"text": "React Flow <Controls> without dark theming \u2014 packages/board-app/src/components/planner/PlannerGraph.tsx:2508"}, "properties": {"repobilityId": "312fcbc45a3ffdae", "scanner": "scanner-primary", "fingerprint": "aa22e5562194d5bc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.controls.no-bg"]}}, {"ruleId": "scanner-3d4e3590e4111d0d", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 packages/board-app/src/components/planner/PlannerGraph.tsx:1142"}, "properties": {"repobilityId": "178e7b9123304e2c", "scanner": "scanner-primary", "fingerprint": "3d4e3590e4111d0d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-4e5ab344b23051c6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 extension/src/content-chatgpt.js:25"}, "properties": {"repobilityId": "af0306d7a9b233ef", "scanner": "scanner-primary", "fingerprint": "4e5ab344b23051c6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9e468ee71e096a08", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 extension/src/content-claude-web.js:22"}, "properties": {"repobilityId": "39b9b4121c5e47c9", "scanner": "scanner-primary", "fingerprint": "9e468ee71e096a08", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-780ad33ef3897c38", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/e2e/team-desktop-sync.mjs:2"}, "properties": {"repobilityId": "5c2da6109803cca1", "scanner": "scanner-primary", "fingerprint": "780ad33ef3897c38", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/e2e/team-desktop-sync.mjs"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-e2e0450fb11a713e", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in packages/board-app/src/components/SessionLauncherView.test.tsx:326"}, "properties": {"repobilityId": "1d2191cd6b2c15f4", "scanner": "scanner-primary", "fingerprint": "e2e0450fb11a713e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/board-app/src/components/SessionLauncherView.test.tsx"}, "region": {"startLine": 326}}}]}, {"ruleId": "scanner-5df523a3d699ff10", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "0f5869284f563ff1", "scanner": "scanner-primary", "fingerprint": "5df523a3d699ff10", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/publish-board-packages.yml"}, "region": {"startLine": 58}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "989a74409a402368", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 28}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "989a74409a402368", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 62}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "bd7f3c1c34d83159", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 102}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "54c8f1b47dd62535", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 130}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "989a74409a402368", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 145}}}]}, {"ruleId": "scanner-46c644c6227e4d4a", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "eeb76410cc935c30", "scanner": "scanner-primary", "fingerprint": "46c644c6227e4d4a", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release.yml"}, "region": {"startLine": 120}}}]}, {"ruleId": "scanner-46c644c6227e4d4a", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "e040b5c136c9f9b8", "scanner": "scanner-primary", "fingerprint": "46c644c6227e4d4a", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release.yml"}, "region": {"startLine": 130}}}]}, {"ruleId": "scanner-46c644c6227e4d4a", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "f5c88380aed82b44", "scanner": "scanner-primary", "fingerprint": "46c644c6227e4d4a", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release.yml"}, "region": {"startLine": 183}}}]}, {"ruleId": "scanner-46c644c6227e4d4a", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "5ab0c5bd71e63ad8", "scanner": "scanner-primary", "fingerprint": "46c644c6227e4d4a", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release.yml"}, "region": {"startLine": 263}}}]}, {"ruleId": "scanner-46c644c6227e4d4a", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "b0f359fc82dc1097", "scanner": "scanner-primary", "fingerprint": "46c644c6227e4d4a", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release.yml"}, "region": {"startLine": 290}}}]}, {"ruleId": "scanner-46c644c6227e4d4a", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "2644034c718fb80d", "scanner": "scanner-primary", "fingerprint": "46c644c6227e4d4a", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release.yml"}, "region": {"startLine": 351}}}]}, {"ruleId": "scanner-1838a141491ce38c", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "b8fd4f5048f96576", "scanner": "scanner-primary", "fingerprint": "1838a141491ce38c", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8cb4d9ffb4eba83a", "level": "note", "message": {"text": "Very large file: packages/board-app/src/api.ts (3548 lines)"}, "properties": {"repobilityId": "2f4468c58a7b9a09", "scanner": "scanner-primary", "fingerprint": "8cb4d9ffb4eba83a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b26f646aea62aff5", "level": "note", "message": {"text": "Very large file: packages/board-app/src/App.tsx (1465 lines)"}, "properties": {"repobilityId": "31b75407bc25b208", "scanner": "scanner-primary", "fingerprint": "b26f646aea62aff5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-68987bbd4607b4b1", "level": "note", "message": {"text": "Very large file: packages/board-app/src/types.ts (2023 lines)"}, "properties": {"repobilityId": "1a24a597dc53f545", "scanner": "scanner-primary", "fingerprint": "68987bbd4607b4b1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-292dffa3f23cfd0f", "level": "note", "message": {"text": "Very large file: packages/board-app/src/components/SettingsView.tsx (1822 lines)"}, "properties": {"repobilityId": "2a1000a70553255e", "scanner": "scanner-primary", "fingerprint": "292dffa3f23cfd0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-114a1cee2e545982", "level": "note", "message": {"text": "Very large file: packages/board-app/src/components/CanvasToolbar.tsx (2049 lines)"}, "properties": {"repobilityId": "9de791bc04e090f1", "scanner": "scanner-primary", "fingerprint": "114a1cee2e545982", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-0c890963a454e083", "level": "note", "message": {"text": "Very large file: packages/board-app/src/components/SessionLauncherView.test.tsx (1264 lines)"}, "properties": {"repobilityId": "ab5ba720547491c7", "scanner": "scanner-primary", "fingerprint": "0c890963a454e083", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4575204b5964e4fa", "level": "note", "message": {"text": "Very large file: packages/board-app/src/components/SessionsView.tsx (1654 lines)"}, "properties": {"repobilityId": "5c21a0b157ac353b", "scanner": "scanner-primary", "fingerprint": "4575204b5964e4fa", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a4f62c915ad38ddb", "level": "note", "message": {"text": "Very large file: packages/board-app/src/components/SessionLauncherView.tsx (2441 lines)"}, "properties": {"repobilityId": "6ec49a6aae9ebd46", "scanner": "scanner-primary", "fingerprint": "a4f62c915ad38ddb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-513f61c51b68970a", "level": "note", "message": {"text": "Very large file: packages/board-app/src/components/planner/InspectorArtifactBody.tsx (1556 lines)"}, "properties": {"repobilityId": "ae2b4b6bb361c972", "scanner": "scanner-primary", "fingerprint": "513f61c51b68970a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a911e2128b618571", "level": "note", "message": {"text": "Very large file: packages/board-app/src/components/planner/plannerGraphAdapter.ts (1347 lines)"}, "properties": {"repobilityId": "c867ef65cadf652d", "scanner": "scanner-primary", "fingerprint": "a911e2128b618571", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-13cf93f306b6b3e7", "level": "note", "message": {"text": "Very large file: packages/board-app/src/components/planner/PlannerNodeCard.tsx (1955 lines)"}, "properties": {"repobilityId": "4826b59f34fb0e42", "scanner": "scanner-primary", "fingerprint": "13cf93f306b6b3e7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d5115e15452caab0", "level": "note", "message": {"text": "Very large file: packages/board-app/src/components/planner/PlannerProposalPanel.tsx (2181 lines)"}, "properties": {"repobilityId": "4f660cb21970722c", "scanner": "scanner-primary", "fingerprint": "d5115e15452caab0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f9a5f68d4d391249", "level": "note", "message": {"text": "Very large file: packages/board-app/src/components/planner/PlannerGraph.tsx (3710 lines)"}, "properties": {"repobilityId": "544eff60b56d1867", "scanner": "scanner-primary", "fingerprint": "f9a5f68d4d391249", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9db66841cf8707f3", "level": "note", "message": {"text": "Very large file: packages/board-app/src/lib/i18n.tsx (1801 lines)"}, "properties": {"repobilityId": "8455693e53546b2c", "scanner": "scanner-primary", "fingerprint": "9db66841cf8707f3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1ed0bbb1e988f49c", "level": "note", "message": {"text": "Very large file: packages/board-ui/src/TranscriptView.tsx (1471 lines)"}, "properties": {"repobilityId": "6f27d7c6031ab34f", "scanner": "scanner-primary", "fingerprint": "1ed0bbb1e988f49c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ea3b5e389d8c9c0f", "level": "note", "message": {"text": "Low test-to-source ratio"}, "properties": {"repobilityId": "ef7b2552cc00a375", "scanner": "scanner-primary", "fingerprint": "ea3b5e389d8c9c0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["tests"]}}, {"ruleId": "scanner-23da539d77568dcf", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: packages/board-cards/package.json"}, "properties": {"repobilityId": "4f61339ec91c3a23", "scanner": "scanner-primary", "fingerprint": "23da539d77568dcf", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/board-cards/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2c0e53d063c0b15a", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: packages/board-persistence-http/package.json"}, "properties": {"repobilityId": "94e179b792667ed4", "scanner": "scanner-primary", "fingerprint": "2c0e53d063c0b15a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/board-persistence-http/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-03384bc414545cd2", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: packages/board-ui/package.json"}, "properties": {"repobilityId": "6d27b00590327832", "scanner": "scanner-primary", "fingerprint": "03384bc414545cd2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/board-ui/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f71a262bf1cfc29d", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: packages/recap-core/package.json"}, "properties": {"repobilityId": "babf5812b58f40aa", "scanner": "scanner-primary", "fingerprint": "f71a262bf1cfc29d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/recap-core/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f2244f3eb56b9b22", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: packages/board-core/package.json"}, "properties": {"repobilityId": "18bcd568ae8fd796", "scanner": "scanner-primary", "fingerprint": "f2244f3eb56b9b22", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/board-core/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "4f5a304f481cccf3", "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": "dd9827fb7ae69f29", "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": "7fc29bd9026357db", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "e3cddfaafe70a5f7", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "419833385ad47121", "scanner": "scanner-primary", "fingerprint": "ea8f3013f588db25", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-8424db9c75e04ba4", "level": "none", "message": {"text": "Very short observed git history"}, "properties": {"repobilityId": "321b388a18b2f1fe", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-e725d2ab884fbd49", "level": "note", "message": {"text": "Multiple root agent instruction files without precedence"}, "properties": {"repobilityId": "1953db6c89508d22", "scanner": "scanner-primary", "fingerprint": "e725d2ab884fbd49", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["agent-instructions", "governance"]}}, {"ruleId": "scanner-73f7f72b320c000e", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/e2e/planner-dispatch-observability.py:81"}, "properties": {"repobilityId": "2b13f879c34f5648", "scanner": "scanner-primary", "fingerprint": "73f7f72b320c000e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4b2d2a1aa71bcc71", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/e2e/planner-dispatch-prompt-delivery.py:37"}, "properties": {"repobilityId": "293c09784caf8e9e", "scanner": "scanner-primary", "fingerprint": "4b2d2a1aa71bcc71", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a6dbca17ebac948f", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/board-cards/src/cardTemplateStore.ts:3"}, "properties": {"repobilityId": "7d92fbc9ea9fd38f", "scanner": "scanner-primary", "fingerprint": "a6dbca17ebac948f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-851cba94b062184c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/board-cards/src/cardTemplateStore.ts:23"}, "properties": {"repobilityId": "007d9d2a7fa439bc", "scanner": "scanner-primary", "fingerprint": "851cba94b062184c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6c609df08ef26272", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/board-cards/src/defaultTemplate.ts:5"}, "properties": {"repobilityId": "018771a65fb1664a", "scanner": "scanner-primary", "fingerprint": "6c609df08ef26272", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e5383dccef2234eb", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/board-app/vite.config.ts:9"}, "properties": {"repobilityId": "3aaab6bebf4f22d9", "scanner": "scanner-primary", "fingerprint": "e5383dccef2234eb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2a2c17e66c88dde1", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/board-app/src/api.ts:3444"}, "properties": {"repobilityId": "8131a7dca243b6aa", "scanner": "scanner-primary", "fingerprint": "2a2c17e66c88dde1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5c03844cabc4d094", "level": "none", "message": {"text": "Commented-code block (6 lines) in packages/board-app/src/notifications.ts:9"}, "properties": {"repobilityId": "1bcea8a03723ca3a", "scanner": "scanner-primary", "fingerprint": "5c03844cabc4d094", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d8ccd39c5911f879", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/board-app/src/preferences.ts:115"}, "properties": {"repobilityId": "84185c91cafe6498", "scanner": "scanner-primary", "fingerprint": "d8ccd39c5911f879", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cedc6d48b16adefd", "level": "none", "message": {"text": "Commented-code block (7 lines) in packages/board-app/src/connectEvents.test.ts:50"}, "properties": {"repobilityId": "d04f1562d3be234a", "scanner": "scanner-primary", "fingerprint": "cedc6d48b16adefd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-20d2319b709994a3", "level": "none", "message": {"text": "Commented-code block (6 lines) in packages/board-app/src/useBoardState.ts:92"}, "properties": {"repobilityId": "e2bd6432dc71a4e5", "scanner": "scanner-primary", "fingerprint": "20d2319b709994a3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1eeb04386c9c95c4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/board-app/src/useBoardState.ts:42"}, "properties": {"repobilityId": "927d6ca2a7736fef", "scanner": "scanner-primary", "fingerprint": "1eeb04386c9c95c4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d753a58f7f0f9bbf", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/board-app/src/App.tsx:296"}, "properties": {"repobilityId": "e3b6fac25eb8043a", "scanner": "scanner-primary", "fingerprint": "d753a58f7f0f9bbf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1607169c49edd37f", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/board-app/src/types.ts:774"}, "properties": {"repobilityId": "3f59811f3e3251c6", "scanner": "scanner-primary", "fingerprint": "1607169c49edd37f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c6685eedc3754afd", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/board-app/src/components/ChatComposer.tsx:4"}, "properties": {"repobilityId": "4081c2d875289ffd", "scanner": "scanner-primary", "fingerprint": "c6685eedc3754afd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-009ac0a98560866e", "level": "note", "message": {"text": "Legacy-named symbol `view__copy` in packages/board-app/src/components/TeamView.tsx:184"}, "properties": {"repobilityId": "7e37b979eb78ed5e", "scanner": "scanner-primary", "fingerprint": "009ac0a98560866e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-6aa1a41b293e2f8e", "level": "note", "message": {"text": "Legacy-named symbol `panel__copy` in packages/board-app/src/components/SettingsView.tsx:1684"}, "properties": {"repobilityId": "65bb20501a6160e1", "scanner": "scanner-primary", "fingerprint": "6aa1a41b293e2f8e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-9bd7156d04adcfc4", "level": "note", "message": {"text": "Legacy-named symbol `check__copy` in packages/board-app/src/components/ReadinessChecklist.tsx:24"}, "properties": {"repobilityId": "0a79b64c0db3c29b", "scanner": "scanner-primary", "fingerprint": "9bd7156d04adcfc4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-620774de5fd81bd3", "level": "none", "message": {"text": "Commented-code block (6 lines) in packages/board-app/src/components/CanvasToolbar.tsx:109"}, "properties": {"repobilityId": "a3b03c6282bc75c2", "scanner": "scanner-primary", "fingerprint": "620774de5fd81bd3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c49e0e513ea487ca", "level": "note", "message": {"text": "Legacy-named symbol `row__copy` in packages/board-app/src/components/AgentRuntimeSetupModal.tsx:117"}, "properties": {"repobilityId": "c8ec37a930d91892", "scanner": "scanner-primary", "fingerprint": "c49e0e513ea487ca", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ade53a23a8d719fd", "level": "note", "message": {"text": "Legacy-named symbol `step__copy` in packages/board-app/src/components/FirstRunOnboarding.tsx:121"}, "properties": {"repobilityId": "c05f4642d6262271", "scanner": "scanner-primary", "fingerprint": "ade53a23a8d719fd", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-9ebc522da9f037da", "level": "none", "message": {"text": "Commented-code block (6 lines) in packages/board-app/src/components/planner/labels.ts:58"}, "properties": {"repobilityId": "be210a886d342a37", "scanner": "scanner-primary", "fingerprint": "9ebc522da9f037da", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-647630dda870d891", "level": "none", "message": {"text": "Commented-code block (6 lines) in packages/board-app/src/components/planner/PlannerAgentChatPanel.tsx:3"}, "properties": {"repobilityId": "e0b9de4a996286b0", "scanner": "scanner-primary", "fingerprint": "647630dda870d891", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0f590b3ffdb0aefa", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/board-app/src/components/planner/widgetDataResolver.ts:97"}, "properties": {"repobilityId": "f7b4656766115d90", "scanner": "scanner-primary", "fingerprint": "0f590b3ffdb0aefa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-82569e41654ebd67", "level": "none", "message": {"text": "Commented-code block (8 lines) in packages/board-app/src/components/planner/InspectorArtifactBody.tsx:3"}, "properties": {"repobilityId": "52d91424addc289d", "scanner": "scanner-primary", "fingerprint": "82569e41654ebd67", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fe4126ea98c9bce2", "level": "none", "message": {"text": "Commented-code block (8 lines) in packages/board-app/src/components/planner/NodeInspectorModal.tsx:160"}, "properties": {"repobilityId": "b9b0b3bcebab89a0", "scanner": "scanner-primary", "fingerprint": "fe4126ea98c9bce2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-567665736cfcc814", "level": "note", "message": {"text": "Legacy-named symbol `scene__copy` in packages/board-app/src/components/planner/CanvasSceneLayer.tsx:114"}, "properties": {"repobilityId": "6ca24b36511ea22b", "scanner": "scanner-primary", "fingerprint": "567665736cfcc814", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-5dff2163fe6c0bf8", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/board-app/src/components/planner/plannerGraphAdapter.ts:31"}, "properties": {"repobilityId": "a62b4da6af7496db", "scanner": "scanner-primary", "fingerprint": "5dff2163fe6c0bf8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d60464111964299f", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/board-app/src/components/planner/PlannerNodeCard.tsx:80"}, "properties": {"repobilityId": "455da0848420c413", "scanner": "scanner-primary", "fingerprint": "d60464111964299f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-766b7acca59aa804", "level": "note", "message": {"text": "Legacy-named symbol `recommendation__copy` in packages/board-app/src/components/planner/PlannerProposalPanel.tsx:822"}, "properties": {"repobilityId": "6f8d59e3eb399569", "scanner": "scanner-primary", "fingerprint": "766b7acca59aa804", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b7d4b56d36d7f660", "level": "none", "message": {"text": "Commented-code block (10 lines) in packages/board-app/src/components/planner/AIRecapDrawer.tsx:128"}, "properties": {"repobilityId": "819cddad44ae06ba", "scanner": "scanner-primary", "fingerprint": "b7d4b56d36d7f660", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3a5a5006be565731", "level": "note", "message": {"text": "Legacy-named symbol `hint__copy` in packages/board-app/src/components/planner/CanvasKindHint.tsx:73"}, "properties": {"repobilityId": "19ad002e9e7da1e5", "scanner": "scanner-primary", "fingerprint": "3a5a5006be565731", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-0e34a6a51260e305", "level": "note", "message": {"text": "Legacy-named symbol `banner__copy` in packages/board-app/src/components/planner/PlannerGraph.tsx:2411"}, "properties": {"repobilityId": "fced3fd61b8fb80a", "scanner": "scanner-primary", "fingerprint": "0e34a6a51260e305", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-f8d6dc5ce28858c9", "level": "none", "message": {"text": "Commented-code block (6 lines) in packages/board-app/src/components/planner/PlannerGraph.tsx:411"}, "properties": {"repobilityId": "007a4a1ce3cff0f9", "scanner": "scanner-primary", "fingerprint": "f8d6dc5ce28858c9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-14dd32ccb07d76ea", "level": "note", "message": {"text": "Legacy-named symbol `notice__copy` in packages/board-app/src/components/feedback/Notice.tsx:40"}, "properties": {"repobilityId": "298d4ba3c737f38c", "scanner": "scanner-primary", "fingerprint": "14dd32ccb07d76ea", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-1eab0c1c975bf35c", "level": "none", "message": {"text": "Commented-code block (6 lines) in packages/board-app/src/lib/plannerTelemetry.ts:1"}, "properties": {"repobilityId": "55aa74d80df7b0f0", "scanner": "scanner-primary", "fingerprint": "1eab0c1c975bf35c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7ba84b11a8d1c71a", "level": "none", "message": {"text": "Commented-code block (6 lines) in packages/board-app/src/lib/plannerIntent.ts:1"}, "properties": {"repobilityId": "70afde68c8f3341c", "scanner": "scanner-primary", "fingerprint": "7ba84b11a8d1c71a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cb55ee61a9b99bca", "level": "none", "message": {"text": "Commented-code block (10 lines) in packages/board-persistence-http/src/HttpCanvasPersistence.ts:4"}, "properties": {"repobilityId": "6c624a9fd3b27163", "scanner": "scanner-primary", "fingerprint": "cb55ee61a9b99bca", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a08dc51a724d8aee", "level": "none", "message": {"text": "Commented-code block (6 lines) in packages/board-ui/src/CardHost.tsx:3"}, "properties": {"repobilityId": "9789ea0ce8e7edfe", "scanner": "scanner-primary", "fingerprint": "a08dc51a724d8aee", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-84ee8014b9a71fdf", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/board-ui/src/BoardCanvas.tsx:4"}, "properties": {"repobilityId": "c17bc98caa23101f", "scanner": "scanner-primary", "fingerprint": "84ee8014b9a71fdf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5e6f5308af613066", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/board-core/src/transcript.ts:3"}, "properties": {"repobilityId": "7226bbf3e8454f6d", "scanner": "scanner-primary", "fingerprint": "5e6f5308af613066", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-38227176aa19abe0", "level": "none", "message": {"text": "Commented-code block (5 lines) in Bridge/mcp-meee2/server.js:545"}, "properties": {"repobilityId": "83e9f4578735d847", "scanner": "scanner-primary", "fingerprint": "38227176aa19abe0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d19ee4dfda3e1732", "level": "none", "message": {"text": "Commented-code block (5 lines) in extension/src/content-claude-web.js:4"}, "properties": {"repobilityId": "8ffb3be39095e88a", "scanner": "scanner-primary", "fingerprint": "d19ee4dfda3e1732", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "5820f5ccaa2a2183", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}]}]}