{"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-f2eca910abd9807b", "name": "Possibly dead Python function: validate_space_names", "shortDescription": {"text": "Possibly dead Python function: validate_space_names"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5748dd16360f5e50", "name": "Possibly dead Python function: validate_visit_types", "shortDescription": {"text": "Possibly dead Python function: validate_visit_types"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3c3442516342647b", "name": "Possibly dead Python function: validate_dice_outcomes", "shortDescription": {"text": "Possibly dead Python function: validate_dice_outcomes"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-540ceca971149947", "name": "Possibly dead Python function: validate_effects_data", "shortDescription": {"text": "Possibly dead Python function: validate_effects_data"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-55b7f736cfd55b83", "name": "Possibly dead Python function: validate_content_data", "shortDescription": {"text": "Possibly dead Python function: validate_content_data"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-42f01b08c93570c5", "name": "Stray `console.log` in TS/JS \u2014 vite.config.ts:85", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 vite.config.ts:85"}, "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-16da487c6ece41b2", "name": "Stray `console.log` in TS/JS \u2014 tests/E2E-04_EdgeCases.test.ts:86", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/E2E-04_EdgeCases.test.ts:86"}, "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-876f2c6e23770f66", "name": "Stray `console.log` in TS/JS \u2014 tests/E2E-04_SpaceTryAgain.test.ts:135", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/E2E-04_SpaceTryAgain.test.ts:135"}, "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-95dcd465b745eed9", "name": "Stray `console.log` in TS/JS \u2014 tests/E2E-LogicPlaythrough.test.ts:78", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/E2E-LogicPlaythrough.test.ts:78"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7f05c491217402c9", "name": "Stray `console.log` in TS/JS \u2014 tests/E2E-01_HappyPath.test.tsx:240", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/E2E-01_HappyPath.test.tsx: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-7717f53bc7e5bf54", "name": "Stray `console.log` in TS/JS \u2014 tests/E2E-MultiDevice.test.ts:67", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/E2E-MultiDevice.test.ts:67"}, "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-bc058525348eb47d", "name": "Stray `console.log` in TS/JS \u2014 tests/E2E-03_ComplexSpace.test.ts:129", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/E2E-03_ComplexSpace.test.ts:129"}, "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-0a905498af55b549", "name": "Stray `console.log` in TS/JS \u2014 tests/E2E-FullGame.test.tsx:214", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/E2E-FullGame.test.tsx:214"}, "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-88341ea4e26e9001", "name": "Stray `console.log` in TS/JS \u2014 tests/E2E-Multiplayer4P.test.ts:110", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/E2E-Multiplayer4P.test.ts:110"}, "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-b62e2c47d7a3b2a3", "name": "Stray `console.log` in TS/JS \u2014 tests/E2E-Multiplayer2P.test.ts:98", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/E2E-Multiplayer2P.test.ts:98"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-315d93a24410d9e5", "name": "Stray `console.log` in TS/JS \u2014 tests/E2E-05_MultiPlayerEffects.test.ts:158", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/E2E-05_MultiPlayerEffects.test.ts:158"}, "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-247f2536aee6a2f5", "name": "Stray `console.log` in TS/JS \u2014 tests/vitest.setup.ts:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/vitest.setup.ts:32"}, "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-cfa945cd6b79cc4a", "name": "Stray `console.log` in TS/JS \u2014 tests/ghost/cardDrawRepro.test.ts:31", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/ghost/cardDrawRepro.test.ts:31"}, "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-0d29f827703e74bc", "name": "Stray `console.log` in TS/JS \u2014 tests/ghost/ghostPlayer.test.ts:44", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/ghost/ghostPlayer.test.ts:44"}, "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-97e53962e4f5ee2b", "name": "Stray `console.log` in TS/JS \u2014 tests/ghost/coverage.test.ts:77", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/ghost/coverage.test.ts:77"}, "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-21c1c2581eeb8503", "name": "Stray `console.log` in TS/JS \u2014 tests/ghost/ghostPlayer.ts:185", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/ghost/ghostPlayer.ts:185"}, "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-8b931e369d0bd248", "name": "Stray `console.log` in TS/JS \u2014 tests/uat/verify-button-text.js:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/uat/verify-button-text.js: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-2a6c8befb4158418", "name": "Stray `console.log` in TS/JS \u2014 tests/uat/test-pm-decision-check.js:33", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/uat/test-pm-decision-check.js:33"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9405b04e0f491a72", "name": "Stray `console.log` in TS/JS \u2014 tests/uat/test-dice-button-pm-decision-check.js:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/uat/test-dice-button-pm-decision-check.js:10"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-626760d5ac3c7256", "name": "Stray `console.log` in TS/JS \u2014 tests/uat/puppeteer-simple.js:31", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/uat/puppeteer-simple.js:31"}, "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-7d588efb7930dae4", "name": "Stray `console.log` in TS/JS \u2014 tests/scripts/test-dice-randomness.js:33", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/scripts/test-dice-randomness.js:33"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-56f36557c17cf355", "name": "Stray `console.log` in TS/JS \u2014 tests/utils/ConditionEvaluator.test.ts:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/utils/ConditionEvaluator.test.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-a191a094eedc5059", "name": "TODO/FIXME marker in shipping code \u2014 tests/components/game/SpaceExplorerPanel.test.tsx:8", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 tests/components/game/SpaceExplorerPanel.test.tsx:8"}, "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-33ccc867505ba50c", "name": "Stray `console.log` in TS/JS \u2014 tests/services/WebSocketSyncService.test.ts:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/services/WebSocketSyncService.test.ts:10"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4d8e9539a9c77df8", "name": "Stray `console.log` in TS/JS \u2014 tests/services/LoggingService.test.ts:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/services/LoggingService.test.ts:8"}, "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-dfcd9896d5b8638c", "name": "Stray `console.log` in TS/JS \u2014 tests/services/SpaceEffectService.test.ts:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/services/SpaceEffectService.test.ts:10"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8988a6c0c7e002b9", "name": "Stray `console.log` in TS/JS \u2014 tests/regression/TryAgainVisitType.test.ts:162", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/regression/TryAgainVisitType.test.ts:162"}, "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-f0c21313d7b80a5f", "name": "Stray `console.log` in TS/JS \u2014 tests/regression/MultiplayerStateIsolation.test.ts:153", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/regression/MultiplayerStateIsolation.test.ts:153"}, "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-7fea54a7c15a0d1c", "name": "Stray `console.log` in TS/JS \u2014 docs/archive/v3-cleanup-20260404/merge-csv-rows.js:179", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 docs/archive/v3-cleanup-20260404/merge-csv-rows.js:179"}, "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-5780f1b3ea1e5ed6", "name": "Stray `console.log` in TS/JS \u2014 server/migrateCheck.js:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/migrateCheck.js:20"}, "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-1c29014299e1a86d", "name": "Stray `console.log` in TS/JS \u2014 server/websocket.js:45", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/websocket.js:45"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d8d00b3692ad1fdb", "name": "Stray `console.log` in TS/JS \u2014 server/processGameData.js:676", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/processGameData.js:676"}, "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-d8e54f5b9e9214d5", "name": "Stray `console.log` in TS/JS \u2014 server/server.js:89", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/server.js:89"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bf8c1feec141ccc2", "name": "Stray `console.log` in TS/JS \u2014 src/utils/debugLog.ts:36", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/debugLog.ts:36"}, "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-434787f9a0a02cf5", "name": "Stray `console.log` in TS/JS \u2014 src/utils/debug.ts:17", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/debug.ts:17"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e6d9c0e1b0fb13eb", "name": "TODO/FIXME marker in shipping code \u2014 src/components/common/ErrorBoundary.tsx:67", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/components/common/ErrorBoundary.tsx:67"}, "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-164247dfc8e9164b", "name": "Stray `console.log` in TS/JS \u2014 src/components/setup/PlayerSetup.tsx:36", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/setup/PlayerSetup.tsx:36"}, "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-6be8ed8d7ab08a01", "name": "React Flow <MiniMap> without dark background \u2014 src/components/board/BoardCanvas.tsx:802", "shortDescription": {"text": "React Flow <MiniMap> without dark background \u2014 src/components/board/BoardCanvas.tsx:802"}, "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-15a5618b3c50dcef", "name": "React Flow <Controls> without dark theming \u2014 src/components/board/BoardCanvas.tsx:786", "shortDescription": {"text": "React Flow <Controls> without dark theming \u2014 src/components/board/BoardCanvas.tsx:786"}, "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-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-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-55bcdd7f724f133f", "name": "Insecure pattern 'node_child_process' in vite.config.ts:4", "shortDescription": {"text": "Insecure pattern 'node_child_process' in vite.config.ts:4"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-38236b5f11b1a958", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/archive/prototypes/elk_prototype.html:986", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/archive/prototypes/elk_prototype.html:986"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-07ed3d68816aa910", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/archive/prototypes/board_v3_prototype.html:1281", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/archive/prototypes/board_v3_prototype.html:1281"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-744fdecba2f172e4", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/archive/prototypes/svg_arrows_prototype.html:510", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/archive/prototypes/svg_arrows_prototype.html:510"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5a2a9e19708b604e", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/archive/prototypes/dynamic_path_mockup.html:272", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/archive/prototypes/dynamic_path_mockup.html:272"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a1df6ae87b575bdb", "name": "Insecure pattern 'document_write' in src/utils/logExport.ts:228", "shortDescription": {"text": "Insecure pattern 'document_write' in src/utils/logExport.ts:228"}, "fullDescription": {"text": "Found a known-risky pattern (document_write). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a47196b76ceb8d2b", "name": "Very large file: tests/services/EffectEngineService.test.ts (1695 lines)", "shortDescription": {"text": "Very large file: tests/services/EffectEngineService.test.ts (1695 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-34213dccf8337db7", "name": "Very large file: tests/services/MovementService.test.ts (1679 lines)", "shortDescription": {"text": "Very large file: tests/services/MovementService.test.ts (1679 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-f0519ff2a8216b90", "name": "Very large file: tests/services/CardService.test.ts (1942 lines)", "shortDescription": {"text": "Very large file: tests/services/CardService.test.ts (1942 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-05df2d0be229300d", "name": "Very large file: server/server.js (2181 lines)", "shortDescription": {"text": "Very large file: server/server.js (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-74575d935c5e8d7a", "name": "Very large file: src/components/layout/GameLayout.tsx (1362 lines)", "shortDescription": {"text": "Very large file: src/components/layout/GameLayout.tsx (1362 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-02e2e4355cb74b16", "name": "Very large file: src/components/setup/PlayerSetup.tsx (1611 lines)", "shortDescription": {"text": "Very large file: src/components/setup/PlayerSetup.tsx (1611 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-bb7f21cf6d76d27d", "name": "Very large file: src/services/CardService.ts (2260 lines)", "shortDescription": {"text": "Very large file: src/services/CardService.ts (2260 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-f95476b7e50adaa8", "name": "Very large file: src/services/TurnService.ts (2187 lines)", "shortDescription": {"text": "Very large file: src/services/TurnService.ts (2187 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-4c02a79ddfaefc3e", "name": "Very large file: src/services/MovementService.ts (1390 lines)", "shortDescription": {"text": "Very large file: src/services/MovementService.ts (1390 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-e6858dc726525bde", "name": "Very large file: src/services/StateService.ts (1931 lines)", "shortDescription": {"text": "Very large file: src/services/StateService.ts (1931 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-48f6bc560e27984f", "name": "Very large file: src/services/EffectEngineService.ts (1515 lines)", "shortDescription": {"text": "Very large file: src/services/EffectEngineService.ts (1515 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-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "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 209 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 63 placeholder/mock markers across 19 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-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "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 license, ci. 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-90eb0bc8dfcec6f5", "name": "Agent instruction/config may expose a secret: docs/core/CLAUDE.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: docs/core/CLAUDE.md"}, "fullDescription": {"text": "Agent-facing files are routinely pasted into LLM/tool contexts. Move literal tokens, keys, and passwords into a secret manager or document them as placeholders only."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-505bc666a82f9849", "name": "Agent instruction/config may expose a secret: .claude/settings.local.json", "shortDescription": {"text": "Agent instruction/config may expose a secret: .claude/settings.local.json"}, "fullDescription": {"text": "Agent-facing files are routinely pasted into LLM/tool contexts. Move literal tokens, keys, and passwords into a secret manager or document them as placeholders only."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-756f1ced40bd4a05", "name": "Agent authority lacks a verifier contract: .claude/commands/start.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/commands/start.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9ed466dda0adeea2", "name": "Commented-code block (6 lines) in vite.config.ts:190", "shortDescription": {"text": "Commented-code block (6 lines) in vite.config.ts:190"}, "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-b299056cc14973e8", "name": "Commented-code block (6 lines) in vitest.config.dev.ts:56", "shortDescription": {"text": "Commented-code block (6 lines) in vitest.config.dev.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-812c6301df30b3f3", "name": "Commented-code block (5 lines) in tests/integration/cardTextMatchesColumns.test.ts:247", "shortDescription": {"text": "Commented-code block (5 lines) in tests/integration/cardTextMatchesColumns.test.ts:247"}, "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-8576c6052121119c", "name": "Commented-code block (7 lines) in tests/integration/TransactionalLoggingFlow.test.ts:127", "shortDescription": {"text": "Commented-code block (7 lines) in tests/integration/TransactionalLoggingFlow.test.ts:127"}, "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-0354a323fe449f94", "name": "Commented-code block (11 lines) in tests/ghost/finalReviewStaleIntent.test.ts:5", "shortDescription": {"text": "Commented-code block (11 lines) in tests/ghost/finalReviewStaleIntent.test.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-76bd52489101a514", "name": "Commented-code block (7 lines) in tests/ghost/dataIntegrity.test.ts:128", "shortDescription": {"text": "Commented-code block (7 lines) in tests/ghost/dataIntegrity.test.ts: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-93f3e2049c9c9caa", "name": "Commented-code block (10 lines) in tests/ghost/ghostPlayer.test.ts:63", "shortDescription": {"text": "Commented-code block (10 lines) in tests/ghost/ghostPlayer.test.ts:63"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3b935793c4ac5a75", "name": "Commented-code block (6 lines) in tests/ghost/coverage.test.ts:137", "shortDescription": {"text": "Commented-code block (6 lines) in tests/ghost/coverage.test.ts:137"}, "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-edd0629d8ced7bf0", "name": "Commented-code block (7 lines) in tests/ghost/ghostPlayer.ts:341", "shortDescription": {"text": "Commented-code block (7 lines) in tests/ghost/ghostPlayer.ts:341"}, "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-77e9269a8729296d", "name": "Commented-code block (5 lines) in tests/utils/buttonFormatting.test.ts:108", "shortDescription": {"text": "Commented-code block (5 lines) in tests/utils/buttonFormatting.test.ts:108"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5d08c5ff0e154920", "name": "Commented-code block (5 lines) in tests/utils/consoleCapture.test.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in tests/utils/consoleCapture.test.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-7414720790f9195d", "name": "Commented-code block (6 lines) in tests/components/NegotiationModal.test.tsx:203", "shortDescription": {"text": "Commented-code block (6 lines) in tests/components/NegotiationModal.test.tsx:203"}, "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-457bd26f746aaaea", "name": "Commented-code block (5 lines) in tests/components/player/ApprovalBadges.test.tsx:76", "shortDescription": {"text": "Commented-code block (5 lines) in tests/components/player/ApprovalBadges.test.tsx:76"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8fe5546e0534dd58", "name": "Commented-code block (7 lines) in tests/components/player/ActionCenterPanel.test.tsx:246", "shortDescription": {"text": "Commented-code block (7 lines) in tests/components/player/ActionCenterPanel.test.tsx:246"}, "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-afa59efe5bb1e917", "name": "Commented-code block (7 lines) in tests/components/player/pendingActionsCollapse.test.ts:6", "shortDescription": {"text": "Commented-code block (7 lines) in tests/components/player/pendingActionsCollapse.test.ts:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-575950cb7a9daea7", "name": "Commented-code block (6 lines) in tests/components/modals/LifeEventModal.test.tsx:12", "shortDescription": {"text": "Commented-code block (6 lines) in tests/components/modals/LifeEventModal.test.tsx:12"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cce5f3c2873460a7", "name": "Commented-code block (5 lines) in tests/components/modals/DiceResultModal.test.tsx:326", "shortDescription": {"text": "Commented-code block (5 lines) in tests/components/modals/DiceResultModal.test.tsx:326"}, "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-db84b2c8a89fcbd8", "name": "Commented-code block (6 lines) in tests/components/classroom/ClassroomSetup.test.tsx:1", "shortDescription": {"text": "Commented-code block (6 lines) in tests/components/classroom/ClassroomSetup.test.tsx: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-7493f9aaf6166561", "name": "Commented-code block (5 lines) in tests/components/editor/BugReportsPanel.test.tsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in tests/components/editor/BugReportsPanel.test.tsx: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-0a50fd1a97afee32", "name": "Commented-code block (5 lines) in tests/components/editor/csvExport.test.ts:422", "shortDescription": {"text": "Commented-code block (5 lines) in tests/components/editor/csvExport.test.ts:422"}, "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-7b00eb9524471e51", "name": "Commented-code block (5 lines) in tests/components/board/saveBoardPosition.test.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in tests/components/board/saveBoardPosition.test.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-240965885727db4e", "name": "Commented-code block (5 lines) in tests/hooks/useModalQueue.test.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in tests/hooks/useModalQueue.test.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-ea61da5aef0c7d2e", "name": "Commented-code block (5 lines) in tests/server/processGameData.test.ts:162", "shortDescription": {"text": "Commented-code block (5 lines) in tests/server/processGameData.test.ts:162"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-55756ba603b65067", "name": "Commented-code block (5 lines) in tests/server/authGuards.test.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in tests/server/authGuards.test.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-9424fdf3fca8298a", "name": "Commented-code block (5 lines) in tests/server/instanceResolver.test.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in tests/server/instanceResolver.test.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-702eac34bad86167", "name": "Commented-code block (6 lines) in tests/server/spaceProtection.test.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in tests/server/spaceProtection.test.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-8e130ca5b8048bde", "name": "Commented-code block (6 lines) in tests/server/serverEndpointAuth.test.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in tests/server/serverEndpointAuth.test.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-f48483290a283b3d", "name": "Commented-code block (6 lines) in tests/server/instanceValidation.test.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in tests/server/instanceValidation.test.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-b2f158509b970666", "name": "Commented-code block (7 lines) in tests/server/websocketAuth.test.ts:1", "shortDescription": {"text": "Commented-code block (7 lines) in tests/server/websocketAuth.test.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-4d96376f0ca29f7e", "name": "Commented-code block (6 lines) in tests/services/StateService-tryAgainApprovals.test.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in tests/services/StateService-tryAgainApprovals.test.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-f5f75df266af748a", "name": "Commented-code block (6 lines) in tests/services/StateService-actionCounter.test.ts:4", "shortDescription": {"text": "Commented-code block (6 lines) in tests/services/StateService-actionCounter.test.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-899e4b783f08434c", "name": "Commented-code block (5 lines) in tests/services/MovementService-unifiedResolver.test.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in tests/services/MovementService-unifiedResolver.test.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-1dfa10be375162f0", "name": "Commented-code block (5 lines) in tests/services/TurnService-tryAgainOnSpace.test.ts:276", "shortDescription": {"text": "Commented-code block (5 lines) in tests/services/TurnService-tryAgainOnSpace.test.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-c081e4f30b9f6451", "name": "Commented-code block (5 lines) in tests/services/TurnService.test.ts:1246", "shortDescription": {"text": "Commented-code block (5 lines) in tests/services/TurnService.test.ts:1246"}, "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-fc9334487d2200d7", "name": "Commented-code block (5 lines) in tests/services/CardEffectHandler.test.ts:13", "shortDescription": {"text": "Commented-code block (5 lines) in tests/services/CardEffectHandler.test.ts:13"}, "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-bd66b0657db55f7a", "name": "Commented-code block (5 lines) in tests/services/EffectEngineService.test.ts:960", "shortDescription": {"text": "Commented-code block (5 lines) in tests/services/EffectEngineService.test.ts:960"}, "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-86d9f8a15f5aba12", "name": "Commented-code block (5 lines) in tests/services/MovementExecutor.test.ts:138", "shortDescription": {"text": "Commented-code block (5 lines) in tests/services/MovementExecutor.test.ts:138"}, "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-0488a8f2d2782537", "name": "Commented-code block (8 lines) in tests/services/MovementService.test.ts:653", "shortDescription": {"text": "Commented-code block (8 lines) in tests/services/MovementService.test.ts:653"}, "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-519995aa23e715f0", "name": "Commented-code block (5 lines) in tests/services/MovementService-visitTypeInvariant.test.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in tests/services/MovementService-visitTypeInvariant.test.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-b339f127a3b3b912", "name": "Commented-code block (6 lines) in tests/services/PlayerActionService.test.ts:617", "shortDescription": {"text": "Commented-code block (6 lines) in tests/services/PlayerActionService.test.ts:617"}, "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-26302e7815eda9a6", "name": "Commented-code block (7 lines) in tests/services/TurnStateManager-deepClone.test.ts:5", "shortDescription": {"text": "Commented-code block (7 lines) in tests/services/TurnStateManager-deepClone.test.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-9f468705dc77f870", "name": "Commented-code block (5 lines) in tests/services/CardService.test.ts:1002", "shortDescription": {"text": "Commented-code block (5 lines) in tests/services/CardService.test.ts:1002"}, "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-e4128e1faf0cb1c3", "name": "Commented-code block (5 lines) in tests/features/ManualFunding.test.ts:182", "shortDescription": {"text": "Commented-code block (5 lines) in tests/features/ManualFunding.test.ts:182"}, "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-84fa066534e2c6c8", "name": "Commented-code block (5 lines) in docs/archive/legacy_data/process_game_data.py:283", "shortDescription": {"text": "Commented-code block (5 lines) in docs/archive/legacy_data/process_game_data.py:283"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3b0fb4c4897909f0", "name": "Legacy-named symbol `code2026_cards_backup` in docs/archive/legacy_data/convert_cards.py:11", "shortDescription": {"text": "Legacy-named symbol `code2026_cards_backup` in docs/archive/legacy_data/convert_cards.py:11"}, "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-5d46d57482b56beb", "name": "Legacy-named symbol `code2026_cards_backup` in docs/archive/legacy_data/convert_cards_expanded.py:11", "shortDescription": {"text": "Legacy-named symbol `code2026_cards_backup` in docs/archive/legacy_data/convert_cards_expanded.py:11"}, "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-b1b3ff3510d3cbed", "name": "Commented-code block (5 lines) in scripts/seed-board-positions.mjs:6", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/seed-board-positions.mjs:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8584179a3054a278", "name": "Commented-code block (5 lines) in scripts/regen-clean-files.mjs:2", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/regen-clean-files.mjs:2"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d9694428c4dc6c53", "name": "Commented-code block (7 lines) in scripts/set-narrative.mjs:36", "shortDescription": {"text": "Commented-code block (7 lines) in scripts/set-narrative.mjs:36"}, "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-c750dcb0b11f8a8a", "name": "Commented-code block (5 lines) in scripts/merge-voice-rewrite.mjs:2", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/merge-voice-rewrite.mjs:2"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1f7d02eaeb7a51be", "name": "Commented-code block (5 lines) in server/instanceCatalog.js:4", "shortDescription": {"text": "Commented-code block (5 lines) in server/instanceCatalog.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-9e46729979b3816e", "name": "Commented-code block (5 lines) in server/migrateCheck.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in server/migrateCheck.js: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-4df21a3dd6570140", "name": "Commented-code block (5 lines) in server/accountStore.js:9", "shortDescription": {"text": "Commented-code block (5 lines) in server/accountStore.js:9"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2a71cc4221a30ecc", "name": "Commented-code block (8 lines) in server/websocket.js:5", "shortDescription": {"text": "Commented-code block (8 lines) in server/websocket.js: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-252b08ee577ff081", "name": "Commented-code block (5 lines) in server/processGameData.js:176", "shortDescription": {"text": "Commented-code block (5 lines) in server/processGameData.js:176"}, "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-0368ad424be20823", "name": "Commented-code block (9 lines) in server/instanceResolver.js:8", "shortDescription": {"text": "Commented-code block (9 lines) in server/instanceResolver.js:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-690d52ace68972f1", "name": "Commented-code block (8 lines) in server/server.js:1", "shortDescription": {"text": "Commented-code block (8 lines) in server/server.js: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-0077796b20f52b58", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server/server.js:438", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/server.js:438"}, "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-8fc5a806a23851b5", "name": "Commented-code block (11 lines) in server/spaceProtection.js:7", "shortDescription": {"text": "Commented-code block (11 lines) in server/spaceProtection.js:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a42afee444b63ad5", "name": "Commented-code block (5 lines) in server/instanceValidation.js:4", "shortDescription": {"text": "Commented-code block (5 lines) in server/instanceValidation.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-e3fa707df272383a", "name": "Commented-code block (5 lines) in server/migrateInstance.js:7", "shortDescription": {"text": "Commented-code block (5 lines) in server/migrateInstance.js:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b09db8902d8c204f", "name": "Commented-code block (8 lines) in server/authGuards.js:6", "shortDescription": {"text": "Commented-code block (8 lines) in server/authGuards.js:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c6665623f8e10291", "name": "Commented-code block (8 lines) in src/App.tsx:117", "shortDescription": {"text": "Commented-code block (8 lines) in src/App.tsx:117"}, "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-e3b491822652d235", "name": "Commented-code block (6 lines) in src/types/EffectTypes.ts:45", "shortDescription": {"text": "Commented-code block (6 lines) in src/types/EffectTypes.ts:45"}, "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-a190f463c67b27b6", "name": "Commented-code block (7 lines) in src/types/ServiceContracts.ts:503", "shortDescription": {"text": "Commented-code block (7 lines) in src/types/ServiceContracts.ts:503"}, "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-bc4f93af02e51cdb", "name": "Commented-code block (6 lines) in src/types/CommonTypes.ts:13", "shortDescription": {"text": "Commented-code block (6 lines) in src/types/CommonTypes.ts:13"}, "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-90420822f65944a1", "name": "Commented-code block (9 lines) in src/types/DataTypes.ts:109", "shortDescription": {"text": "Commented-code block (9 lines) in src/types/DataTypes.ts:109"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-67a21702c4dae871", "name": "Commented-code block (7 lines) in src/types/StateTypes.ts:301", "shortDescription": {"text": "Commented-code block (7 lines) in src/types/StateTypes.ts:301"}, "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-c2ebc227794dd9c1", "name": "Commented-code block (8 lines) in src/utils/relatedTab.ts:6", "shortDescription": {"text": "Commented-code block (8 lines) in src/utils/relatedTab.ts:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4a501a31cc29df9e", "name": "Commented-code block (6 lines) in src/utils/buttonFormatting.ts:143", "shortDescription": {"text": "Commented-code block (6 lines) in src/utils/buttonFormatting.ts:143"}, "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-ece74c1abefa9ecc", "name": "Commented-code block (7 lines) in src/utils/lifeEventReceipts.ts:5", "shortDescription": {"text": "Commented-code block (7 lines) in src/utils/lifeEventReceipts.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-2b3a82478d0b2b9e", "name": "Commented-code block (7 lines) in src/utils/boardCommon.ts:8", "shortDescription": {"text": "Commented-code block (7 lines) in src/utils/boardCommon.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-6854de1e99d6de33", "name": "Commented-code block (6 lines) in src/utils/resourceSnapshot.ts:5", "shortDescription": {"text": "Commented-code block (6 lines) in src/utils/resourceSnapshot.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-904216ac63c6c2c4", "name": "Legacy-named symbol `show_ad_copy` in src/utils/remoteConfig.ts:26", "shortDescription": {"text": "Legacy-named symbol `show_ad_copy` in src/utils/remoteConfig.ts:26"}, "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-26b60d52d3dd8f5c", "name": "Commented-code block (9 lines) in src/utils/endGameInsights.ts:7", "shortDescription": {"text": "Commented-code block (9 lines) in src/utils/endGameInsights.ts:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7730a974c24b3409", "name": "Commented-code block (5 lines) in src/utils/logFiltering.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/utils/logFiltering.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-7d9f7bd39d50bdc6", "name": "Commented-code block (7 lines) in src/utils/dataInstance.ts:4", "shortDescription": {"text": "Commented-code block (7 lines) in src/utils/dataInstance.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-4537683e88ab298b", "name": "Commented-code block (5 lines) in src/utils/haptics.ts:14", "shortDescription": {"text": "Commented-code block (5 lines) in src/utils/haptics.ts:14"}, "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-27e004ff1472e18c", "name": "Commented-code block (6 lines) in src/utils/teacherAuth.ts:4", "shortDescription": {"text": "Commented-code block (6 lines) in src/utils/teacherAuth.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-629ecd0e047b497a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/utils/teacherAuth.ts:72", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/utils/teacherAuth.ts:72"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ca9ccd8e3736326b", "name": "Commented-code block (5 lines) in src/utils/endGameStats.ts:7", "shortDescription": {"text": "Commented-code block (5 lines) in src/utils/endGameStats.ts:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b4d99cfffb169d22", "name": "Commented-code block (5 lines) in src/components/layout/GameLayout.tsx:90", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/layout/GameLayout.tsx:90"}, "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-773447e3ecd38310", "name": "Commented-code block (8 lines) in src/components/layout/TVDisplay.tsx:543", "shortDescription": {"text": "Commented-code block (8 lines) in src/components/layout/TVDisplay.tsx:543"}, "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-b198eb157d4e19cb", "name": "Commented-code block (5 lines) in src/components/player/ActionCenterPanel.tsx:281", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/player/ActionCenterPanel.tsx:281"}, "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-8023dcd4857a61d7", "name": "Commented-code block (5 lines) in src/components/player/ApprovalBadges.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/player/ApprovalBadges.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-af68fc02060ac8df", "name": "Commented-code block (6 lines) in src/components/player/pendingActionsCollapse.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/player/pendingActionsCollapse.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-c7aa5786ea4c8118", "name": "Commented-code block (6 lines) in src/components/player/sections/FinancesSection.tsx:258", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/player/sections/FinancesSection.tsx:258"}, "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-d9c05d76e197d2e3", "name": "Commented-code block (5 lines) in src/components/player/sections/CardsSection.tsx:113", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/player/sections/CardsSection.tsx:113"}, "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-d491bfd5d6f9254b", "name": "Commented-code block (6 lines) in src/components/player/sections/StoryAccordion.tsx:4", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/player/sections/StoryAccordion.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-f845f55ceefd2733", "name": "Commented-code block (13 lines) in src/components/modals/LifeEventModal.tsx:5", "shortDescription": {"text": "Commented-code block (13 lines) in src/components/modals/LifeEventModal.tsx: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-502163a3c7b35140", "name": "Commented-code block (6 lines) in src/components/modals/RoutingExplanationModal.tsx:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/modals/RoutingExplanationModal.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-e840b66f2563e7af", "name": "Commented-code block (6 lines) in src/components/modals/ChoiceModal.tsx:23", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/modals/ChoiceModal.tsx:23"}, "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-0068911f358cd6ef", "name": "Commented-code block (9 lines) in src/components/modals/DiceResultModal.tsx:103", "shortDescription": {"text": "Commented-code block (9 lines) in src/components/modals/DiceResultModal.tsx:103"}, "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-f43e40f08dc492a6", "name": "Commented-code block (8 lines) in src/components/modals/shared/ModalBase.tsx:36", "shortDescription": {"text": "Commented-code block (8 lines) in src/components/modals/shared/ModalBase.tsx:36"}, "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-afceb47914be889a", "name": "Commented-code block (5 lines) in src/components/classroom/ClassroomSetup.tsx:6", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/classroom/ClassroomSetup.tsx:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-315b4b43723b370d", "name": "Commented-code block (5 lines) in src/components/classroom/classroomAdminApi.ts:6", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/classroom/classroomAdminApi.ts:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a9d0b4ae63f4b12c", "name": "Commented-code block (5 lines) in src/components/game/GameLog.tsx:99", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/game/GameLog.tsx:99"}, "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-0cd92309021a17ab", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/editor/DataEditor.tsx:128", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/editor/DataEditor.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-58ebfd143d7e5bdf", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/editor/BugReportsPanel.tsx:72", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/editor/BugReportsPanel.tsx:72"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e673b5aabd909e05", "name": "Commented-code block (9 lines) in src/components/setup/PlayerList.tsx:308", "shortDescription": {"text": "Commented-code block (9 lines) in src/components/setup/PlayerList.tsx:308"}, "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-911e898735ab79c3", "name": "Commented-code block (5 lines) in src/components/setup/useGitHubSyncStatus.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/setup/useGitHubSyncStatus.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-48604903902f760e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/setup/useGitHubSyncStatus.ts:51", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/setup/useGitHubSyncStatus.ts:51"}, "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-1088f6a6c0633887", "name": "Commented-code block (9 lines) in src/components/setup/PlayerSetup.tsx:80", "shortDescription": {"text": "Commented-code block (9 lines) in src/components/setup/PlayerSetup.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-6b03160009858a56", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/setup/PlayerSetup.tsx:273", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/setup/PlayerSetup.tsx:273"}, "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-6c782176fe1600de", "name": "Commented-code block (6 lines) in src/components/board/BoardToggle.tsx:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/board/BoardToggle.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-bffb1b0b873f720e", "name": "Commented-code block (5 lines) in src/components/board/BoardLayoutEditor.tsx:10", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/board/BoardLayoutEditor.tsx:10"}, "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-71f6b076359ac9fc", "name": "Commented-code block (5 lines) in src/components/board/BoardCanvas.tsx:5", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/board/BoardCanvas.tsx: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-518f4f1af278221b", "name": "Commented-code block (6 lines) in src/components/feedback/FeedbackButton.tsx:74", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/feedback/FeedbackButton.tsx:74"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-54ca12fe669315e1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/feedback/FeedbackButton.tsx:216", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/feedback/FeedbackButton.tsx:216"}, "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-7cd99343790e9f1c", "name": "Legacy-named symbol `show_ad_copy` in src/dictionary/components/DictionaryPanel.tsx:410", "shortDescription": {"text": "Legacy-named symbol `show_ad_copy` in src/dictionary/components/DictionaryPanel.tsx:410"}, "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-3446db0306283f9c", "name": "Commented-code block (6 lines) in src/dictionary/components/DictionaryHint.tsx:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/dictionary/components/DictionaryHint.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-bf0ad2168e7ff638", "name": "Commented-code block (6 lines) in src/hooks/useModalQueue.ts:11", "shortDescription": {"text": "Commented-code block (6 lines) in src/hooks/useModalQueue.ts:11"}, "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-6dab1d7a3ecbac41", "name": "Commented-code block (6 lines) in src/services/DiceService.ts:6", "shortDescription": {"text": "Commented-code block (6 lines) in src/services/DiceService.ts:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-da2ffebc3ad9c96c", "name": "Commented-code block (5 lines) in src/services/WebSocketSyncService.ts:447", "shortDescription": {"text": "Commented-code block (5 lines) in src/services/WebSocketSyncService.ts:447"}, "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-ada77a4eabfed098", "name": "Commented-code block (5 lines) in src/services/GameRulesService.ts:106", "shortDescription": {"text": "Commented-code block (5 lines) in src/services/GameRulesService.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-0f424101453df374", "name": "Commented-code block (7 lines) in src/services/TurnTransitionHandler.ts:81", "shortDescription": {"text": "Commented-code block (7 lines) in src/services/TurnTransitionHandler.ts: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-c88449ca3c6ec3a1", "name": "Commented-code block (5 lines) in src/services/CardService.ts:9", "shortDescription": {"text": "Commented-code block (5 lines) in src/services/CardService.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-ea04e59ff774bc5e", "name": "Commented-code block (6 lines) in src/services/TurnService.ts:97", "shortDescription": {"text": "Commented-code block (6 lines) in src/services/TurnService.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-cdc2a823648ee7cd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/services/DataService.ts:471", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/services/DataService.ts:471"}, "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-55541a71fbf7cf28", "name": "Commented-code block (5 lines) in src/services/MovementService.ts:11", "shortDescription": {"text": "Commented-code block (5 lines) in src/services/MovementService.ts:11"}, "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-42df2b39a0e71b14", "name": "Commented-code block (7 lines) in src/services/SpaceEffectService.ts:32", "shortDescription": {"text": "Commented-code block (7 lines) in src/services/SpaceEffectService.ts:32"}, "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-cd564e4364e0da8b", "name": "Commented-code block (6 lines) in src/services/SpaceArrivalProcessor.ts:238", "shortDescription": {"text": "Commented-code block (6 lines) in src/services/SpaceArrivalProcessor.ts:238"}, "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-46d72df0d3591947", "name": "Commented-code block (8 lines) in src/services/CardEffectHandler.ts:89", "shortDescription": {"text": "Commented-code block (8 lines) in src/services/CardEffectHandler.ts:89"}, "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-9d18896380281090", "name": "Commented-code block (7 lines) in src/services/ServerSyncService.ts:164", "shortDescription": {"text": "Commented-code block (7 lines) in src/services/ServerSyncService.ts:164"}, "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-44fb7b038260f09b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/services/ServerSyncService.ts:185", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/services/ServerSyncService.ts:185"}, "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-38dafa03d21f48aa", "name": "Commented-code block (8 lines) in src/services/PlayerActionService.ts:110", "shortDescription": {"text": "Commented-code block (8 lines) in src/services/PlayerActionService.ts:110"}, "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-51efee7b631c1556", "name": "Commented-code block (7 lines) in src/services/MovementExecutor.ts:31", "shortDescription": {"text": "Commented-code block (7 lines) in src/services/MovementExecutor.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-ec685b20c6fc5b39", "name": "Commented-code block (5 lines) in src/services/FinancialEffectHandler.ts:277", "shortDescription": {"text": "Commented-code block (5 lines) in src/services/FinancialEffectHandler.ts:277"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-992e17f7321606f1", "name": "Commented-code block (6 lines) in src/services/StateService.ts:30", "shortDescription": {"text": "Commented-code block (6 lines) in src/services/StateService.ts:30"}, "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-0445b5bd98cc026c", "name": "Commented-code block (5 lines) in src/services/DiceRollProcessor.ts:96", "shortDescription": {"text": "Commented-code block (5 lines) in src/services/DiceRollProcessor.ts:96"}, "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-17728108242d3f08", "name": "Commented-code block (6 lines) in src/services/EffectEngineService.ts:346", "shortDescription": {"text": "Commented-code block (6 lines) in src/services/EffectEngineService.ts:346"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dee3ffc710d75d9b", "name": "Commented-code block (5 lines) in src/services/ChoiceService.ts:25", "shortDescription": {"text": "Commented-code block (5 lines) in src/services/ChoiceService.ts:25"}, "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-d0b17c8c07a7421d", "name": "8 env vars used in code but missing from .env.example", "shortDescription": {"text": "8 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ALLOWED_ORIGINS`, `DATA_DIR`, `DIST_PATH`, `GAMES_FILE`, `LOG_FILE`, `VITE_CONFIG_URL`, `VITE_GIT_COMMIT`, `VITE_SERVER_URL`. 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-ca99470ce1d43689", "name": "Dangling fetch: POST https://ntfy.sh/${CONFIG.NTFY_TOPIC} (server/server.js:438)", "shortDescription": {"text": "Dangling fetch: POST https://ntfy.sh/${CONFIG.NTFY_TOPIC} (server/server.js:438)"}, "fullDescription": {"text": "`server/server.js:438` calls `POST https://ntfy.sh/${CONFIG.NTFY_TOPIC}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/ntfy.sh/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-925a997986700044", "name": "Unused endpoint: USE /data/i/:instanceId", "shortDescription": {"text": "Unused endpoint: USE /data/i/:instanceId"}, "fullDescription": {"text": "`server/server.js` declares `USE /data/i/:instanceId` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4895e5e6f245af90", "name": "Unused endpoint: USE /data", "shortDescription": {"text": "Unused endpoint: USE /data"}, "fullDescription": {"text": "`server/server.js` declares `USE /data` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-db796533ead108fe", "name": "Unused endpoint: POST /api/admin/verify", "shortDescription": {"text": "Unused endpoint: POST /api/admin/verify"}, "fullDescription": {"text": "`server/server.js` declares `POST /api/admin/verify` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-71bee279cd5d0094", "name": "Unused endpoint: POST /api/admin/save-source-files", "shortDescription": {"text": "Unused endpoint: POST /api/admin/save-source-files"}, "fullDescription": {"text": "`server/server.js` declares `POST /api/admin/save-source-files` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-162b47cf92a974d2", "name": "Unused endpoint: POST /api/admin/reset-to-baseline", "shortDescription": {"text": "Unused endpoint: POST /api/admin/reset-to-baseline"}, "fullDescription": {"text": "`server/server.js` declares `POST /api/admin/reset-to-baseline` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8e5ff9478e25e412", "name": "Unused endpoint: GET /api/instances/mine", "shortDescription": {"text": "Unused endpoint: GET /api/instances/mine"}, "fullDescription": {"text": "`server/server.js` declares `GET /api/instances/mine` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-92e55a7c65874cbd", "name": "Unused endpoint: POST /api/instances", "shortDescription": {"text": "Unused endpoint: POST /api/instances"}, "fullDescription": {"text": "`server/server.js` declares `POST /api/instances` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cc3555243cfc01bf", "name": "Unused endpoint: DELETE /api/instances/:id", "shortDescription": {"text": "Unused endpoint: DELETE /api/instances/:id"}, "fullDescription": {"text": "`server/server.js` declares `DELETE /api/instances/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f89286691a216a84", "name": "Unused endpoint: GET /api/instances/:id", "shortDescription": {"text": "Unused endpoint: GET /api/instances/:id"}, "fullDescription": {"text": "`server/server.js` declares `GET /api/instances/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-da71db9cf2fa9455", "name": "Unused endpoint: GET /api/instances/:id/catalog", "shortDescription": {"text": "Unused endpoint: GET /api/instances/:id/catalog"}, "fullDescription": {"text": "`server/server.js` declares `GET /api/instances/:id/catalog` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b23b1f655f153344", "name": "Unused endpoint: POST /api/instances/:id/board", "shortDescription": {"text": "Unused endpoint: POST /api/instances/:id/board"}, "fullDescription": {"text": "`server/server.js` declares `POST /api/instances/:id/board` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ae97a6fb782141ff", "name": "Unused endpoint: POST /api/instances/:id/copies", "shortDescription": {"text": "Unused endpoint: POST /api/instances/:id/copies"}, "fullDescription": {"text": "`server/server.js` declares `POST /api/instances/:id/copies` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8f455622e9f00923", "name": "Unused endpoint: PATCH /api/instances/:id/copies/:copyId", "shortDescription": {"text": "Unused endpoint: PATCH /api/instances/:id/copies/:copyId"}, "fullDescription": {"text": "`server/server.js` declares `PATCH /api/instances/:id/copies/:copyId` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cc3fac58aa19e13f", "name": "Unused endpoint: DELETE /api/instances/:id/copies/:copyId", "shortDescription": {"text": "Unused endpoint: DELETE /api/instances/:id/copies/:copyId"}, "fullDescription": {"text": "`server/server.js` declares `DELETE /api/instances/:id/copies/:copyId` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7c8f0f1041c3dccd", "name": "Unused endpoint: POST /api/instances/:id/positions", "shortDescription": {"text": "Unused endpoint: POST /api/instances/:id/positions"}, "fullDescription": {"text": "`server/server.js` declares `POST /api/instances/:id/positions` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2df710713760d2c1", "name": "Unused endpoint: POST /api/accounts/login", "shortDescription": {"text": "Unused endpoint: POST /api/accounts/login"}, "fullDescription": {"text": "`server/server.js` declares `POST /api/accounts/login` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ca162536e1623293", "name": "Unused endpoint: POST /api/accounts/logout", "shortDescription": {"text": "Unused endpoint: POST /api/accounts/logout"}, "fullDescription": {"text": "`server/server.js` declares `POST /api/accounts/logout` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8ac3a208cf6bdc6d", "name": "Unused endpoint: GET /api/accounts/me", "shortDescription": {"text": "Unused endpoint: GET /api/accounts/me"}, "fullDescription": {"text": "`server/server.js` declares `GET /api/accounts/me` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0201f79d295cb727", "name": "Unused endpoint: GET /api/admin/accounts", "shortDescription": {"text": "Unused endpoint: GET /api/admin/accounts"}, "fullDescription": {"text": "`server/server.js` declares `GET /api/admin/accounts` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1e102ed59a789bcb", "name": "Unused endpoint: POST /api/admin/accounts", "shortDescription": {"text": "Unused endpoint: POST /api/admin/accounts"}, "fullDescription": {"text": "`server/server.js` declares `POST /api/admin/accounts` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ae84bb2d4c9f1a38", "name": "Unused endpoint: POST /api/admin/accounts/:id/reset-password", "shortDescription": {"text": "Unused endpoint: POST /api/admin/accounts/:id/reset-password"}, "fullDescription": {"text": "`server/server.js` declares `POST /api/admin/accounts/:id/reset-password` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa10bcd05f5f43e8", "name": "Unused endpoint: DELETE /api/admin/accounts/:id", "shortDescription": {"text": "Unused endpoint: DELETE /api/admin/accounts/:id"}, "fullDescription": {"text": "`server/server.js` declares `DELETE /api/admin/accounts/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-104a21ab57cf5133", "name": "Unused endpoint: GET /api/admin/instances", "shortDescription": {"text": "Unused endpoint: GET /api/admin/instances"}, "fullDescription": {"text": "`server/server.js` declares `GET /api/admin/instances` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c1892425cf85563a", "name": "Unused endpoint: POST /api/admin/instances", "shortDescription": {"text": "Unused endpoint: POST /api/admin/instances"}, "fullDescription": {"text": "`server/server.js` declares `POST /api/admin/instances` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3922de4367054d74", "name": "Unused endpoint: POST /api/admin/instances/:id/owner", "shortDescription": {"text": "Unused endpoint: POST /api/admin/instances/:id/owner"}, "fullDescription": {"text": "`server/server.js` declares `POST /api/admin/instances/:id/owner` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a06cffee5112e296", "name": "Unused endpoint: GET /api/games", "shortDescription": {"text": "Unused endpoint: GET /api/games"}, "fullDescription": {"text": "`server/server.js` declares `GET /api/games` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e9512e620fe1f405", "name": "Unused endpoint: POST /api/games", "shortDescription": {"text": "Unused endpoint: POST /api/games"}, "fullDescription": {"text": "`server/server.js` declares `POST /api/games` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-23eb683a499f21b0", "name": "Unused endpoint: DELETE /api/games/:gameId", "shortDescription": {"text": "Unused endpoint: DELETE /api/games/:gameId"}, "fullDescription": {"text": "`server/server.js` declares `DELETE /api/games/:gameId` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-83ec50e5b8384385", "name": "Unused endpoint: GET /api/games/:gameId/join-info", "shortDescription": {"text": "Unused endpoint: GET /api/games/:gameId/join-info"}, "fullDescription": {"text": "`server/server.js` declares `GET /api/games/:gameId/join-info` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b60bff4429fbc3e2", "name": "Unused endpoint: GET /api/games/:gameId/state", "shortDescription": {"text": "Unused endpoint: GET /api/games/:gameId/state"}, "fullDescription": {"text": "`server/server.js` declares `GET /api/games/:gameId/state` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e25d1cd7ce890ade", "name": "Unused endpoint: POST /api/games/:gameId/state", "shortDescription": {"text": "Unused endpoint: POST /api/games/:gameId/state"}, "fullDescription": {"text": "`server/server.js` declares `POST /api/games/:gameId/state` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-569be485c6c4a8e6", "name": "Unused endpoint: DELETE /api/games/:gameId/state", "shortDescription": {"text": "Unused endpoint: DELETE /api/games/:gameId/state"}, "fullDescription": {"text": "`server/server.js` declares `DELETE /api/games/:gameId/state` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f3bf72f059406b13", "name": "Unused endpoint: GET /api/logs", "shortDescription": {"text": "Unused endpoint: GET /api/logs"}, "fullDescription": {"text": "`server/server.js` declares `GET /api/logs` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3eef493a444fb388", "name": "Unused endpoint: GET /api/logs/summary", "shortDescription": {"text": "Unused endpoint: GET /api/logs/summary"}, "fullDescription": {"text": "`server/server.js` declares `GET /api/logs/summary` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d7c30a37cb9d1825", "name": "Unused endpoint: GET /api/gamestate", "shortDescription": {"text": "Unused endpoint: GET /api/gamestate"}, "fullDescription": {"text": "`server/server.js` declares `GET /api/gamestate` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bee9c956dcd05b10", "name": "Unused endpoint: POST /api/gamestate", "shortDescription": {"text": "Unused endpoint: POST /api/gamestate"}, "fullDescription": {"text": "`server/server.js` declares `POST /api/gamestate` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-045bac733578d322", "name": "Unused endpoint: DELETE /api/gamestate", "shortDescription": {"text": "Unused endpoint: DELETE /api/gamestate"}, "fullDescription": {"text": "`server/server.js` declares `DELETE /api/gamestate` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fb9f8c918cdb7837", "name": "Unused endpoint: GET /api/debug/state", "shortDescription": {"text": "Unused endpoint: GET /api/debug/state"}, "fullDescription": {"text": "`server/server.js` declares `GET /api/debug/state` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6ff9f94f725868d1", "name": "Unused endpoint: GET /api/debug/games", "shortDescription": {"text": "Unused endpoint: GET /api/debug/games"}, "fullDescription": {"text": "`server/server.js` declares `GET /api/debug/games` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8eef9255ce375627", "name": "Unused endpoint: POST /api/feedback", "shortDescription": {"text": "Unused endpoint: POST /api/feedback"}, "fullDescription": {"text": "`server/server.js` declares `POST /api/feedback` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-885496963c3ace9f", "name": "Unused endpoint: GET /api/feedback", "shortDescription": {"text": "Unused endpoint: GET /api/feedback"}, "fullDescription": {"text": "`server/server.js` declares `GET /api/feedback` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ddea0fe9ee2d5b25", "name": "Unused endpoint: GET /api/feedback/:id", "shortDescription": {"text": "Unused endpoint: GET /api/feedback/:id"}, "fullDescription": {"text": "`server/server.js` declares `GET /api/feedback/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9d384e0c4e9a7094", "name": "Unused endpoint: PATCH /api/feedback/:id", "shortDescription": {"text": "Unused endpoint: PATCH /api/feedback/:id"}, "fullDescription": {"text": "`server/server.js` declares `PATCH /api/feedback/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-88987d7b7e0c6e9a", "name": "Unused endpoint: GET /api/public/feedback/open", "shortDescription": {"text": "Unused endpoint: GET /api/public/feedback/open"}, "fullDescription": {"text": "`server/server.js` declares `GET /api/public/feedback/open` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/21463"}, "properties": {"repository": "tomaszsb/Game_alpha", "repoUrl": "https://github.com/tomaszsb/Game_alpha", "branch": "main"}, "results": [{"ruleId": "scanner-f2eca910abd9807b", "level": "note", "message": {"text": "Possibly dead Python function: validate_space_names"}, "properties": {"repobilityId": "b2ed001fe596759b", "scanner": "scanner-primary", "fingerprint": "f2eca910abd9807b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/archive/legacy_data/VALIDATION/validate_data.py:31"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5748dd16360f5e50", "level": "note", "message": {"text": "Possibly dead Python function: validate_visit_types"}, "properties": {"repobilityId": "0ed12fc7f09724bf", "scanner": "scanner-primary", "fingerprint": "5748dd16360f5e50", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/archive/legacy_data/VALIDATION/validate_data.py:70"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3c3442516342647b", "level": "note", "message": {"text": "Possibly dead Python function: validate_dice_outcomes"}, "properties": {"repobilityId": "df47a97ebec7cad2", "scanner": "scanner-primary", "fingerprint": "3c3442516342647b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/archive/legacy_data/VALIDATION/validate_data.py:105"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-540ceca971149947", "level": "note", "message": {"text": "Possibly dead Python function: validate_effects_data"}, "properties": {"repobilityId": "6ae7b963b2018767", "scanner": "scanner-primary", "fingerprint": "540ceca971149947", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/archive/legacy_data/VALIDATION/validate_data.py:127"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-55b7f736cfd55b83", "level": "note", "message": {"text": "Possibly dead Python function: validate_content_data"}, "properties": {"repobilityId": "5344fa4f1b6a56f8", "scanner": "scanner-primary", "fingerprint": "55b7f736cfd55b83", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/archive/legacy_data/VALIDATION/validate_data.py:155"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-42f01b08c93570c5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 vite.config.ts:85"}, "properties": {"repobilityId": "ab305e17677e589d", "scanner": "scanner-primary", "fingerprint": "42f01b08c93570c5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-16da487c6ece41b2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/E2E-04_EdgeCases.test.ts:86"}, "properties": {"repobilityId": "84608d82ef3d628b", "scanner": "scanner-primary", "fingerprint": "16da487c6ece41b2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-876f2c6e23770f66", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/E2E-04_SpaceTryAgain.test.ts:135"}, "properties": {"repobilityId": "32b4c0184dc404ec", "scanner": "scanner-primary", "fingerprint": "876f2c6e23770f66", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-95dcd465b745eed9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/E2E-LogicPlaythrough.test.ts:78"}, "properties": {"repobilityId": "04889fbb8e7987b3", "scanner": "scanner-primary", "fingerprint": "95dcd465b745eed9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7f05c491217402c9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/E2E-01_HappyPath.test.tsx:240"}, "properties": {"repobilityId": "8edff48f51d725c3", "scanner": "scanner-primary", "fingerprint": "7f05c491217402c9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7717f53bc7e5bf54", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/E2E-MultiDevice.test.ts:67"}, "properties": {"repobilityId": "8c88e381b5141888", "scanner": "scanner-primary", "fingerprint": "7717f53bc7e5bf54", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bc058525348eb47d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/E2E-03_ComplexSpace.test.ts:129"}, "properties": {"repobilityId": "f01a70d9ebd7627a", "scanner": "scanner-primary", "fingerprint": "bc058525348eb47d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0a905498af55b549", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/E2E-FullGame.test.tsx:214"}, "properties": {"repobilityId": "1ae64cd5444f7ede", "scanner": "scanner-primary", "fingerprint": "0a905498af55b549", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-88341ea4e26e9001", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/E2E-Multiplayer4P.test.ts:110"}, "properties": {"repobilityId": "9cfb8f9ce83d268d", "scanner": "scanner-primary", "fingerprint": "88341ea4e26e9001", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b62e2c47d7a3b2a3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/E2E-Multiplayer2P.test.ts:98"}, "properties": {"repobilityId": "141f24a3294ea4d6", "scanner": "scanner-primary", "fingerprint": "b62e2c47d7a3b2a3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-315d93a24410d9e5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/E2E-05_MultiPlayerEffects.test.ts:158"}, "properties": {"repobilityId": "389e92fbd5877851", "scanner": "scanner-primary", "fingerprint": "315d93a24410d9e5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-247f2536aee6a2f5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/vitest.setup.ts:32"}, "properties": {"repobilityId": "e6be563ae0705cfc", "scanner": "scanner-primary", "fingerprint": "247f2536aee6a2f5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cfa945cd6b79cc4a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/ghost/cardDrawRepro.test.ts:31"}, "properties": {"repobilityId": "1c590e9c421f8ef6", "scanner": "scanner-primary", "fingerprint": "cfa945cd6b79cc4a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0d29f827703e74bc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/ghost/ghostPlayer.test.ts:44"}, "properties": {"repobilityId": "74567c118d0079a1", "scanner": "scanner-primary", "fingerprint": "0d29f827703e74bc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-97e53962e4f5ee2b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/ghost/coverage.test.ts:77"}, "properties": {"repobilityId": "f6c39f05bcec14e3", "scanner": "scanner-primary", "fingerprint": "97e53962e4f5ee2b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-21c1c2581eeb8503", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/ghost/ghostPlayer.ts:185"}, "properties": {"repobilityId": "c71eba8073137746", "scanner": "scanner-primary", "fingerprint": "21c1c2581eeb8503", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8b931e369d0bd248", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/uat/verify-button-text.js:9"}, "properties": {"repobilityId": "cc4181871dfc47c9", "scanner": "scanner-primary", "fingerprint": "8b931e369d0bd248", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2a6c8befb4158418", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/uat/test-pm-decision-check.js:33"}, "properties": {"repobilityId": "1f506c8803083a9c", "scanner": "scanner-primary", "fingerprint": "2a6c8befb4158418", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9405b04e0f491a72", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/uat/test-dice-button-pm-decision-check.js:10"}, "properties": {"repobilityId": "ec30afe764d15e40", "scanner": "scanner-primary", "fingerprint": "9405b04e0f491a72", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-626760d5ac3c7256", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/uat/puppeteer-simple.js:31"}, "properties": {"repobilityId": "0d88518919284ac5", "scanner": "scanner-primary", "fingerprint": "626760d5ac3c7256", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7d588efb7930dae4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/scripts/test-dice-randomness.js:33"}, "properties": {"repobilityId": "777e7bcf034d817d", "scanner": "scanner-primary", "fingerprint": "7d588efb7930dae4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-56f36557c17cf355", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/utils/ConditionEvaluator.test.ts:9"}, "properties": {"repobilityId": "1fd13cfda44aa19f", "scanner": "scanner-primary", "fingerprint": "56f36557c17cf355", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a191a094eedc5059", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 tests/components/game/SpaceExplorerPanel.test.tsx:8"}, "properties": {"repobilityId": "11fd2445e2ec3a8b", "scanner": "scanner-primary", "fingerprint": "a191a094eedc5059", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-33ccc867505ba50c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/services/WebSocketSyncService.test.ts:10"}, "properties": {"repobilityId": "a527ec8b04e1b2d7", "scanner": "scanner-primary", "fingerprint": "33ccc867505ba50c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4d8e9539a9c77df8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/services/LoggingService.test.ts:8"}, "properties": {"repobilityId": "1898e122718048c4", "scanner": "scanner-primary", "fingerprint": "4d8e9539a9c77df8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-dfcd9896d5b8638c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/services/SpaceEffectService.test.ts:10"}, "properties": {"repobilityId": "d177047a000e20af", "scanner": "scanner-primary", "fingerprint": "dfcd9896d5b8638c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8988a6c0c7e002b9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/regression/TryAgainVisitType.test.ts:162"}, "properties": {"repobilityId": "1776f19e5191de47", "scanner": "scanner-primary", "fingerprint": "8988a6c0c7e002b9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f0c21313d7b80a5f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/regression/MultiplayerStateIsolation.test.ts:153"}, "properties": {"repobilityId": "66a7eb94d0d9a7d7", "scanner": "scanner-primary", "fingerprint": "f0c21313d7b80a5f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7fea54a7c15a0d1c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 docs/archive/v3-cleanup-20260404/merge-csv-rows.js:179"}, "properties": {"repobilityId": "9ab8299d74eac7bf", "scanner": "scanner-primary", "fingerprint": "7fea54a7c15a0d1c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5780f1b3ea1e5ed6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/migrateCheck.js:20"}, "properties": {"repobilityId": "18950af8e2adbd92", "scanner": "scanner-primary", "fingerprint": "5780f1b3ea1e5ed6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1c29014299e1a86d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/websocket.js:45"}, "properties": {"repobilityId": "c316d887b1e087b5", "scanner": "scanner-primary", "fingerprint": "1c29014299e1a86d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d8d00b3692ad1fdb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/processGameData.js:676"}, "properties": {"repobilityId": "09dab668bae67ced", "scanner": "scanner-primary", "fingerprint": "d8d00b3692ad1fdb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d8e54f5b9e9214d5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/server.js:89"}, "properties": {"repobilityId": "72b828fc11274423", "scanner": "scanner-primary", "fingerprint": "d8e54f5b9e9214d5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bf8c1feec141ccc2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/debugLog.ts:36"}, "properties": {"repobilityId": "ceff31fcf4ddc566", "scanner": "scanner-primary", "fingerprint": "bf8c1feec141ccc2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-434787f9a0a02cf5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/debug.ts:17"}, "properties": {"repobilityId": "f02cd8993cf8782e", "scanner": "scanner-primary", "fingerprint": "434787f9a0a02cf5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e6d9c0e1b0fb13eb", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/components/common/ErrorBoundary.tsx:67"}, "properties": {"repobilityId": "4892e6797d9437aa", "scanner": "scanner-primary", "fingerprint": "e6d9c0e1b0fb13eb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-164247dfc8e9164b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/setup/PlayerSetup.tsx:36"}, "properties": {"repobilityId": "927d69063563f3bc", "scanner": "scanner-primary", "fingerprint": "164247dfc8e9164b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6be8ed8d7ab08a01", "level": "note", "message": {"text": "React Flow <MiniMap> without dark background \u2014 src/components/board/BoardCanvas.tsx:802"}, "properties": {"repobilityId": "ebb570f558355708", "scanner": "scanner-primary", "fingerprint": "6be8ed8d7ab08a01", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.minimap.no-bg"]}}, {"ruleId": "scanner-15a5618b3c50dcef", "level": "note", "message": {"text": "React Flow <Controls> without dark theming \u2014 src/components/board/BoardCanvas.tsx:786"}, "properties": {"repobilityId": "bf446ebca1b45fc7", "scanner": "scanner-primary", "fingerprint": "15a5618b3c50dcef", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.controls.no-bg"]}}, {"ruleId": "scanner-8987d6d1c30c7202", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "properties": {"repobilityId": "3923bbb3d1b2faec", "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": 4}}}]}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"ruleId": "scanner-55bcdd7f724f133f", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in vite.config.ts:4"}, "properties": {"repobilityId": "b194fcea7803da43", "scanner": "scanner-primary", "fingerprint": "55bcdd7f724f133f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "vite.config.ts"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-38236b5f11b1a958", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/archive/prototypes/elk_prototype.html:986"}, "properties": {"repobilityId": "58931f375100fa72", "scanner": "scanner-primary", "fingerprint": "38236b5f11b1a958", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/archive/prototypes/elk_prototype.html"}, "region": {"startLine": 986}}}]}, {"ruleId": "scanner-07ed3d68816aa910", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/archive/prototypes/board_v3_prototype.html:1281"}, "properties": {"repobilityId": "b2ea657728f2ead5", "scanner": "scanner-primary", "fingerprint": "07ed3d68816aa910", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/archive/prototypes/board_v3_prototype.html"}, "region": {"startLine": 1281}}}]}, {"ruleId": "scanner-744fdecba2f172e4", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/archive/prototypes/svg_arrows_prototype.html:510"}, "properties": {"repobilityId": "3b9c431b8030f841", "scanner": "scanner-primary", "fingerprint": "744fdecba2f172e4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/archive/prototypes/svg_arrows_prototype.html"}, "region": {"startLine": 510}}}]}, {"ruleId": "scanner-5a2a9e19708b604e", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/archive/prototypes/dynamic_path_mockup.html:272"}, "properties": {"repobilityId": "2f945c53521631d2", "scanner": "scanner-primary", "fingerprint": "5a2a9e19708b604e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/archive/prototypes/dynamic_path_mockup.html"}, "region": {"startLine": 272}}}]}, {"ruleId": "scanner-a1df6ae87b575bdb", "level": "note", "message": {"text": "Insecure pattern 'document_write' in src/utils/logExport.ts:228"}, "properties": {"repobilityId": "9901e0dc04a2cfeb", "scanner": "scanner-primary", "fingerprint": "a1df6ae87b575bdb", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/utils/logExport.ts"}, "region": {"startLine": 228}}}]}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-a47196b76ceb8d2b", "level": "note", "message": {"text": "Very large file: tests/services/EffectEngineService.test.ts (1695 lines)"}, "properties": {"repobilityId": "26501d51a8768a9f", "scanner": "scanner-primary", "fingerprint": "a47196b76ceb8d2b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-34213dccf8337db7", "level": "note", "message": {"text": "Very large file: tests/services/MovementService.test.ts (1679 lines)"}, "properties": {"repobilityId": "ca5c672cc76a8bc1", "scanner": "scanner-primary", "fingerprint": "34213dccf8337db7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f0519ff2a8216b90", "level": "note", "message": {"text": "Very large file: tests/services/CardService.test.ts (1942 lines)"}, "properties": {"repobilityId": "5b52e72b12d69b7e", "scanner": "scanner-primary", "fingerprint": "f0519ff2a8216b90", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-05df2d0be229300d", "level": "note", "message": {"text": "Very large file: server/server.js (2181 lines)"}, "properties": {"repobilityId": "d14264b8a00bed6d", "scanner": "scanner-primary", "fingerprint": "05df2d0be229300d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-74575d935c5e8d7a", "level": "note", "message": {"text": "Very large file: src/components/layout/GameLayout.tsx (1362 lines)"}, "properties": {"repobilityId": "4009e9b7b8e0d60c", "scanner": "scanner-primary", "fingerprint": "74575d935c5e8d7a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-02e2e4355cb74b16", "level": "note", "message": {"text": "Very large file: src/components/setup/PlayerSetup.tsx (1611 lines)"}, "properties": {"repobilityId": "6fdb61c0448a748b", "scanner": "scanner-primary", "fingerprint": "02e2e4355cb74b16", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-bb7f21cf6d76d27d", "level": "note", "message": {"text": "Very large file: src/services/CardService.ts (2260 lines)"}, "properties": {"repobilityId": "fc75303e0a837964", "scanner": "scanner-primary", "fingerprint": "bb7f21cf6d76d27d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f95476b7e50adaa8", "level": "note", "message": {"text": "Very large file: src/services/TurnService.ts (2187 lines)"}, "properties": {"repobilityId": "5b56a1de7c631858", "scanner": "scanner-primary", "fingerprint": "f95476b7e50adaa8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4c02a79ddfaefc3e", "level": "note", "message": {"text": "Very large file: src/services/MovementService.ts (1390 lines)"}, "properties": {"repobilityId": "0fa027ef4904062a", "scanner": "scanner-primary", "fingerprint": "4c02a79ddfaefc3e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e6858dc726525bde", "level": "note", "message": {"text": "Very large file: src/services/StateService.ts (1931 lines)"}, "properties": {"repobilityId": "040b8f49eb2a6714", "scanner": "scanner-primary", "fingerprint": "e6858dc726525bde", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-48f6bc560e27984f", "level": "note", "message": {"text": "Very large file: src/services/EffectEngineService.ts (1515 lines)"}, "properties": {"repobilityId": "baabc3511e87ae87", "scanner": "scanner-primary", "fingerprint": "48f6bc560e27984f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "a18a6f0b418e08c7", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "d92b905e30c33bec", "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": "a9c0bc1cc76eb81a", "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": "15d00fedca2b6a3f", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "ba617f2b17cbcbd8", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "8c4a21bbaf30e6b2", "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": "8608bbb551348c38", "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": "1f6a25430cbef425", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-90eb0bc8dfcec6f5", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: docs/core/CLAUDE.md"}, "properties": {"repobilityId": "f5c25f3d867a4c06", "scanner": "scanner-primary", "fingerprint": "90eb0bc8dfcec6f5", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/core/CLAUDE.md"}, "region": {"startLine": 886}}}]}, {"ruleId": "scanner-505bc666a82f9849", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: .claude/settings.local.json"}, "properties": {"repobilityId": "777970b0fce0a93b", "scanner": "scanner-primary", "fingerprint": "505bc666a82f9849", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/settings.local.json"}, "region": {"startLine": 234}}}]}, {"ruleId": "scanner-756f1ced40bd4a05", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/commands/start.md"}, "properties": {"repobilityId": "05eb5b7e9e976cd1", "scanner": "scanner-primary", "fingerprint": "756f1ced40bd4a05", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/commands/start.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9ed466dda0adeea2", "level": "none", "message": {"text": "Commented-code block (6 lines) in vite.config.ts:190"}, "properties": {"repobilityId": "9d8220c5527cb89b", "scanner": "scanner-primary", "fingerprint": "9ed466dda0adeea2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b299056cc14973e8", "level": "none", "message": {"text": "Commented-code block (6 lines) in vitest.config.dev.ts:56"}, "properties": {"repobilityId": "ba268bfefe5e1738", "scanner": "scanner-primary", "fingerprint": "b299056cc14973e8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-812c6301df30b3f3", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/integration/cardTextMatchesColumns.test.ts:247"}, "properties": {"repobilityId": "04dcc282b640181e", "scanner": "scanner-primary", "fingerprint": "812c6301df30b3f3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8576c6052121119c", "level": "none", "message": {"text": "Commented-code block (7 lines) in tests/integration/TransactionalLoggingFlow.test.ts:127"}, "properties": {"repobilityId": "a2ca1743156a027e", "scanner": "scanner-primary", "fingerprint": "8576c6052121119c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0354a323fe449f94", "level": "none", "message": {"text": "Commented-code block (11 lines) in tests/ghost/finalReviewStaleIntent.test.ts:5"}, "properties": {"repobilityId": "b9956de96aafbdf0", "scanner": "scanner-primary", "fingerprint": "0354a323fe449f94", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-76bd52489101a514", "level": "none", "message": {"text": "Commented-code block (7 lines) in tests/ghost/dataIntegrity.test.ts:128"}, "properties": {"repobilityId": "8cb91a9295871443", "scanner": "scanner-primary", "fingerprint": "76bd52489101a514", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-93f3e2049c9c9caa", "level": "none", "message": {"text": "Commented-code block (10 lines) in tests/ghost/ghostPlayer.test.ts:63"}, "properties": {"repobilityId": "0674ccd30c130cc7", "scanner": "scanner-primary", "fingerprint": "93f3e2049c9c9caa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3b935793c4ac5a75", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/ghost/coverage.test.ts:137"}, "properties": {"repobilityId": "3d56bbf4eec40d9e", "scanner": "scanner-primary", "fingerprint": "3b935793c4ac5a75", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-edd0629d8ced7bf0", "level": "none", "message": {"text": "Commented-code block (7 lines) in tests/ghost/ghostPlayer.ts:341"}, "properties": {"repobilityId": "7f11b3747364c804", "scanner": "scanner-primary", "fingerprint": "edd0629d8ced7bf0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-77e9269a8729296d", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/utils/buttonFormatting.test.ts:108"}, "properties": {"repobilityId": "52a09aa4903df7ff", "scanner": "scanner-primary", "fingerprint": "77e9269a8729296d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5d08c5ff0e154920", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/utils/consoleCapture.test.ts:1"}, "properties": {"repobilityId": "4d1d041ceee0e68a", "scanner": "scanner-primary", "fingerprint": "5d08c5ff0e154920", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7414720790f9195d", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/components/NegotiationModal.test.tsx:203"}, "properties": {"repobilityId": "fc6630f975c204bc", "scanner": "scanner-primary", "fingerprint": "7414720790f9195d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-457bd26f746aaaea", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/components/player/ApprovalBadges.test.tsx:76"}, "properties": {"repobilityId": "acac1d2157e8c6c3", "scanner": "scanner-primary", "fingerprint": "457bd26f746aaaea", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8fe5546e0534dd58", "level": "none", "message": {"text": "Commented-code block (7 lines) in tests/components/player/ActionCenterPanel.test.tsx:246"}, "properties": {"repobilityId": "af30014835c40bd7", "scanner": "scanner-primary", "fingerprint": "8fe5546e0534dd58", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-afa59efe5bb1e917", "level": "none", "message": {"text": "Commented-code block (7 lines) in tests/components/player/pendingActionsCollapse.test.ts:6"}, "properties": {"repobilityId": "bd2ee0aa8ae568f4", "scanner": "scanner-primary", "fingerprint": "afa59efe5bb1e917", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-575950cb7a9daea7", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/components/modals/LifeEventModal.test.tsx:12"}, "properties": {"repobilityId": "394d2c20229d42d0", "scanner": "scanner-primary", "fingerprint": "575950cb7a9daea7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cce5f3c2873460a7", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/components/modals/DiceResultModal.test.tsx:326"}, "properties": {"repobilityId": "52ed6ec58c5af682", "scanner": "scanner-primary", "fingerprint": "cce5f3c2873460a7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-db84b2c8a89fcbd8", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/components/classroom/ClassroomSetup.test.tsx:1"}, "properties": {"repobilityId": "74902afa3be98b8f", "scanner": "scanner-primary", "fingerprint": "db84b2c8a89fcbd8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7493f9aaf6166561", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/components/editor/BugReportsPanel.test.tsx:1"}, "properties": {"repobilityId": "3d7921e1bb2f0f46", "scanner": "scanner-primary", "fingerprint": "7493f9aaf6166561", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0a50fd1a97afee32", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/components/editor/csvExport.test.ts:422"}, "properties": {"repobilityId": "378c95619365a7c3", "scanner": "scanner-primary", "fingerprint": "0a50fd1a97afee32", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7b00eb9524471e51", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/components/board/saveBoardPosition.test.ts:1"}, "properties": {"repobilityId": "9b304bc3315ef455", "scanner": "scanner-primary", "fingerprint": "7b00eb9524471e51", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-240965885727db4e", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/hooks/useModalQueue.test.ts:3"}, "properties": {"repobilityId": "825c307f6316d892", "scanner": "scanner-primary", "fingerprint": "240965885727db4e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ea61da5aef0c7d2e", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/server/processGameData.test.ts:162"}, "properties": {"repobilityId": "956913eb22700cd4", "scanner": "scanner-primary", "fingerprint": "ea61da5aef0c7d2e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-55756ba603b65067", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/server/authGuards.test.ts:1"}, "properties": {"repobilityId": "a974e1539e729d86", "scanner": "scanner-primary", "fingerprint": "55756ba603b65067", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9424fdf3fca8298a", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/server/instanceResolver.test.ts:1"}, "properties": {"repobilityId": "da1baf30bf7fcd9c", "scanner": "scanner-primary", "fingerprint": "9424fdf3fca8298a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-702eac34bad86167", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/server/spaceProtection.test.ts:1"}, "properties": {"repobilityId": "4219a5d06004eeb1", "scanner": "scanner-primary", "fingerprint": "702eac34bad86167", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8e130ca5b8048bde", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/server/serverEndpointAuth.test.ts:1"}, "properties": {"repobilityId": "d58ecec69a9d018d", "scanner": "scanner-primary", "fingerprint": "8e130ca5b8048bde", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f48483290a283b3d", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/server/instanceValidation.test.ts:1"}, "properties": {"repobilityId": "79a78fa88933a303", "scanner": "scanner-primary", "fingerprint": "f48483290a283b3d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b2f158509b970666", "level": "none", "message": {"text": "Commented-code block (7 lines) in tests/server/websocketAuth.test.ts:1"}, "properties": {"repobilityId": "8c56643afe5b998a", "scanner": "scanner-primary", "fingerprint": "b2f158509b970666", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4d96376f0ca29f7e", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/services/StateService-tryAgainApprovals.test.ts:3"}, "properties": {"repobilityId": "45161a70ab34d3e4", "scanner": "scanner-primary", "fingerprint": "4d96376f0ca29f7e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f5f75df266af748a", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/services/StateService-actionCounter.test.ts:4"}, "properties": {"repobilityId": "491dac90d879f4ec", "scanner": "scanner-primary", "fingerprint": "f5f75df266af748a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-899e4b783f08434c", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/services/MovementService-unifiedResolver.test.ts:3"}, "properties": {"repobilityId": "6fc2a3bc9536dc25", "scanner": "scanner-primary", "fingerprint": "899e4b783f08434c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1dfa10be375162f0", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/services/TurnService-tryAgainOnSpace.test.ts:276"}, "properties": {"repobilityId": "d620333027a3d17a", "scanner": "scanner-primary", "fingerprint": "1dfa10be375162f0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c081e4f30b9f6451", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/services/TurnService.test.ts:1246"}, "properties": {"repobilityId": "16ea9f2c9d09a6de", "scanner": "scanner-primary", "fingerprint": "c081e4f30b9f6451", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fc9334487d2200d7", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/services/CardEffectHandler.test.ts:13"}, "properties": {"repobilityId": "8edd35641ccbfe29", "scanner": "scanner-primary", "fingerprint": "fc9334487d2200d7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bd66b0657db55f7a", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/services/EffectEngineService.test.ts:960"}, "properties": {"repobilityId": "3e4876912866c834", "scanner": "scanner-primary", "fingerprint": "bd66b0657db55f7a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-86d9f8a15f5aba12", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/services/MovementExecutor.test.ts:138"}, "properties": {"repobilityId": "559ce4754cb96f83", "scanner": "scanner-primary", "fingerprint": "86d9f8a15f5aba12", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0488a8f2d2782537", "level": "none", "message": {"text": "Commented-code block (8 lines) in tests/services/MovementService.test.ts:653"}, "properties": {"repobilityId": "4bffa547134fb1fc", "scanner": "scanner-primary", "fingerprint": "0488a8f2d2782537", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-519995aa23e715f0", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/services/MovementService-visitTypeInvariant.test.ts:3"}, "properties": {"repobilityId": "cdcf15d9c9c9aac5", "scanner": "scanner-primary", "fingerprint": "519995aa23e715f0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b339f127a3b3b912", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/services/PlayerActionService.test.ts:617"}, "properties": {"repobilityId": "89875fe4c77c69a9", "scanner": "scanner-primary", "fingerprint": "b339f127a3b3b912", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-26302e7815eda9a6", "level": "none", "message": {"text": "Commented-code block (7 lines) in tests/services/TurnStateManager-deepClone.test.ts:5"}, "properties": {"repobilityId": "ba8e668daf69133d", "scanner": "scanner-primary", "fingerprint": "26302e7815eda9a6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9f468705dc77f870", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/services/CardService.test.ts:1002"}, "properties": {"repobilityId": "837c508abd448a6a", "scanner": "scanner-primary", "fingerprint": "9f468705dc77f870", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e4128e1faf0cb1c3", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/features/ManualFunding.test.ts:182"}, "properties": {"repobilityId": "ad0d32ccf50bdb1a", "scanner": "scanner-primary", "fingerprint": "e4128e1faf0cb1c3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-84fa066534e2c6c8", "level": "none", "message": {"text": "Commented-code block (5 lines) in docs/archive/legacy_data/process_game_data.py:283"}, "properties": {"repobilityId": "de1f43cf940c4bbf", "scanner": "scanner-primary", "fingerprint": "84fa066534e2c6c8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3b0fb4c4897909f0", "level": "note", "message": {"text": "Legacy-named symbol `code2026_cards_backup` in docs/archive/legacy_data/convert_cards.py:11"}, "properties": {"repobilityId": "23f5dd10397bdc2a", "scanner": "scanner-primary", "fingerprint": "3b0fb4c4897909f0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-5d46d57482b56beb", "level": "note", "message": {"text": "Legacy-named symbol `code2026_cards_backup` in docs/archive/legacy_data/convert_cards_expanded.py:11"}, "properties": {"repobilityId": "8275b922f7551a6b", "scanner": "scanner-primary", "fingerprint": "5d46d57482b56beb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b1b3ff3510d3cbed", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/seed-board-positions.mjs:6"}, "properties": {"repobilityId": "8f6c45e00bccd35e", "scanner": "scanner-primary", "fingerprint": "b1b3ff3510d3cbed", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8584179a3054a278", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/regen-clean-files.mjs:2"}, "properties": {"repobilityId": "a8a7f887f20e6109", "scanner": "scanner-primary", "fingerprint": "8584179a3054a278", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d9694428c4dc6c53", "level": "none", "message": {"text": "Commented-code block (7 lines) in scripts/set-narrative.mjs:36"}, "properties": {"repobilityId": "61eb619f8c2c6451", "scanner": "scanner-primary", "fingerprint": "d9694428c4dc6c53", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c750dcb0b11f8a8a", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/merge-voice-rewrite.mjs:2"}, "properties": {"repobilityId": "bfe76b589e1865b1", "scanner": "scanner-primary", "fingerprint": "c750dcb0b11f8a8a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1f7d02eaeb7a51be", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/instanceCatalog.js:4"}, "properties": {"repobilityId": "c920a4544a32dbd8", "scanner": "scanner-primary", "fingerprint": "1f7d02eaeb7a51be", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9e46729979b3816e", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/migrateCheck.js:1"}, "properties": {"repobilityId": "291c7385b169b301", "scanner": "scanner-primary", "fingerprint": "9e46729979b3816e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4df21a3dd6570140", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/accountStore.js:9"}, "properties": {"repobilityId": "4b9d9e9fe5f88ded", "scanner": "scanner-primary", "fingerprint": "4df21a3dd6570140", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2a71cc4221a30ecc", "level": "none", "message": {"text": "Commented-code block (8 lines) in server/websocket.js:5"}, "properties": {"repobilityId": "7161fba2185ce498", "scanner": "scanner-primary", "fingerprint": "2a71cc4221a30ecc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-252b08ee577ff081", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/processGameData.js:176"}, "properties": {"repobilityId": "ecea6e35eacf6a52", "scanner": "scanner-primary", "fingerprint": "252b08ee577ff081", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0368ad424be20823", "level": "none", "message": {"text": "Commented-code block (9 lines) in server/instanceResolver.js:8"}, "properties": {"repobilityId": "27ced9112303ca32", "scanner": "scanner-primary", "fingerprint": "0368ad424be20823", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-690d52ace68972f1", "level": "none", "message": {"text": "Commented-code block (8 lines) in server/server.js:1"}, "properties": {"repobilityId": "0ffeb1a7fed58083", "scanner": "scanner-primary", "fingerprint": "690d52ace68972f1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0077796b20f52b58", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/server.js:438"}, "properties": {"repobilityId": "b9578136c5ac02fe", "scanner": "scanner-primary", "fingerprint": "0077796b20f52b58", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8fc5a806a23851b5", "level": "none", "message": {"text": "Commented-code block (11 lines) in server/spaceProtection.js:7"}, "properties": {"repobilityId": "3cd069c72f02a9d3", "scanner": "scanner-primary", "fingerprint": "8fc5a806a23851b5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a42afee444b63ad5", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/instanceValidation.js:4"}, "properties": {"repobilityId": "16952d6f0dd6c943", "scanner": "scanner-primary", "fingerprint": "a42afee444b63ad5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e3fa707df272383a", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/migrateInstance.js:7"}, "properties": {"repobilityId": "c4737cae4d06c531", "scanner": "scanner-primary", "fingerprint": "e3fa707df272383a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b09db8902d8c204f", "level": "none", "message": {"text": "Commented-code block (8 lines) in server/authGuards.js:6"}, "properties": {"repobilityId": "63f6c244145bb943", "scanner": "scanner-primary", "fingerprint": "b09db8902d8c204f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c6665623f8e10291", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/App.tsx:117"}, "properties": {"repobilityId": "9f1e42223653d2c9", "scanner": "scanner-primary", "fingerprint": "c6665623f8e10291", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e3b491822652d235", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/types/EffectTypes.ts:45"}, "properties": {"repobilityId": "e8c180eec799c03f", "scanner": "scanner-primary", "fingerprint": "e3b491822652d235", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a190f463c67b27b6", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/types/ServiceContracts.ts:503"}, "properties": {"repobilityId": "8b0f5b554ed11a1f", "scanner": "scanner-primary", "fingerprint": "a190f463c67b27b6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bc4f93af02e51cdb", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/types/CommonTypes.ts:13"}, "properties": {"repobilityId": "06586559374f46c1", "scanner": "scanner-primary", "fingerprint": "bc4f93af02e51cdb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-90420822f65944a1", "level": "none", "message": {"text": "Commented-code block (9 lines) in src/types/DataTypes.ts:109"}, "properties": {"repobilityId": "fab49a12afb0b3d3", "scanner": "scanner-primary", "fingerprint": "90420822f65944a1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-67a21702c4dae871", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/types/StateTypes.ts:301"}, "properties": {"repobilityId": "3cf13a239bcea50f", "scanner": "scanner-primary", "fingerprint": "67a21702c4dae871", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c2ebc227794dd9c1", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/utils/relatedTab.ts:6"}, "properties": {"repobilityId": "93839e64a4c919a5", "scanner": "scanner-primary", "fingerprint": "c2ebc227794dd9c1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4a501a31cc29df9e", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/utils/buttonFormatting.ts:143"}, "properties": {"repobilityId": "6e42e4cd77435724", "scanner": "scanner-primary", "fingerprint": "4a501a31cc29df9e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ece74c1abefa9ecc", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/utils/lifeEventReceipts.ts:5"}, "properties": {"repobilityId": "65af69ad70598482", "scanner": "scanner-primary", "fingerprint": "ece74c1abefa9ecc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2b3a82478d0b2b9e", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/utils/boardCommon.ts:8"}, "properties": {"repobilityId": "ec4e63760f127848", "scanner": "scanner-primary", "fingerprint": "2b3a82478d0b2b9e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6854de1e99d6de33", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/utils/resourceSnapshot.ts:5"}, "properties": {"repobilityId": "11aefaba8364f822", "scanner": "scanner-primary", "fingerprint": "6854de1e99d6de33", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-904216ac63c6c2c4", "level": "note", "message": {"text": "Legacy-named symbol `show_ad_copy` in src/utils/remoteConfig.ts:26"}, "properties": {"repobilityId": "b68a075da3d512f2", "scanner": "scanner-primary", "fingerprint": "904216ac63c6c2c4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-26b60d52d3dd8f5c", "level": "none", "message": {"text": "Commented-code block (9 lines) in src/utils/endGameInsights.ts:7"}, "properties": {"repobilityId": "3c5d5b59431008ac", "scanner": "scanner-primary", "fingerprint": "26b60d52d3dd8f5c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7730a974c24b3409", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/utils/logFiltering.ts:3"}, "properties": {"repobilityId": "0b7789954b7d437f", "scanner": "scanner-primary", "fingerprint": "7730a974c24b3409", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7d9f7bd39d50bdc6", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/utils/dataInstance.ts:4"}, "properties": {"repobilityId": "570608e2f21bbf81", "scanner": "scanner-primary", "fingerprint": "7d9f7bd39d50bdc6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4537683e88ab298b", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/utils/haptics.ts:14"}, "properties": {"repobilityId": "e521080d22ca3f2c", "scanner": "scanner-primary", "fingerprint": "4537683e88ab298b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-27e004ff1472e18c", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/utils/teacherAuth.ts:4"}, "properties": {"repobilityId": "6082e32470d7ed51", "scanner": "scanner-primary", "fingerprint": "27e004ff1472e18c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-629ecd0e047b497a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/utils/teacherAuth.ts:72"}, "properties": {"repobilityId": "06eb3e12ab9c0616", "scanner": "scanner-primary", "fingerprint": "629ecd0e047b497a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ca9ccd8e3736326b", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/utils/endGameStats.ts:7"}, "properties": {"repobilityId": "bb9722905e729c89", "scanner": "scanner-primary", "fingerprint": "ca9ccd8e3736326b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b4d99cfffb169d22", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/layout/GameLayout.tsx:90"}, "properties": {"repobilityId": "72d21df126746116", "scanner": "scanner-primary", "fingerprint": "b4d99cfffb169d22", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-773447e3ecd38310", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/components/layout/TVDisplay.tsx:543"}, "properties": {"repobilityId": "529e92e3d464eb95", "scanner": "scanner-primary", "fingerprint": "773447e3ecd38310", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b198eb157d4e19cb", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/player/ActionCenterPanel.tsx:281"}, "properties": {"repobilityId": "df2ba84a10c2ad5f", "scanner": "scanner-primary", "fingerprint": "b198eb157d4e19cb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8023dcd4857a61d7", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/player/ApprovalBadges.tsx:3"}, "properties": {"repobilityId": "70aa916fdaec19b0", "scanner": "scanner-primary", "fingerprint": "8023dcd4857a61d7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-af68fc02060ac8df", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/player/pendingActionsCollapse.ts:1"}, "properties": {"repobilityId": "2ae64451e3b65dfe", "scanner": "scanner-primary", "fingerprint": "af68fc02060ac8df", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c7aa5786ea4c8118", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/player/sections/FinancesSection.tsx:258"}, "properties": {"repobilityId": "6690d9223c5c68ba", "scanner": "scanner-primary", "fingerprint": "c7aa5786ea4c8118", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d9c05d76e197d2e3", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/player/sections/CardsSection.tsx:113"}, "properties": {"repobilityId": "c17352c7aed4d4b4", "scanner": "scanner-primary", "fingerprint": "d9c05d76e197d2e3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d491bfd5d6f9254b", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/player/sections/StoryAccordion.tsx:4"}, "properties": {"repobilityId": "36d0c6b0e6678106", "scanner": "scanner-primary", "fingerprint": "d491bfd5d6f9254b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f845f55ceefd2733", "level": "none", "message": {"text": "Commented-code block (13 lines) in src/components/modals/LifeEventModal.tsx:5"}, "properties": {"repobilityId": "4ff1267940764d23", "scanner": "scanner-primary", "fingerprint": "f845f55ceefd2733", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-502163a3c7b35140", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/modals/RoutingExplanationModal.tsx:3"}, "properties": {"repobilityId": "1497c128ca78d83e", "scanner": "scanner-primary", "fingerprint": "502163a3c7b35140", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e840b66f2563e7af", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/modals/ChoiceModal.tsx:23"}, "properties": {"repobilityId": "e8497d30899be895", "scanner": "scanner-primary", "fingerprint": "e840b66f2563e7af", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0068911f358cd6ef", "level": "none", "message": {"text": "Commented-code block (9 lines) in src/components/modals/DiceResultModal.tsx:103"}, "properties": {"repobilityId": "c35df96a6eea1ee1", "scanner": "scanner-primary", "fingerprint": "0068911f358cd6ef", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f43e40f08dc492a6", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/components/modals/shared/ModalBase.tsx:36"}, "properties": {"repobilityId": "2cca44003c8b3792", "scanner": "scanner-primary", "fingerprint": "f43e40f08dc492a6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-afceb47914be889a", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/classroom/ClassroomSetup.tsx:6"}, "properties": {"repobilityId": "1cdf0c6027a637bd", "scanner": "scanner-primary", "fingerprint": "afceb47914be889a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-315b4b43723b370d", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/classroom/classroomAdminApi.ts:6"}, "properties": {"repobilityId": "76e99f83f81eddea", "scanner": "scanner-primary", "fingerprint": "315b4b43723b370d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a9d0b4ae63f4b12c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/game/GameLog.tsx:99"}, "properties": {"repobilityId": "3b434600dd4b64a6", "scanner": "scanner-primary", "fingerprint": "a9d0b4ae63f4b12c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0cd92309021a17ab", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/editor/DataEditor.tsx:128"}, "properties": {"repobilityId": "caeb62ab54effdb6", "scanner": "scanner-primary", "fingerprint": "0cd92309021a17ab", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-58ebfd143d7e5bdf", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/editor/BugReportsPanel.tsx:72"}, "properties": {"repobilityId": "37241e8c317e9ead", "scanner": "scanner-primary", "fingerprint": "58ebfd143d7e5bdf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e673b5aabd909e05", "level": "none", "message": {"text": "Commented-code block (9 lines) in src/components/setup/PlayerList.tsx:308"}, "properties": {"repobilityId": "c7abb51748be32d2", "scanner": "scanner-primary", "fingerprint": "e673b5aabd909e05", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-911e898735ab79c3", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/setup/useGitHubSyncStatus.ts:1"}, "properties": {"repobilityId": "2c5314e0ddb9401d", "scanner": "scanner-primary", "fingerprint": "911e898735ab79c3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-48604903902f760e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/setup/useGitHubSyncStatus.ts:51"}, "properties": {"repobilityId": "5e61815580ad0361", "scanner": "scanner-primary", "fingerprint": "48604903902f760e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1088f6a6c0633887", "level": "none", "message": {"text": "Commented-code block (9 lines) in src/components/setup/PlayerSetup.tsx:80"}, "properties": {"repobilityId": "1ea70fc07da7c6ad", "scanner": "scanner-primary", "fingerprint": "1088f6a6c0633887", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6b03160009858a56", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/setup/PlayerSetup.tsx:273"}, "properties": {"repobilityId": "3f0128b12bd20c5a", "scanner": "scanner-primary", "fingerprint": "6b03160009858a56", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6c782176fe1600de", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/board/BoardToggle.tsx:3"}, "properties": {"repobilityId": "a799c90ade898198", "scanner": "scanner-primary", "fingerprint": "6c782176fe1600de", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bffb1b0b873f720e", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/board/BoardLayoutEditor.tsx:10"}, "properties": {"repobilityId": "705816b45e92b9e6", "scanner": "scanner-primary", "fingerprint": "bffb1b0b873f720e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-71f6b076359ac9fc", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/board/BoardCanvas.tsx:5"}, "properties": {"repobilityId": "2c7e0745b928f58b", "scanner": "scanner-primary", "fingerprint": "71f6b076359ac9fc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-518f4f1af278221b", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/feedback/FeedbackButton.tsx:74"}, "properties": {"repobilityId": "a0372e0a67fa1f2e", "scanner": "scanner-primary", "fingerprint": "518f4f1af278221b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-54ca12fe669315e1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/feedback/FeedbackButton.tsx:216"}, "properties": {"repobilityId": "bf8d84f52a8f5ca5", "scanner": "scanner-primary", "fingerprint": "54ca12fe669315e1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7cd99343790e9f1c", "level": "note", "message": {"text": "Legacy-named symbol `show_ad_copy` in src/dictionary/components/DictionaryPanel.tsx:410"}, "properties": {"repobilityId": "415606d32dd6c101", "scanner": "scanner-primary", "fingerprint": "7cd99343790e9f1c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-3446db0306283f9c", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/dictionary/components/DictionaryHint.tsx:3"}, "properties": {"repobilityId": "1a4cd3a0a6387322", "scanner": "scanner-primary", "fingerprint": "3446db0306283f9c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bf0ad2168e7ff638", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/hooks/useModalQueue.ts:11"}, "properties": {"repobilityId": "8b67dc9327ac95e1", "scanner": "scanner-primary", "fingerprint": "bf0ad2168e7ff638", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6dab1d7a3ecbac41", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/services/DiceService.ts:6"}, "properties": {"repobilityId": "6304bc18727b946c", "scanner": "scanner-primary", "fingerprint": "6dab1d7a3ecbac41", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-da2ffebc3ad9c96c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/services/WebSocketSyncService.ts:447"}, "properties": {"repobilityId": "fbdfd96b3d562bb5", "scanner": "scanner-primary", "fingerprint": "da2ffebc3ad9c96c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ada77a4eabfed098", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/services/GameRulesService.ts:106"}, "properties": {"repobilityId": "32d6040e17597e83", "scanner": "scanner-primary", "fingerprint": "ada77a4eabfed098", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0f424101453df374", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/services/TurnTransitionHandler.ts:81"}, "properties": {"repobilityId": "279dcf476993b035", "scanner": "scanner-primary", "fingerprint": "0f424101453df374", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c88449ca3c6ec3a1", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/services/CardService.ts:9"}, "properties": {"repobilityId": "957b21dbef10f123", "scanner": "scanner-primary", "fingerprint": "c88449ca3c6ec3a1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ea04e59ff774bc5e", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/services/TurnService.ts:97"}, "properties": {"repobilityId": "f93fec77cc5f31b0", "scanner": "scanner-primary", "fingerprint": "ea04e59ff774bc5e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cdc2a823648ee7cd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/services/DataService.ts:471"}, "properties": {"repobilityId": "813215e40c481499", "scanner": "scanner-primary", "fingerprint": "cdc2a823648ee7cd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-55541a71fbf7cf28", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/services/MovementService.ts:11"}, "properties": {"repobilityId": "3bf48b25464c5444", "scanner": "scanner-primary", "fingerprint": "55541a71fbf7cf28", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-42df2b39a0e71b14", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/services/SpaceEffectService.ts:32"}, "properties": {"repobilityId": "4efbf5d44a56bc5d", "scanner": "scanner-primary", "fingerprint": "42df2b39a0e71b14", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cd564e4364e0da8b", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/services/SpaceArrivalProcessor.ts:238"}, "properties": {"repobilityId": "4a9624cdc8967369", "scanner": "scanner-primary", "fingerprint": "cd564e4364e0da8b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-46d72df0d3591947", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/services/CardEffectHandler.ts:89"}, "properties": {"repobilityId": "ec2bc314c129ee1b", "scanner": "scanner-primary", "fingerprint": "46d72df0d3591947", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9d18896380281090", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/services/ServerSyncService.ts:164"}, "properties": {"repobilityId": "2e5a6fc24e4d6686", "scanner": "scanner-primary", "fingerprint": "9d18896380281090", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-44fb7b038260f09b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/services/ServerSyncService.ts:185"}, "properties": {"repobilityId": "28d9964dba85ad46", "scanner": "scanner-primary", "fingerprint": "44fb7b038260f09b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-38dafa03d21f48aa", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/services/PlayerActionService.ts:110"}, "properties": {"repobilityId": "845942ebe60ef756", "scanner": "scanner-primary", "fingerprint": "38dafa03d21f48aa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-51efee7b631c1556", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/services/MovementExecutor.ts:31"}, "properties": {"repobilityId": "9c54e5c4b8233217", "scanner": "scanner-primary", "fingerprint": "51efee7b631c1556", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ec685b20c6fc5b39", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/services/FinancialEffectHandler.ts:277"}, "properties": {"repobilityId": "9ee25b006940a3e7", "scanner": "scanner-primary", "fingerprint": "ec685b20c6fc5b39", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-992e17f7321606f1", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/services/StateService.ts:30"}, "properties": {"repobilityId": "5bcae97a04545a8e", "scanner": "scanner-primary", "fingerprint": "992e17f7321606f1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0445b5bd98cc026c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/services/DiceRollProcessor.ts:96"}, "properties": {"repobilityId": "fcbd71ed31cda50f", "scanner": "scanner-primary", "fingerprint": "0445b5bd98cc026c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-17728108242d3f08", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/services/EffectEngineService.ts:346"}, "properties": {"repobilityId": "f068e0e67810e0a5", "scanner": "scanner-primary", "fingerprint": "17728108242d3f08", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dee3ffc710d75d9b", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/services/ChoiceService.ts:25"}, "properties": {"repobilityId": "1c93a786a47625eb", "scanner": "scanner-primary", "fingerprint": "dee3ffc710d75d9b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d0b17c8c07a7421d", "level": "note", "message": {"text": "8 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "17fe720e8247f9df", "scanner": "scanner-primary", "fingerprint": "d0b17c8c07a7421d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-ca99470ce1d43689", "level": "error", "message": {"text": "Dangling fetch: POST https://ntfy.sh/${CONFIG.NTFY_TOPIC} (server/server.js:438)"}, "properties": {"repobilityId": "045de7006c70cc5d", "scanner": "scanner-primary", "fingerprint": "ca99470ce1d43689", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-925a997986700044", "level": "note", "message": {"text": "Unused endpoint: USE /data/i/:instanceId"}, "properties": {"repobilityId": "1ff779dd6c787fc3", "scanner": "scanner-primary", "fingerprint": "925a997986700044", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4895e5e6f245af90", "level": "note", "message": {"text": "Unused endpoint: USE /data"}, "properties": {"repobilityId": "e002ae4927deec87", "scanner": "scanner-primary", "fingerprint": "4895e5e6f245af90", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-db796533ead108fe", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/verify"}, "properties": {"repobilityId": "f3e5dfabad22e151", "scanner": "scanner-primary", "fingerprint": "db796533ead108fe", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-71bee279cd5d0094", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/save-source-files"}, "properties": {"repobilityId": "aa07b8bd0037d86e", "scanner": "scanner-primary", "fingerprint": "71bee279cd5d0094", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-162b47cf92a974d2", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/reset-to-baseline"}, "properties": {"repobilityId": "2d3e6457b0797c26", "scanner": "scanner-primary", "fingerprint": "162b47cf92a974d2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8e5ff9478e25e412", "level": "note", "message": {"text": "Unused endpoint: GET /api/instances/mine"}, "properties": {"repobilityId": "2cbe62a1a0d38fd8", "scanner": "scanner-primary", "fingerprint": "8e5ff9478e25e412", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-92e55a7c65874cbd", "level": "note", "message": {"text": "Unused endpoint: POST /api/instances"}, "properties": {"repobilityId": "10c7056e2e8575ff", "scanner": "scanner-primary", "fingerprint": "92e55a7c65874cbd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cc3555243cfc01bf", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/instances/:id"}, "properties": {"repobilityId": "488841c842c6f681", "scanner": "scanner-primary", "fingerprint": "cc3555243cfc01bf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f89286691a216a84", "level": "note", "message": {"text": "Unused endpoint: GET /api/instances/:id"}, "properties": {"repobilityId": "970383f1fd4038c2", "scanner": "scanner-primary", "fingerprint": "f89286691a216a84", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-da71db9cf2fa9455", "level": "note", "message": {"text": "Unused endpoint: GET /api/instances/:id/catalog"}, "properties": {"repobilityId": "9747fec882904e77", "scanner": "scanner-primary", "fingerprint": "da71db9cf2fa9455", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b23b1f655f153344", "level": "note", "message": {"text": "Unused endpoint: POST /api/instances/:id/board"}, "properties": {"repobilityId": "1e37a42cb8d42b08", "scanner": "scanner-primary", "fingerprint": "b23b1f655f153344", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ae97a6fb782141ff", "level": "note", "message": {"text": "Unused endpoint: POST /api/instances/:id/copies"}, "properties": {"repobilityId": "a823fd5116f90867", "scanner": "scanner-primary", "fingerprint": "ae97a6fb782141ff", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8f455622e9f00923", "level": "note", "message": {"text": "Unused endpoint: PATCH /api/instances/:id/copies/:copyId"}, "properties": {"repobilityId": "47cfd3dfac7b4ec5", "scanner": "scanner-primary", "fingerprint": "8f455622e9f00923", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cc3fac58aa19e13f", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/instances/:id/copies/:copyId"}, "properties": {"repobilityId": "24556838f9c7aef7", "scanner": "scanner-primary", "fingerprint": "cc3fac58aa19e13f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7c8f0f1041c3dccd", "level": "note", "message": {"text": "Unused endpoint: POST /api/instances/:id/positions"}, "properties": {"repobilityId": "47dbcdf3683c1ef1", "scanner": "scanner-primary", "fingerprint": "7c8f0f1041c3dccd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2df710713760d2c1", "level": "note", "message": {"text": "Unused endpoint: POST /api/accounts/login"}, "properties": {"repobilityId": "1a54a6273946c144", "scanner": "scanner-primary", "fingerprint": "2df710713760d2c1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ca162536e1623293", "level": "note", "message": {"text": "Unused endpoint: POST /api/accounts/logout"}, "properties": {"repobilityId": "2bbf40d30ad7f7d5", "scanner": "scanner-primary", "fingerprint": "ca162536e1623293", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8ac3a208cf6bdc6d", "level": "note", "message": {"text": "Unused endpoint: GET /api/accounts/me"}, "properties": {"repobilityId": "e0f0ea308d3c3432", "scanner": "scanner-primary", "fingerprint": "8ac3a208cf6bdc6d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0201f79d295cb727", "level": "note", "message": {"text": "Unused endpoint: GET /api/admin/accounts"}, "properties": {"repobilityId": "8001a02f657c7285", "scanner": "scanner-primary", "fingerprint": "0201f79d295cb727", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1e102ed59a789bcb", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/accounts"}, "properties": {"repobilityId": "399740f47484a163", "scanner": "scanner-primary", "fingerprint": "1e102ed59a789bcb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ae84bb2d4c9f1a38", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/accounts/:id/reset-password"}, "properties": {"repobilityId": "8efaa73bb4f87824", "scanner": "scanner-primary", "fingerprint": "ae84bb2d4c9f1a38", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-aa10bcd05f5f43e8", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/admin/accounts/:id"}, "properties": {"repobilityId": "73929720a226d8c1", "scanner": "scanner-primary", "fingerprint": "aa10bcd05f5f43e8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-104a21ab57cf5133", "level": "note", "message": {"text": "Unused endpoint: GET /api/admin/instances"}, "properties": {"repobilityId": "54ae744831d37c7b", "scanner": "scanner-primary", "fingerprint": "104a21ab57cf5133", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c1892425cf85563a", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/instances"}, "properties": {"repobilityId": "03cad28c183e2a19", "scanner": "scanner-primary", "fingerprint": "c1892425cf85563a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3922de4367054d74", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/instances/:id/owner"}, "properties": {"repobilityId": "9d0b7aa7774bdb7e", "scanner": "scanner-primary", "fingerprint": "3922de4367054d74", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a06cffee5112e296", "level": "note", "message": {"text": "Unused endpoint: GET /api/games"}, "properties": {"repobilityId": "4400295f38ad80de", "scanner": "scanner-primary", "fingerprint": "a06cffee5112e296", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e9512e620fe1f405", "level": "note", "message": {"text": "Unused endpoint: POST /api/games"}, "properties": {"repobilityId": "9632bf53a7d18558", "scanner": "scanner-primary", "fingerprint": "e9512e620fe1f405", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-23eb683a499f21b0", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/games/:gameId"}, "properties": {"repobilityId": "728b3a936522c31e", "scanner": "scanner-primary", "fingerprint": "23eb683a499f21b0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-83ec50e5b8384385", "level": "note", "message": {"text": "Unused endpoint: GET /api/games/:gameId/join-info"}, "properties": {"repobilityId": "1511ae584f214c5c", "scanner": "scanner-primary", "fingerprint": "83ec50e5b8384385", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b60bff4429fbc3e2", "level": "note", "message": {"text": "Unused endpoint: GET /api/games/:gameId/state"}, "properties": {"repobilityId": "c9b3a73c72f9c65d", "scanner": "scanner-primary", "fingerprint": "b60bff4429fbc3e2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e25d1cd7ce890ade", "level": "note", "message": {"text": "Unused endpoint: POST /api/games/:gameId/state"}, "properties": {"repobilityId": "1c978fe14db8762f", "scanner": "scanner-primary", "fingerprint": "e25d1cd7ce890ade", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-569be485c6c4a8e6", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/games/:gameId/state"}, "properties": {"repobilityId": "b9a44a494e9dffed", "scanner": "scanner-primary", "fingerprint": "569be485c6c4a8e6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f3bf72f059406b13", "level": "note", "message": {"text": "Unused endpoint: GET /api/logs"}, "properties": {"repobilityId": "b724dc7b282d20ee", "scanner": "scanner-primary", "fingerprint": "f3bf72f059406b13", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3eef493a444fb388", "level": "note", "message": {"text": "Unused endpoint: GET /api/logs/summary"}, "properties": {"repobilityId": "765777d4f8356c8c", "scanner": "scanner-primary", "fingerprint": "3eef493a444fb388", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d7c30a37cb9d1825", "level": "note", "message": {"text": "Unused endpoint: GET /api/gamestate"}, "properties": {"repobilityId": "ae174dd097e6be54", "scanner": "scanner-primary", "fingerprint": "d7c30a37cb9d1825", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bee9c956dcd05b10", "level": "note", "message": {"text": "Unused endpoint: POST /api/gamestate"}, "properties": {"repobilityId": "ada40c5557564998", "scanner": "scanner-primary", "fingerprint": "bee9c956dcd05b10", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-045bac733578d322", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/gamestate"}, "properties": {"repobilityId": "0b3189c884fc12ef", "scanner": "scanner-primary", "fingerprint": "045bac733578d322", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fb9f8c918cdb7837", "level": "note", "message": {"text": "Unused endpoint: GET /api/debug/state"}, "properties": {"repobilityId": "4d7a0e0e37827b40", "scanner": "scanner-primary", "fingerprint": "fb9f8c918cdb7837", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6ff9f94f725868d1", "level": "note", "message": {"text": "Unused endpoint: GET /api/debug/games"}, "properties": {"repobilityId": "ef2a2f1f52e00929", "scanner": "scanner-primary", "fingerprint": "6ff9f94f725868d1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8eef9255ce375627", "level": "note", "message": {"text": "Unused endpoint: POST /api/feedback"}, "properties": {"repobilityId": "fb1a927927061742", "scanner": "scanner-primary", "fingerprint": "8eef9255ce375627", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-885496963c3ace9f", "level": "note", "message": {"text": "Unused endpoint: GET /api/feedback"}, "properties": {"repobilityId": "730eaabd2e055f0d", "scanner": "scanner-primary", "fingerprint": "885496963c3ace9f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ddea0fe9ee2d5b25", "level": "note", "message": {"text": "Unused endpoint: GET /api/feedback/:id"}, "properties": {"repobilityId": "644df584b1cb55fb", "scanner": "scanner-primary", "fingerprint": "ddea0fe9ee2d5b25", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9d384e0c4e9a7094", "level": "note", "message": {"text": "Unused endpoint: PATCH /api/feedback/:id"}, "properties": {"repobilityId": "81ac24e8119b3877", "scanner": "scanner-primary", "fingerprint": "9d384e0c4e9a7094", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-88987d7b7e0c6e9a", "level": "note", "message": {"text": "Unused endpoint: GET /api/public/feedback/open"}, "properties": {"repobilityId": "1863506588fa67b6", "scanner": "scanner-primary", "fingerprint": "88987d7b7e0c6e9a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}