{"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-fba9d9698044ba3a", "name": "Possibly dead Python function: cmd_summary", "shortDescription": {"text": "Possibly dead Python function: cmd_summary"}, "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-314345862b5c592e", "name": "Possibly dead Python function: cmd_threads", "shortDescription": {"text": "Possibly dead Python function: cmd_threads"}, "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-721c40719c77705e", "name": "Possibly dead Python function: cmd_pages", "shortDescription": {"text": "Possibly dead Python function: cmd_pages"}, "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-056f39f9a6c07409", "name": "Possibly dead Python function: cmd_categories", "shortDescription": {"text": "Possibly dead Python function: cmd_categories"}, "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-4783b2e4a98c59b4", "name": "Possibly dead Python function: cmd_hot_functions", "shortDescription": {"text": "Possibly dead Python function: cmd_hot_functions"}, "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-0d1f4554c7fbcba5", "name": "Possibly dead Python function: cmd_hot_stacks", "shortDescription": {"text": "Possibly dead Python function: cmd_hot_stacks"}, "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-43cc463fc888d031", "name": "Possibly dead Python function: cmd_long_markers", "shortDescription": {"text": "Possibly dead Python function: cmd_long_markers"}, "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-a1c0c318596620fb", "name": "Possibly dead Python function: cmd_marker_types", "shortDescription": {"text": "Possibly dead Python function: cmd_marker_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-f31ae791c64a12ab", "name": "Possibly dead Python function: cmd_network", "shortDescription": {"text": "Possibly dead Python function: cmd_network"}, "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-926ba704aace4b68", "name": "Possibly dead Python function: cmd_search_functions", "shortDescription": {"text": "Possibly dead Python function: cmd_search_functions"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bead75b0f9233e05", "name": "No API endpoints detected", "shortDescription": {"text": "No API endpoints detected"}, "fullDescription": {"text": "The scanner did not find FastAPI/Flask/Express/NestJS/GraphQL/gRPC routes. If this repo exposes APIs, the framework may be unsupported."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ea42a1ce9ae4e2a0", "name": "TODO/FIXME marker in shipping code \u2014 spacetimedb/src/index.ts:87", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 spacetimedb/src/index.ts:87"}, "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-16c00bab5eec93c2", "name": "Stray `console.log` in TS/JS \u2014 scripts/sync-duplicate-cards.ts:81", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/sync-duplicate-cards.ts:81"}, "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-6e85f176154fcb60", "name": "Stray `console.log` in TS/JS \u2014 scripts/validate-tournament-replay.ts:266", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/validate-tournament-replay.ts:266"}, "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-8e867ad8b572f4ff", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-prices-api.ts:39", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-prices-api.ts:39"}, "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-a9e5117c878873aa", "name": "Stray `console.log` in TS/JS \u2014 scripts/parse-paragons.js:147", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/parse-paragons.js:147"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0843709503f64546", "name": "Stray `console.log` in TS/JS \u2014 scripts/investigate-unmatched.ts:103", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/investigate-unmatched.ts:103"}, "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-726676bbdd7240d7", "name": "Stray `console.log` in TS/JS \u2014 scripts/build-price-mappings.ts:53", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/build-price-mappings.ts:53"}, "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-4cbbf5fd339ea280", "name": "Stray `console.log` in TS/JS \u2014 scripts/export-prices-json.ts:48", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/export-prices-json.ts:48"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4d8782bd7dba3555", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-full-sync.ts:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-full-sync.ts:11"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-eff78364a6f1da37", "name": "Stray `console.log` in TS/JS \u2014 scripts/run-claude-matching.ts:108", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/run-claude-matching.ts:108"}, "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-4dd28011767e336e", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-shopify-products.ts:35", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-shopify-products.ts:35"}, "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-bd2ed6edcea56226", "name": "Stray `console.log` in TS/JS \u2014 scripts/add-fundraiser-prices.ts:90", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/add-fundraiser-prices.ts:90"}, "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-914d4727e0b53266", "name": "Stray `console.log` in TS/JS \u2014 scripts/parse-carddata.js:92", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/parse-carddata.js:92"}, "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-690992c575fdded8", "name": "Stray `console.log` in TS/JS \u2014 scripts/list-unmatched.ts:31", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/list-unmatched.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-469d81208f05145a", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-sync-listings.ts:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-sync-listings.ts:12"}, "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-e86a32432fdd92c2", "name": "Stray `console.log` in TS/JS \u2014 scripts/backfill-deck-legality.ts:92", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-deck-legality.ts:92"}, "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-f9b97c9a01d1133e", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-duplicate-lookups.ts:140", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-duplicate-lookups.ts:140"}, "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-1b3de43373fc085c", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-unmatched.ts:258", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-unmatched.ts:258"}, "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-b81414bf1a163000", "name": "Stray `console.log` in TS/JS \u2014 components/ui/match-edit.tsx:180", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 components/ui/match-edit.tsx:180"}, "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-49cc052993cb3bfd", "name": "`truncate` class without `title=` for hover reveal \u2014 components/ui/AttachDeckDialog.tsx:203", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ui/AttachDeckDialog.tsx:203"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-014fe7d89c99b18c", "name": "`truncate` class without `title=` for hover reveal \u2014 components/ui/ParticipantTable.tsx:204", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ui/ParticipantTable.tsx:204"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2d29bcc819f7d89e", "name": "`truncate` class without `title=` for hover reveal \u2014 components/ui/StandingsTable.tsx:334", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ui/StandingsTable.tsx:334"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0284fd486e9be46c", "name": "`truncate` class without `title=` for hover reveal \u2014 components/ui/TournamentSettings.tsx:201", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ui/TournamentSettings.tsx:201"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6603e7042e4378a7", "name": "`truncate` class without `title=` for hover reveal \u2014 components/ui/TournamentRounds.tsx:1350", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ui/TournamentRounds.tsx:1350"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bb8a92b723f4fb83", "name": "Stray `console.log` in TS/JS \u2014 components/ui/TournamentRounds.tsx:411", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 components/ui/TournamentRounds.tsx:411"}, "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-f163e4ffb7b89512", "name": "`truncate` class without `title=` for hover reveal \u2014 app/collection/client.tsx:586", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/collection/client.tsx:586"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fadcae64a5d45170", "name": "Stray `console.log` in TS/JS \u2014 app/play/components/SpacetimeConnectionResetWrapper.tsx:119", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/play/components/SpacetimeConnectionResetWrapper.tsx:119"}, "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-327ddfb2b12ece40", "name": "`truncate` class without `title=` for hover reveal \u2014 app/play/components/PregameScreen.tsx:347", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/play/components/PregameScreen.tsx:347"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-60f0399be254e5b8", "name": "`truncate` class without `title=` for hover reveal \u2014 app/play/components/LobbyList.tsx:164", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/play/components/LobbyList.tsx:164"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-38c6112913c1977c", "name": "`truncate` class without `title=` for hover reveal \u2014 app/play/components/GameLobby.tsx:286", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/play/components/GameLobby.tsx:286"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-312e7be097625100", "name": "`truncate` class without `title=` for hover reveal \u2014 app/play/components/DeckPickerCard.tsx:114", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/play/components/DeckPickerCard.tsx:114"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c7f2ca5c2202bafe", "name": "Stray `console.log` in TS/JS \u2014 app/play/[code]/client.tsx:498", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/play/[code]/client.tsx:498"}, "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-c3d0abbf746e9fa2", "name": "`truncate` class without `title=` for hover reveal \u2014 app/play/spectate/[code]/client.tsx:357", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/play/spectate/[code]/client.tsx:357"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d8224ddd522e4efe", "name": "Stray `console.log` in TS/JS \u2014 app/api/cron/sync-rulings/route.ts:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/cron/sync-rulings/route.ts:14"}, "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-880fb100b508620f", "name": "Stray `console.log` in TS/JS \u2014 app/api/cron/sync-prices/route.ts:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/cron/sync-prices/route.ts:18"}, "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-b627b90cb4dc0118", "name": "Stray `console.log` in TS/JS \u2014 app/api/cron/sync-listings/route.ts:48", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/cron/sync-listings/route.ts:48"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-66eb50af0af0000f", "name": "Stray `console.log` in TS/JS \u2014 app/api/sync-card-images/route.ts:57", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/sync-card-images/route.ts:57"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6a100b68c4fb34ab", "name": "`truncate` class without `title=` for hover reveal \u2014 app/tracker/tournaments/page.tsx:176", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/tracker/tournaments/page.tsx:176"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-170084d8ecc12de9", "name": "Stray `console.log` in TS/JS \u2014 app/tracker/tournaments/[id]/page.tsx:386", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/tracker/tournaments/[id]/page.tsx:386"}, "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-daf19e5ea93d5379", "name": "`truncate` class without `title=` for hover reveal \u2014 app/tournaments/tournaments-client.tsx:198", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/tournaments/tournaments-client.tsx:198"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-66e59f12a30c9ff9", "name": "TODO/FIXME marker in shipping code \u2014 app/goldfish/state/gameInitializer.ts:108", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 app/goldfish/state/gameInitializer.ts:108"}, "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-af39a56857011793", "name": "TODO/FIXME marker in shipping code \u2014 app/goldfish/components/GoldfishCanvas.tsx:2166", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 app/goldfish/components/GoldfishCanvas.tsx:2166"}, "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-02f7e19caab382c0", "name": "`truncate` class without `title=` for hover reveal \u2014 app/admin/spoilers/page.tsx:845", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/spoilers/page.tsx:845"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-354e9b39e66e8d46", "name": "`truncate` class without `title=` for hover reveal \u2014 app/admin/cards/page.tsx:154", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/cards/page.tsx:154"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d3abceb06fd48580", "name": "Stray `console.log` in TS/JS \u2014 app/admin/registrations/page.tsx:388", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/admin/registrations/page.tsx:388"}, "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-a74e344ddfa7ff91", "name": "`truncate` class without `title=` for hover reveal \u2014 app/decklist/generate/DeckSourcePicker.tsx:322", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/decklist/generate/DeckSourcePicker.tsx:322"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2df853feeb0d1e84", "name": "`truncate` class without `title=` for hover reveal \u2014 app/decklist/[deckId]/client.tsx:537", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/decklist/[deckId]/client.tsx:537"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e0ba54b435fd5dfb", "name": "`truncate` class without `title=` for hover reveal \u2014 app/decklist/my-decks/client.tsx:740", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/decklist/my-decks/client.tsx:740"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-44a3d03f82e075af", "name": "`truncate` class without `title=` for hover reveal \u2014 app/decklist/my-decks/QuickLookModal.tsx:120", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/decklist/my-decks/QuickLookModal.tsx:120"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d5ad1b5b540a7c11", "name": "`truncate` class without `title=` for hover reveal \u2014 app/decklist/community/client.tsx:867", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/decklist/community/client.tsx:867"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e4f8bd023482a6ed", "name": "`truncate` class without `title=` for hover reveal \u2014 app/decklist/card-search/ModalWithClose.tsx:805", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/decklist/card-search/ModalWithClose.tsx:805"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f145c737d6f214a5", "name": "`truncate` class without `title=` for hover reveal \u2014 app/decklist/card-search/client.tsx:2520", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/decklist/card-search/client.tsx:2520"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ac0d67448c194e43", "name": "`truncate` class without `title=` for hover reveal \u2014 app/decklist/card-search/components/DeckBuilderPanel.tsx:945", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/decklist/card-search/components/DeckBuilderPanel.tsx:945"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6b1322b0f6025248", "name": "`truncate` class without `title=` for hover reveal \u2014 app/decklist/card-search/components/CollectionCheckModal.tsx:157", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/decklist/card-search/components/CollectionCheckModal.tsx:157"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d06aa9a43765d021", "name": "`truncate` class without `title=` for hover reveal \u2014 app/decklist/card-search/components/FullDeckView.tsx:458", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/decklist/card-search/components/FullDeckView.tsx:458"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d350a297cc146ee8", "name": "`truncate` class without `title=` for hover reveal \u2014 app/decklist/card-search/components/DeckCardList.tsx:467", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/decklist/card-search/components/DeckCardList.tsx:467"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b2e11baf4d02fc2a", "name": "`truncate` class without `title=` for hover reveal \u2014 app/decklist/card-search/components/ParagonRequirements.tsx:97", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/decklist/card-search/components/ParagonRequirements.tsx:97"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-de79fb5db55934b6", "name": "`truncate` class without `title=` for hover reveal \u2014 app/decklist/card-search/components/BuyDeckModal.tsx:429", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/decklist/card-search/components/BuyDeckModal.tsx:429"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8923e3c496f7d8a3", "name": "`truncate` class without `title=` for hover reveal \u2014 app/decklist/card-search/components/LoadDeckModal.tsx:169", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/decklist/card-search/components/LoadDeckModal.tsx:169"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-881741532ae0c155", "name": "`truncate` class without `title=` for hover reveal \u2014 app/decklist/card-search/random/client.tsx:149", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/decklist/card-search/random/client.tsx:149"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-97ef7a79a5b7e45d", "name": "Stray `console.log` in TS/JS \u2014 app/decklist/card-search/hooks/useDeckState.ts:126", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/decklist/card-search/hooks/useDeckState.ts:126"}, "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-3cf148eb92fce7ff", "name": "`truncate` class without `title=` for hover reveal \u2014 app/spoilers/spoilers-client.tsx:283", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/spoilers/spoilers-client.tsx:283"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c551f80973179383", "name": "`truncate` class without `title=` for hover reveal \u2014 app/spoilers/[id]/page.tsx:174", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/spoilers/[id]/page.tsx:174"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0eee044312ea0596", "name": "`truncate` class without `title=` for hover reveal \u2014 app/board/ProjectorBoard.tsx:137", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/board/ProjectorBoard.tsx:137"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0b63e1337071b173", "name": "Stray `console.log` in TS/JS \u2014 lib/listings/sync.ts:46", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/listings/sync.ts:46"}, "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-ef4dc533f30eb3f4", "name": "Stray `console.log` in TS/JS \u2014 lib/pricing/matching.ts:549", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/pricing/matching.ts:549"}, "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-2192e3bf1ea14a86", "name": "Insecure pattern 'node_child_process' in scripts/sync-duplicate-cards.ts:16", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/sync-duplicate-cards.ts:16"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-47d735e4470ed5e6", "name": "Insecure pattern 'document_write' in utils/printUtils.ts:133", "shortDescription": {"text": "Insecure pattern 'document_write' in utils/printUtils.ts:133"}, "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-f21c20ddb26092d6", "name": "Insecure pattern 'direct_innerhtml_assignment' in app/threshingfloor/outline.html:1899", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/threshingfloor/outline.html:1899"}, "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-97321257bc0b701f", "name": "Insecure pattern 'insert_adjacent_html' in app/threshingfloor/outline.html:1892", "shortDescription": {"text": "Insecure pattern 'insert_adjacent_html' in app/threshingfloor/outline.html:1892"}, "fullDescription": {"text": "Found a known-risky pattern (insert_adjacent_html). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7b09d2a2fbc63f75", "name": "Insecure pattern 'cors_wildcard' in lib/api/cors.ts:4", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in lib/api/cors.ts:4"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c234b0099c373393", "name": "Possible secret in e2e/spectatorSeed.ts", "shortDescription": {"text": "Possible secret in e2e/spectatorSeed.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-dfa6a4c0e7386f85", "name": "Possible secret in e2e/seed.ts", "shortDescription": {"text": "Possible secret in e2e/seed.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-b3b331bf67701755", "name": "Possible secret in e2e/repair/non-host-view.spec.ts", "shortDescription": {"text": "Possible secret in e2e/repair/non-host-view.spec.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-037ff498dcf79082", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/setup-node@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3beb716b02c53f57", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-95b7a55dac779be2", "name": "Very large file: spacetimedb/src/index.ts (6996 lines)", "shortDescription": {"text": "Very large file: spacetimedb/src/index.ts (6996 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-5d37c713fc737a77", "name": "Very large file: utils/deckcheck/rules.ts (1638 lines)", "shortDescription": {"text": "Very large file: utils/deckcheck/rules.ts (1638 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-3c76384f475b7d13", "name": "Very large file: utils/deckcheck/__tests__/rules-t2.test.ts (1795 lines)", "shortDescription": {"text": "Very large file: utils/deckcheck/__tests__/rules-t2.test.ts (1795 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-462220cc1a14aac1", "name": "Very large file: utils/deckcheck/__tests__/rules.test.ts (2408 lines)", "shortDescription": {"text": "Very large file: utils/deckcheck/__tests__/rules.test.ts (2408 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-19fc4d9acc035758", "name": "Very large file: components/ui/TournamentRounds.tsx (1607 lines)", "shortDescription": {"text": "Very large file: components/ui/TournamentRounds.tsx (1607 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-bfecc28fdde928e2", "name": "Very large file: app/play/components/MultiplayerCanvas.tsx (7550 lines)", "shortDescription": {"text": "Very large file: app/play/components/MultiplayerCanvas.tsx (7550 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-bb9a096f79269c51", "name": "Very large file: app/play/components/ChatPanel.tsx (2241 lines)", "shortDescription": {"text": "Very large file: app/play/components/ChatPanel.tsx (2241 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-16bf90db9f56d16c", "name": "Very large file: app/play/[code]/client.tsx (1693 lines)", "shortDescription": {"text": "Very large file: app/play/[code]/client.tsx (1693 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-1ab88009b5b0d6a5", "name": "Very large file: app/goldfish/state/gameReducer.ts (1564 lines)", "shortDescription": {"text": "Very large file: app/goldfish/state/gameReducer.ts (1564 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-a1e83832cd6ffab0", "name": "Very large file: app/goldfish/components/GoldfishCanvas.tsx (3022 lines)", "shortDescription": {"text": "Very large file: app/goldfish/components/GoldfishCanvas.tsx (3022 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-d8826d1b9202b6ee", "name": "Very large file: app/admin/registrations/page.tsx (1700 lines)", "shortDescription": {"text": "Very large file: app/admin/registrations/page.tsx (1700 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-0a610d58ac5e49d3", "name": "Very large file: app/decklist/actions.ts (1826 lines)", "shortDescription": {"text": "Very large file: app/decklist/actions.ts (1826 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-5c2f813e6ba588ec", "name": "Very large file: app/decklist/[deckId]/client.tsx (1892 lines)", "shortDescription": {"text": "Very large file: app/decklist/[deckId]/client.tsx (1892 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-12f3193cc44ef721", "name": "Very large file: app/decklist/my-decks/client.tsx (2177 lines)", "shortDescription": {"text": "Very large file: app/decklist/my-decks/client.tsx (2177 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-1b2134588e6a7d6f", "name": "Very large file: app/decklist/card-search/ModalWithClose.tsx (1661 lines)", "shortDescription": {"text": "Very large file: app/decklist/card-search/ModalWithClose.tsx (1661 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-496b47636eaf530d", "name": "Very large file: app/decklist/card-search/client.tsx (3194 lines)", "shortDescription": {"text": "Very large file: app/decklist/card-search/client.tsx (3194 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-8330295d951ff423", "name": "Very large file: app/decklist/card-search/components/DeckBuilderPanel.tsx (3752 lines)", "shortDescription": {"text": "Very large file: app/decklist/card-search/components/DeckBuilderPanel.tsx (3752 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea3b5e389d8c9c0f", "name": "Low test-to-source ratio", "shortDescription": {"text": "Low test-to-source ratio"}, "fullDescription": {"text": "58 tests / 534 src (ratio 0.11)."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 226 console/debugger/print-style debug statements in non-test source. This is a common fast-generation residue before production cleanup."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 120 placeholder/mock markers across 50 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9d79c4077342a7d0", "name": "Runtime service client appears to use placeholder configuration", "shortDescription": {"text": "Runtime service client appears to use placeholder configuration"}, "fullDescription": {"text": "A runtime source file appears to wire Supabase/Firebase/AI/payment-style clients to placeholder URLs, keys, or fallback values. In the Fable corpus this often means the UI/API shape is present while the backend service is not actually configured."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dbe34e3c578eb187", "name": "Agent authority lacks a verifier contract: .claude/skills/inspect-firefox-profile/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/inspect-firefox-profile/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-64824c71c8c531b8", "name": "Agent authority lacks a verifier contract: .claude/skills/price-stats/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/price-stats/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-05a967f108ac02d9", "name": "Agent authority lacks a verifier contract: .claude/skills/check-price/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/check-price/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-23cd93fbe3b1b59f", "name": "Commented-code block (6 lines) in spacetimedb/src/schema.ts:145", "shortDescription": {"text": "Commented-code block (6 lines) in spacetimedb/src/schema.ts:145"}, "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-88a0b91ec5dab8ac", "name": "Commented-code block (6 lines) in spacetimedb/src/index.ts:54", "shortDescription": {"text": "Commented-code block (6 lines) in spacetimedb/src/index.ts:54"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-81bf8e923de8e6eb", "name": "Commented-code block (7 lines) in spacetimedb/src/cardAbilities.ts:1", "shortDescription": {"text": "Commented-code block (7 lines) in spacetimedb/src/cardAbilities.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-6bb9a7d9d238811e", "name": "Commented-code block (6 lines) in scripts/sync-duplicate-cards.ts:68", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/sync-duplicate-cards.ts:68"}, "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-8ab9321e4518e29a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-prices-api.ts:58", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-prices-api.ts:58"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dae663d9c1aeadcf", "name": "Commented-code block (5 lines) in utils/supabase/getUserSafe.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in utils/supabase/getUserSafe.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-b47eec92da0893f9", "name": "Commented-code block (5 lines) in utils/supabase/middleware.ts:58", "shortDescription": {"text": "Commented-code block (5 lines) in utils/supabase/middleware.ts:58"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-90993b598475dfef", "name": "Commented-code block (7 lines) in utils/deckcheck/rules.ts:257", "shortDescription": {"text": "Commented-code block (7 lines) in utils/deckcheck/rules.ts:257"}, "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-551feed25f0461ea", "name": "Commented-code block (7 lines) in utils/deckcheck/index.ts:156", "shortDescription": {"text": "Commented-code block (7 lines) in utils/deckcheck/index.ts:156"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9769b67f6d244ab3", "name": "Commented-code block (35 lines) in utils/deckcheck/__tests__/rules-t2.test.ts:548", "shortDescription": {"text": "Commented-code block (35 lines) in utils/deckcheck/__tests__/rules-t2.test.ts:548"}, "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-887864e2e43505b9", "name": "Commented-code block (6 lines) in utils/deckcheck/__tests__/rules.test.ts:2198", "shortDescription": {"text": "Commented-code block (6 lines) in utils/deckcheck/__tests__/rules.test.ts:2198"}, "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-0aa70f011d230b36", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/ui/AuditLogPanel.tsx:54", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/ui/AuditLogPanel.tsx:54"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6079d3fed4236e09", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/ui/RepairTournamentBanner.tsx:37", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/ui/RepairTournamentBanner.tsx:37"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c23411cbad510d72", "name": "Commented-code block (5 lines) in components/ui/StandingsTable.tsx:163", "shortDescription": {"text": "Commented-code block (5 lines) in components/ui/StandingsTable.tsx:163"}, "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-4205b7926d78df81", "name": "Commented-code block (5 lines) in components/ui/TournamentRounds.tsx:149", "shortDescription": {"text": "Commented-code block (5 lines) in components/ui/TournamentRounds.tsx:149"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7f1226fcd87e0ee7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/ui/TournamentRounds.tsx:273", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/ui/TournamentRounds.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-a1c0175542617377", "name": "Commented-code block (5 lines) in components/ui/__tests__/standingsTable.test.ts:76", "shortDescription": {"text": "Commented-code block (5 lines) in components/ui/__tests__/standingsTable.test.ts: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-88773fbd98207cc5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/rulings/page.tsx:367", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/rulings/page.tsx:367"}, "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-bae92534b347fafc", "name": "Commented-code block (5 lines) in app/collection/hooks/useCollectionState.ts:60", "shortDescription": {"text": "Commented-code block (5 lines) in app/collection/hooks/useCollectionState.ts:60"}, "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-79abccf1e3fcc119", "name": "Commented-code block (5 lines) in app/threshingfloor/api/store/[key]/route.ts:21", "shortDescription": {"text": "Commented-code block (5 lines) in app/threshingfloor/api/store/[key]/route.ts:21"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2227173932a32b73", "name": "Commented-code block (6 lines) in app/play/layout/multiplayerLayout.ts:496", "shortDescription": {"text": "Commented-code block (6 lines) in app/play/layout/multiplayerLayout.ts:496"}, "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-0bf09ed1bb4bed98", "name": "Commented-code block (8 lines) in app/play/components/SpacetimeConnectionResetWrapper.tsx:26", "shortDescription": {"text": "Commented-code block (8 lines) in app/play/components/SpacetimeConnectionResetWrapper.tsx:26"}, "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-2bf833275eea3ab6", "name": "Commented-code block (7 lines) in app/play/components/MultiplayerCanvas.tsx:329", "shortDescription": {"text": "Commented-code block (7 lines) in app/play/components/MultiplayerCanvas.tsx:329"}, "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-4fb575882dea66fb", "name": "Commented-code block (5 lines) in app/play/components/PregameScreen.tsx:689", "shortDescription": {"text": "Commented-code block (5 lines) in app/play/components/PregameScreen.tsx:689"}, "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-44c44d17606eabd1", "name": "Commented-code block (6 lines) in app/play/components/TurnIndicator.tsx:8", "shortDescription": {"text": "Commented-code block (6 lines) in app/play/components/TurnIndicator.tsx:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8d746094784016c7", "name": "Commented-code block (6 lines) in app/play/components/LobbyList.tsx:30", "shortDescription": {"text": "Commented-code block (6 lines) in app/play/components/LobbyList.tsx: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-96588f1bb6a16370", "name": "Commented-code block (5 lines) in app/play/components/__tests__/isHandCardFaceVisible.test.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in app/play/components/__tests__/isHandCardFaceVisible.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-ce188d18a8512b0f", "name": "Commented-code block (5 lines) in app/play/lib/__tests__/gameEntryDecision.test.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in app/play/lib/__tests__/gameEntryDecision.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-1f347bf7438eb9e7", "name": "Commented-code block (5 lines) in app/play/[code]/client.tsx:158", "shortDescription": {"text": "Commented-code block (5 lines) in app/play/[code]/client.tsx:158"}, "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-d71fce2780b1d948", "name": "Commented-code block (9 lines) in app/play/hooks/useSpacetimeConnection.ts:34", "shortDescription": {"text": "Commented-code block (9 lines) in app/play/hooks/useSpacetimeConnection.ts:34"}, "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-b8b24f62cd1b634b", "name": "Commented-code block (5 lines) in app/play/hooks/undoStackCore.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in app/play/hooks/undoStackCore.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-f281f5f25ca23588", "name": "Commented-code block (8 lines) in app/play/hooks/useGameState.ts:174", "shortDescription": {"text": "Commented-code block (8 lines) in app/play/hooks/useGameState.ts:174"}, "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-39f7725685bcea83", "name": "Commented-code block (5 lines) in app/play/spectate/[code]/client.tsx:95", "shortDescription": {"text": "Commented-code block (5 lines) in app/play/spectate/[code]/client.tsx:95"}, "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-c771f0f5ce879303", "name": "Commented-code block (5 lines) in app/tracker/reset-password/session-handler.tsx:6", "shortDescription": {"text": "Commented-code block (5 lines) in app/tracker/reset-password/session-handler.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-d7de607c63f7b37b", "name": "Commented-code block (6 lines) in app/tracker/tournaments/__tests__/repair-actions.test.ts:326", "shortDescription": {"text": "Commented-code block (6 lines) in app/tracker/tournaments/__tests__/repair-actions.test.ts: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-b5ed4ae36be9bd4b", "name": "Commented-code block (5 lines) in app/tracker/tournaments/[id]/page.tsx:337", "shortDescription": {"text": "Commented-code block (5 lines) in app/tracker/tournaments/[id]/page.tsx:337"}, "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-4e52a9a4688dc995", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/tracker/tournaments/[id]/page.tsx:938", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/tracker/tournaments/[id]/page.tsx:938"}, "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-b77671dc42e3036c", "name": "Commented-code block (6 lines) in app/shared/types/gameActions.ts:93", "shortDescription": {"text": "Commented-code block (6 lines) in app/shared/types/gameActions.ts:93"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2d97ada623adae71", "name": "Commented-code block (8 lines) in app/shared/components/DeckSearchModal.tsx:240", "shortDescription": {"text": "Commented-code block (8 lines) in app/shared/components/DeckSearchModal.tsx:240"}, "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-876427774ddabaf0", "name": "Commented-code block (6 lines) in app/shared/components/DeckExchangeModal.tsx:187", "shortDescription": {"text": "Commented-code block (6 lines) in app/shared/components/DeckExchangeModal.tsx:187"}, "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-406c7517eaf59c98", "name": "Commented-code block (5 lines) in app/shared/components/CardChoicePrompt.tsx:44", "shortDescription": {"text": "Commented-code block (5 lines) in app/shared/components/CardChoicePrompt.tsx:44"}, "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-2de5b4933874940c", "name": "Commented-code block (5 lines) in app/shared/components/GameCardNode.tsx:204", "shortDescription": {"text": "Commented-code block (5 lines) in app/shared/components/GameCardNode.tsx:204"}, "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-a2a01c44829b8155", "name": "Commented-code block (7 lines) in app/shared/components/toastKeyboardNav.ts:8", "shortDescription": {"text": "Commented-code block (7 lines) in app/shared/components/toastKeyboardNav.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-d04203a0129a2ed8", "name": "Commented-code block (5 lines) in app/shared/components/CardContextMenu.tsx:169", "shortDescription": {"text": "Commented-code block (5 lines) in app/shared/components/CardContextMenu.tsx:169"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-423e0b93d9965c5f", "name": "Commented-code block (5 lines) in app/shared/hooks/useModalCardDrag.ts:182", "shortDescription": {"text": "Commented-code block (5 lines) in app/shared/hooks/useModalCardDrag.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-35c82a00f20b740c", "name": "Commented-code block (5 lines) in app/goldfish/state/gameReducer.ts:659", "shortDescription": {"text": "Commented-code block (5 lines) in app/goldfish/state/gameReducer.ts:659"}, "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-542338cbccf07155", "name": "Commented-code block (5 lines) in app/goldfish/components/GoldfishCanvas.tsx:86", "shortDescription": {"text": "Commented-code block (5 lines) in app/goldfish/components/GoldfishCanvas.tsx:86"}, "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-0751083953f999a9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/spoilers/page.tsx:478", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/spoilers/page.tsx:478"}, "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-d5574637642051a3", "name": "Commented-code block (8 lines) in app/admin/cards/actions.ts:704", "shortDescription": {"text": "Commented-code block (8 lines) in app/admin/cards/actions.ts:704"}, "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-9d43d4d9ba6be8e3", "name": "Commented-code block (5 lines) in app/decklist/card-search/client.tsx:2286", "shortDescription": {"text": "Commented-code block (5 lines) in app/decklist/card-search/client.tsx:2286"}, "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-d8ee2959cb980a3d", "name": "Commented-code block (6 lines) in app/decklist/card-search/utils/deckImportExport.ts:160", "shortDescription": {"text": "Commented-code block (6 lines) in app/decklist/card-search/utils/deckImportExport.ts:160"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8e8ddd2ceceb4d0b", "name": "Commented-code block (6 lines) in app/decklist/card-search/components/DeckBuilderPanel.tsx:341", "shortDescription": {"text": "Commented-code block (6 lines) in app/decklist/card-search/components/DeckBuilderPanel.tsx: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-fe1135d19fcc6b4a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/decklist/card-search/components/GenerateDeckImageModal.tsx:72", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/decklist/card-search/components/GenerateDeckImageModal.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-cf651f08d48b06d9", "name": "Commented-code block (5 lines) in app/decklist/card-search/components/DeckCardList.tsx:121", "shortDescription": {"text": "Commented-code block (5 lines) in app/decklist/card-search/components/DeckCardList.tsx:121"}, "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-b4ad1f773ae042cb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/decklist/card-search/components/GeneratePDFModal.tsx:83", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/decklist/card-search/components/GeneratePDFModal.tsx:83"}, "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-65e6522e4f77a0dc", "name": "Commented-code block (5 lines) in app/decklist/card-search/hooks/useCardImageUrl.ts:6", "shortDescription": {"text": "Commented-code block (5 lines) in app/decklist/card-search/hooks/useCardImageUrl.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-4cf68d5780f7f0bd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/rulings/discord-sync.ts:55", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/rulings/discord-sync.ts:55"}, "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-34c18adb23c44998", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/listings/fetch.ts:8", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/listings/fetch.ts:8"}, "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-ab136f744a6bf686", "name": "Commented-code block (6 lines) in lib/cards/cardAbilities.ts:43", "shortDescription": {"text": "Commented-code block (6 lines) in lib/cards/cardAbilities.ts:43"}, "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-0984207afc765d6f", "name": "Commented-code block (5 lines) in lib/tournament/pairing.ts:320", "shortDescription": {"text": "Commented-code block (5 lines) in lib/tournament/pairing.ts:320"}, "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-0bd9ce07b18876f6", "name": "Commented-code block (5 lines) in lib/tournament/snapshotRewrite.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in lib/tournament/snapshotRewrite.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-b42304ae48518a47", "name": "Commented-code block (5 lines) in lib/tournament/standingsScoring.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in lib/tournament/standingsScoring.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-bc288f5d6c3f4eb0", "name": "Commented-code block (8 lines) in lib/tournament/standings.ts:3", "shortDescription": {"text": "Commented-code block (8 lines) in lib/tournament/standings.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-1be741daf6b2ffd8", "name": "Commented-code block (5 lines) in lib/tournament/types.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in lib/tournament/types.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-3e72ddeed088ec1b", "name": "Commented-code block (7 lines) in lib/tournament/__tests__/standings.test.ts:42", "shortDescription": {"text": "Commented-code block (7 lines) in lib/tournament/__tests__/standings.test.ts:42"}, "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-ecabca7d3c18c87d", "name": "Commented-code block (5 lines) in lib/tournament/__tests__/simulator-scenarios.test.ts:399", "shortDescription": {"text": "Commented-code block (5 lines) in lib/tournament/__tests__/simulator-scenarios.test.ts:399"}, "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-10f9196ec6ce0bd9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/pricing/shopify.ts:19", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/pricing/shopify.ts:19"}, "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-96cd82db533a04df", "name": "Commented-code block (8 lines) in .claude/skills/improve-area/pipeline.workflow.js:14", "shortDescription": {"text": "Commented-code block (8 lines) in .claude/skills/improve-area/pipeline.workflow.js: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-45aee49f0b4c21cc", "name": "Commented-code block (5 lines) in e2e/repair/golden-path.spec.ts:15", "shortDescription": {"text": "Commented-code block (5 lines) in e2e/repair/golden-path.spec.ts:15"}, "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-55ec6baba7141327", "name": "Commented-code block (8 lines) in e2e/spectator/lobby-lifecycle.spec.ts:9", "shortDescription": {"text": "Commented-code block (8 lines) in e2e/spectator/lobby-lifecycle.spec.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-3a263a3323158f5e", "name": "Commented-code block (6 lines) in e2e/spectator/board.spec.ts:22", "shortDescription": {"text": "Commented-code block (6 lines) in e2e/spectator/board.spec.ts:22"}, "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-5fa1b867d6e46f9f", "name": "Commented-code block (5 lines) in e2e/spectator/spectator.spec.ts:9", "shortDescription": {"text": "Commented-code block (5 lines) in e2e/spectator/spectator.spec.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-d785c17821858dcb", "name": "22 env vars used in code but missing from .env.example", "shortDescription": {"text": "22 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ANTHROPIC_API_KEY`, `BLOB_READ_WRITE_TOKEN`, `CHANNEL_ID`, `CI`, `CRON_SECRET`, `DECKCHECK_API_TOKEN`, `E2E_BASE_URL`, `FROM_EMAIL` + 14 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nscripts/inspect-firefox-profile.py:cmd_categories, scripts/inspect-firefox-profile.py:cmd_hot_stacks\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/21310"}, "properties": {"repository": "timothestes/redemption-tournament-tracker", "repoUrl": "https://github.com/timothestes/redemption-tournament-tracker", "branch": "main"}, "results": [{"ruleId": "scanner-fba9d9698044ba3a", "level": "note", "message": {"text": "Possibly dead Python function: cmd_summary"}, "properties": {"repobilityId": "6926d757078f2bcb", "scanner": "scanner-primary", "fingerprint": "fba9d9698044ba3a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/inspect-firefox-profile.py:301"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-314345862b5c592e", "level": "note", "message": {"text": "Possibly dead Python function: cmd_threads"}, "properties": {"repobilityId": "3c1f81a2a1d805d6", "scanner": "scanner-primary", "fingerprint": "314345862b5c592e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/inspect-firefox-profile.py:383"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-721c40719c77705e", "level": "note", "message": {"text": "Possibly dead Python function: cmd_pages"}, "properties": {"repobilityId": "d5372b740a7f817e", "scanner": "scanner-primary", "fingerprint": "721c40719c77705e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/inspect-firefox-profile.py:412"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-056f39f9a6c07409", "level": "note", "message": {"text": "Possibly dead Python function: cmd_categories"}, "properties": {"repobilityId": "5be4ea84747e22d6", "scanner": "scanner-primary", "fingerprint": "056f39f9a6c07409", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/inspect-firefox-profile.py:431"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4783b2e4a98c59b4", "level": "note", "message": {"text": "Possibly dead Python function: cmd_hot_functions"}, "properties": {"repobilityId": "d3943bc0b8f8b97d", "scanner": "scanner-primary", "fingerprint": "4783b2e4a98c59b4", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/inspect-firefox-profile.py:485"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0d1f4554c7fbcba5", "level": "note", "message": {"text": "Possibly dead Python function: cmd_hot_stacks"}, "properties": {"repobilityId": "db68f51e2ca12fea", "scanner": "scanner-primary", "fingerprint": "0d1f4554c7fbcba5", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/inspect-firefox-profile.py:560"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-43cc463fc888d031", "level": "note", "message": {"text": "Possibly dead Python function: cmd_long_markers"}, "properties": {"repobilityId": "c2e535c7089c2138", "scanner": "scanner-primary", "fingerprint": "43cc463fc888d031", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/inspect-firefox-profile.py:611"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a1c0c318596620fb", "level": "note", "message": {"text": "Possibly dead Python function: cmd_marker_types"}, "properties": {"repobilityId": "3c182f32076dac58", "scanner": "scanner-primary", "fingerprint": "a1c0c318596620fb", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/inspect-firefox-profile.py:680"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f31ae791c64a12ab", "level": "note", "message": {"text": "Possibly dead Python function: cmd_network"}, "properties": {"repobilityId": "77affbf49679246c", "scanner": "scanner-primary", "fingerprint": "f31ae791c64a12ab", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/inspect-firefox-profile.py:711"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-926ba704aace4b68", "level": "note", "message": {"text": "Possibly dead Python function: cmd_search_functions"}, "properties": {"repobilityId": "c881fdfc7955104f", "scanner": "scanner-primary", "fingerprint": "926ba704aace4b68", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/inspect-firefox-profile.py:765"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bead75b0f9233e05", "level": "none", "message": {"text": "No API endpoints detected"}, "properties": {"repobilityId": "0f8bb852027c38f8", "scanner": "scanner-primary", "fingerprint": "bead75b0f9233e05", "layer": "api", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-ea42a1ce9ae4e2a0", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 spacetimedb/src/index.ts:87"}, "properties": {"repobilityId": "8a322401f388661f", "scanner": "scanner-primary", "fingerprint": "ea42a1ce9ae4e2a0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-16c00bab5eec93c2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/sync-duplicate-cards.ts:81"}, "properties": {"repobilityId": "94fc3bc12f0e7e11", "scanner": "scanner-primary", "fingerprint": "16c00bab5eec93c2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6e85f176154fcb60", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/validate-tournament-replay.ts:266"}, "properties": {"repobilityId": "b74f35c2f1a144cf", "scanner": "scanner-primary", "fingerprint": "6e85f176154fcb60", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8e867ad8b572f4ff", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-prices-api.ts:39"}, "properties": {"repobilityId": "6ba637b8aace2c99", "scanner": "scanner-primary", "fingerprint": "8e867ad8b572f4ff", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a9e5117c878873aa", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/parse-paragons.js:147"}, "properties": {"repobilityId": "2f5bac79eeb3d2fb", "scanner": "scanner-primary", "fingerprint": "a9e5117c878873aa", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0843709503f64546", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/investigate-unmatched.ts:103"}, "properties": {"repobilityId": "18d6ea0977972263", "scanner": "scanner-primary", "fingerprint": "0843709503f64546", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-726676bbdd7240d7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/build-price-mappings.ts:53"}, "properties": {"repobilityId": "905b258fbe0f3b89", "scanner": "scanner-primary", "fingerprint": "726676bbdd7240d7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4cbbf5fd339ea280", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/export-prices-json.ts:48"}, "properties": {"repobilityId": "420f5c7de434586e", "scanner": "scanner-primary", "fingerprint": "4cbbf5fd339ea280", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4d8782bd7dba3555", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-full-sync.ts:11"}, "properties": {"repobilityId": "9b5c147e4ded1968", "scanner": "scanner-primary", "fingerprint": "4d8782bd7dba3555", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-eff78364a6f1da37", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/run-claude-matching.ts:108"}, "properties": {"repobilityId": "6685ca31796f32a3", "scanner": "scanner-primary", "fingerprint": "eff78364a6f1da37", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4dd28011767e336e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-shopify-products.ts:35"}, "properties": {"repobilityId": "7d83a64c348b53c6", "scanner": "scanner-primary", "fingerprint": "4dd28011767e336e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bd2ed6edcea56226", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/add-fundraiser-prices.ts:90"}, "properties": {"repobilityId": "3ae8efbe0305f11f", "scanner": "scanner-primary", "fingerprint": "bd2ed6edcea56226", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-914d4727e0b53266", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/parse-carddata.js:92"}, "properties": {"repobilityId": "7e458b4ba6280219", "scanner": "scanner-primary", "fingerprint": "914d4727e0b53266", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-690992c575fdded8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/list-unmatched.ts:31"}, "properties": {"repobilityId": "b3c801970b7734c8", "scanner": "scanner-primary", "fingerprint": "690992c575fdded8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-469d81208f05145a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-sync-listings.ts:12"}, "properties": {"repobilityId": "1266da0d688bad3e", "scanner": "scanner-primary", "fingerprint": "469d81208f05145a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e86a32432fdd92c2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-deck-legality.ts:92"}, "properties": {"repobilityId": "defc456991718e79", "scanner": "scanner-primary", "fingerprint": "e86a32432fdd92c2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f9b97c9a01d1133e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-duplicate-lookups.ts:140"}, "properties": {"repobilityId": "d81b6ca1f1f72ec3", "scanner": "scanner-primary", "fingerprint": "f9b97c9a01d1133e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1b3de43373fc085c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-unmatched.ts:258"}, "properties": {"repobilityId": "da08780c5ff29d07", "scanner": "scanner-primary", "fingerprint": "1b3de43373fc085c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b81414bf1a163000", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 components/ui/match-edit.tsx:180"}, "properties": {"repobilityId": "9933f41770be7056", "scanner": "scanner-primary", "fingerprint": "b81414bf1a163000", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-49cc052993cb3bfd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ui/AttachDeckDialog.tsx:203"}, "properties": {"repobilityId": "5cef2af3e281fe4b", "scanner": "scanner-primary", "fingerprint": "49cc052993cb3bfd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-014fe7d89c99b18c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ui/ParticipantTable.tsx:204"}, "properties": {"repobilityId": "45a7ede56a3cda74", "scanner": "scanner-primary", "fingerprint": "014fe7d89c99b18c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2d29bcc819f7d89e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ui/StandingsTable.tsx:334"}, "properties": {"repobilityId": "4b7dfa40ce73b460", "scanner": "scanner-primary", "fingerprint": "2d29bcc819f7d89e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0284fd486e9be46c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ui/TournamentSettings.tsx:201"}, "properties": {"repobilityId": "547c0c815ac0178d", "scanner": "scanner-primary", "fingerprint": "0284fd486e9be46c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6603e7042e4378a7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ui/TournamentRounds.tsx:1350"}, "properties": {"repobilityId": "87e2a2cfbaeb2a6c", "scanner": "scanner-primary", "fingerprint": "6603e7042e4378a7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bb8a92b723f4fb83", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 components/ui/TournamentRounds.tsx:411"}, "properties": {"repobilityId": "8f1b48dfc3844a2a", "scanner": "scanner-primary", "fingerprint": "bb8a92b723f4fb83", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f163e4ffb7b89512", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/collection/client.tsx:586"}, "properties": {"repobilityId": "5d97f9429c527c48", "scanner": "scanner-primary", "fingerprint": "f163e4ffb7b89512", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fadcae64a5d45170", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/play/components/SpacetimeConnectionResetWrapper.tsx:119"}, "properties": {"repobilityId": "aedceed9698f9266", "scanner": "scanner-primary", "fingerprint": "fadcae64a5d45170", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-327ddfb2b12ece40", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/play/components/PregameScreen.tsx:347"}, "properties": {"repobilityId": "49b92d83b5550d9d", "scanner": "scanner-primary", "fingerprint": "327ddfb2b12ece40", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-60f0399be254e5b8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/play/components/LobbyList.tsx:164"}, "properties": {"repobilityId": "bb14187c14500a21", "scanner": "scanner-primary", "fingerprint": "60f0399be254e5b8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-38c6112913c1977c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/play/components/GameLobby.tsx:286"}, "properties": {"repobilityId": "16269510f0324001", "scanner": "scanner-primary", "fingerprint": "38c6112913c1977c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-312e7be097625100", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/play/components/DeckPickerCard.tsx:114"}, "properties": {"repobilityId": "af62465d81700038", "scanner": "scanner-primary", "fingerprint": "312e7be097625100", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c7f2ca5c2202bafe", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/play/[code]/client.tsx:498"}, "properties": {"repobilityId": "d324f4b09b899d4f", "scanner": "scanner-primary", "fingerprint": "c7f2ca5c2202bafe", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c3d0abbf746e9fa2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/play/spectate/[code]/client.tsx:357"}, "properties": {"repobilityId": "ea92d448b86aef03", "scanner": "scanner-primary", "fingerprint": "c3d0abbf746e9fa2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d8224ddd522e4efe", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/cron/sync-rulings/route.ts:14"}, "properties": {"repobilityId": "aaa6b83bfa09e0b6", "scanner": "scanner-primary", "fingerprint": "d8224ddd522e4efe", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-880fb100b508620f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/cron/sync-prices/route.ts:18"}, "properties": {"repobilityId": "d17a809a7618c771", "scanner": "scanner-primary", "fingerprint": "880fb100b508620f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b627b90cb4dc0118", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/cron/sync-listings/route.ts:48"}, "properties": {"repobilityId": "7bcc315acc7164d3", "scanner": "scanner-primary", "fingerprint": "b627b90cb4dc0118", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-66eb50af0af0000f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/sync-card-images/route.ts:57"}, "properties": {"repobilityId": "e73870420e464a55", "scanner": "scanner-primary", "fingerprint": "66eb50af0af0000f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6a100b68c4fb34ab", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/tracker/tournaments/page.tsx:176"}, "properties": {"repobilityId": "aa38f43d42ec98ef", "scanner": "scanner-primary", "fingerprint": "6a100b68c4fb34ab", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-170084d8ecc12de9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/tracker/tournaments/[id]/page.tsx:386"}, "properties": {"repobilityId": "c5a5c356338ee36f", "scanner": "scanner-primary", "fingerprint": "170084d8ecc12de9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-daf19e5ea93d5379", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/tournaments/tournaments-client.tsx:198"}, "properties": {"repobilityId": "4a84fd0afeba3c60", "scanner": "scanner-primary", "fingerprint": "daf19e5ea93d5379", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-66e59f12a30c9ff9", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 app/goldfish/state/gameInitializer.ts:108"}, "properties": {"repobilityId": "3e38893866a22e96", "scanner": "scanner-primary", "fingerprint": "66e59f12a30c9ff9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-af39a56857011793", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 app/goldfish/components/GoldfishCanvas.tsx:2166"}, "properties": {"repobilityId": "74ed959cd0e73d72", "scanner": "scanner-primary", "fingerprint": "af39a56857011793", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-02f7e19caab382c0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/spoilers/page.tsx:845"}, "properties": {"repobilityId": "55b5135efaa2d39c", "scanner": "scanner-primary", "fingerprint": "02f7e19caab382c0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-354e9b39e66e8d46", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/cards/page.tsx:154"}, "properties": {"repobilityId": "2dd67d217f345ef5", "scanner": "scanner-primary", "fingerprint": "354e9b39e66e8d46", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d3abceb06fd48580", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/admin/registrations/page.tsx:388"}, "properties": {"repobilityId": "7b6bc50e69aaca6d", "scanner": "scanner-primary", "fingerprint": "d3abceb06fd48580", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a74e344ddfa7ff91", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/decklist/generate/DeckSourcePicker.tsx:322"}, "properties": {"repobilityId": "37270fa0a7501891", "scanner": "scanner-primary", "fingerprint": "a74e344ddfa7ff91", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2df853feeb0d1e84", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/decklist/[deckId]/client.tsx:537"}, "properties": {"repobilityId": "cd691e3e511a5bee", "scanner": "scanner-primary", "fingerprint": "2df853feeb0d1e84", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e0ba54b435fd5dfb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/decklist/my-decks/client.tsx:740"}, "properties": {"repobilityId": "9ae604ff9e9a8d4b", "scanner": "scanner-primary", "fingerprint": "e0ba54b435fd5dfb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-44a3d03f82e075af", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/decklist/my-decks/QuickLookModal.tsx:120"}, "properties": {"repobilityId": "b59c99af5a51626d", "scanner": "scanner-primary", "fingerprint": "44a3d03f82e075af", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d5ad1b5b540a7c11", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/decklist/community/client.tsx:867"}, "properties": {"repobilityId": "a6cb029aab215678", "scanner": "scanner-primary", "fingerprint": "d5ad1b5b540a7c11", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e4f8bd023482a6ed", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/decklist/card-search/ModalWithClose.tsx:805"}, "properties": {"repobilityId": "681a68ee1c6ae716", "scanner": "scanner-primary", "fingerprint": "e4f8bd023482a6ed", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f145c737d6f214a5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/decklist/card-search/client.tsx:2520"}, "properties": {"repobilityId": "b2ac1d361b771838", "scanner": "scanner-primary", "fingerprint": "f145c737d6f214a5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ac0d67448c194e43", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/decklist/card-search/components/DeckBuilderPanel.tsx:945"}, "properties": {"repobilityId": "5db7f2f7edcafe05", "scanner": "scanner-primary", "fingerprint": "ac0d67448c194e43", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6b1322b0f6025248", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/decklist/card-search/components/CollectionCheckModal.tsx:157"}, "properties": {"repobilityId": "76bb47bb5d80ab85", "scanner": "scanner-primary", "fingerprint": "6b1322b0f6025248", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d06aa9a43765d021", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/decklist/card-search/components/FullDeckView.tsx:458"}, "properties": {"repobilityId": "beabcadf7fc275c4", "scanner": "scanner-primary", "fingerprint": "d06aa9a43765d021", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d350a297cc146ee8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/decklist/card-search/components/DeckCardList.tsx:467"}, "properties": {"repobilityId": "a685a4a0630fdad1", "scanner": "scanner-primary", "fingerprint": "d350a297cc146ee8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b2e11baf4d02fc2a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/decklist/card-search/components/ParagonRequirements.tsx:97"}, "properties": {"repobilityId": "457034727c222a94", "scanner": "scanner-primary", "fingerprint": "b2e11baf4d02fc2a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-de79fb5db55934b6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/decklist/card-search/components/BuyDeckModal.tsx:429"}, "properties": {"repobilityId": "9dcc47898328a037", "scanner": "scanner-primary", "fingerprint": "de79fb5db55934b6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8923e3c496f7d8a3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/decklist/card-search/components/LoadDeckModal.tsx:169"}, "properties": {"repobilityId": "fc23f1e76bf74416", "scanner": "scanner-primary", "fingerprint": "8923e3c496f7d8a3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-881741532ae0c155", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/decklist/card-search/random/client.tsx:149"}, "properties": {"repobilityId": "6cd3e6f2eae7c0d0", "scanner": "scanner-primary", "fingerprint": "881741532ae0c155", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-97ef7a79a5b7e45d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/decklist/card-search/hooks/useDeckState.ts:126"}, "properties": {"repobilityId": "5ac25555bb7f2ef3", "scanner": "scanner-primary", "fingerprint": "97ef7a79a5b7e45d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3cf148eb92fce7ff", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/spoilers/spoilers-client.tsx:283"}, "properties": {"repobilityId": "3bb3cb65ac2c4f64", "scanner": "scanner-primary", "fingerprint": "3cf148eb92fce7ff", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c551f80973179383", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/spoilers/[id]/page.tsx:174"}, "properties": {"repobilityId": "07b8083463abeb3c", "scanner": "scanner-primary", "fingerprint": "c551f80973179383", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0eee044312ea0596", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/board/ProjectorBoard.tsx:137"}, "properties": {"repobilityId": "9796bbecbb20194a", "scanner": "scanner-primary", "fingerprint": "0eee044312ea0596", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0b63e1337071b173", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/listings/sync.ts:46"}, "properties": {"repobilityId": "1b1d17e06079b51f", "scanner": "scanner-primary", "fingerprint": "0b63e1337071b173", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ef4dc533f30eb3f4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/pricing/matching.ts:549"}, "properties": {"repobilityId": "8600d08948e7c9b3", "scanner": "scanner-primary", "fingerprint": "ef4dc533f30eb3f4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2192e3bf1ea14a86", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/sync-duplicate-cards.ts:16"}, "properties": {"repobilityId": "36e49013ae1789c9", "scanner": "scanner-primary", "fingerprint": "2192e3bf1ea14a86", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/sync-duplicate-cards.ts"}, "region": {"startLine": 16}}}]}, {"ruleId": "scanner-47d735e4470ed5e6", "level": "note", "message": {"text": "Insecure pattern 'document_write' in utils/printUtils.ts:133"}, "properties": {"repobilityId": "be39644e112345a3", "scanner": "scanner-primary", "fingerprint": "47d735e4470ed5e6", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "utils/printUtils.ts"}, "region": {"startLine": 133}}}]}, {"ruleId": "scanner-f21c20ddb26092d6", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/threshingfloor/outline.html:1899"}, "properties": {"repobilityId": "82a51db315e53f59", "scanner": "scanner-primary", "fingerprint": "f21c20ddb26092d6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/threshingfloor/outline.html"}, "region": {"startLine": 1899}}}]}, {"ruleId": "scanner-97321257bc0b701f", "level": "warning", "message": {"text": "Insecure pattern 'insert_adjacent_html' in app/threshingfloor/outline.html:1892"}, "properties": {"repobilityId": "a43ae67cc9b05bcc", "scanner": "scanner-primary", "fingerprint": "97321257bc0b701f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "insert_adjacent_html"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/threshingfloor/outline.html"}, "region": {"startLine": 1892}}}]}, {"ruleId": "scanner-7b09d2a2fbc63f75", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in lib/api/cors.ts:4"}, "properties": {"repobilityId": "a3a03b647acdade3", "scanner": "scanner-primary", "fingerprint": "7b09d2a2fbc63f75", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/api/cors.ts"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-c234b0099c373393", "level": "error", "message": {"text": "Possible secret in e2e/spectatorSeed.ts"}, "properties": {"repobilityId": "c9d37210cf0eb0b0", "scanner": "scanner-primary", "fingerprint": "c234b0099c373393", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "e2e/spectatorSeed.ts"}, "region": {"startLine": 33}}}]}, {"ruleId": "scanner-dfa6a4c0e7386f85", "level": "error", "message": {"text": "Possible secret in e2e/seed.ts"}, "properties": {"repobilityId": "30991bf750b8a3dd", "scanner": "scanner-primary", "fingerprint": "dfa6a4c0e7386f85", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "e2e/seed.ts"}, "region": {"startLine": 23}}}]}, {"ruleId": "scanner-b3b331bf67701755", "level": "error", "message": {"text": "Possible secret in e2e/repair/non-host-view.spec.ts"}, "properties": {"repobilityId": "beaa0e60192ba3f7", "scanner": "scanner-primary", "fingerprint": "b3b331bf67701755", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "e2e/repair/non-host-view.spec.ts"}, "region": {"startLine": 9}}}]}, {"ruleId": "scanner-037ff498dcf79082", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "640f753e5976f773", "scanner": "scanner-primary", "fingerprint": "037ff498dcf79082", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-spacetimedb.yml"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-3beb716b02c53f57", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "aa96d8f09a254563", "scanner": "scanner-primary", "fingerprint": "3beb716b02c53f57", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-spacetimedb.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-95b7a55dac779be2", "level": "note", "message": {"text": "Very large file: spacetimedb/src/index.ts (6996 lines)"}, "properties": {"repobilityId": "183190efefb2bd69", "scanner": "scanner-primary", "fingerprint": "95b7a55dac779be2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-5d37c713fc737a77", "level": "note", "message": {"text": "Very large file: utils/deckcheck/rules.ts (1638 lines)"}, "properties": {"repobilityId": "7444cbda3bdea4a5", "scanner": "scanner-primary", "fingerprint": "5d37c713fc737a77", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3c76384f475b7d13", "level": "note", "message": {"text": "Very large file: utils/deckcheck/__tests__/rules-t2.test.ts (1795 lines)"}, "properties": {"repobilityId": "6dfb0490d94e04c8", "scanner": "scanner-primary", "fingerprint": "3c76384f475b7d13", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-462220cc1a14aac1", "level": "note", "message": {"text": "Very large file: utils/deckcheck/__tests__/rules.test.ts (2408 lines)"}, "properties": {"repobilityId": "81429e830a93c1c0", "scanner": "scanner-primary", "fingerprint": "462220cc1a14aac1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-19fc4d9acc035758", "level": "note", "message": {"text": "Very large file: components/ui/TournamentRounds.tsx (1607 lines)"}, "properties": {"repobilityId": "f9ae5a10affda1a7", "scanner": "scanner-primary", "fingerprint": "19fc4d9acc035758", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-bfecc28fdde928e2", "level": "note", "message": {"text": "Very large file: app/play/components/MultiplayerCanvas.tsx (7550 lines)"}, "properties": {"repobilityId": "f580360f75cd6684", "scanner": "scanner-primary", "fingerprint": "bfecc28fdde928e2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-bb9a096f79269c51", "level": "note", "message": {"text": "Very large file: app/play/components/ChatPanel.tsx (2241 lines)"}, "properties": {"repobilityId": "f63532a505e80e86", "scanner": "scanner-primary", "fingerprint": "bb9a096f79269c51", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-16bf90db9f56d16c", "level": "note", "message": {"text": "Very large file: app/play/[code]/client.tsx (1693 lines)"}, "properties": {"repobilityId": "608b2d6c610aaecc", "scanner": "scanner-primary", "fingerprint": "16bf90db9f56d16c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1ab88009b5b0d6a5", "level": "note", "message": {"text": "Very large file: app/goldfish/state/gameReducer.ts (1564 lines)"}, "properties": {"repobilityId": "e4b102345bfb148f", "scanner": "scanner-primary", "fingerprint": "1ab88009b5b0d6a5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a1e83832cd6ffab0", "level": "note", "message": {"text": "Very large file: app/goldfish/components/GoldfishCanvas.tsx (3022 lines)"}, "properties": {"repobilityId": "5888469d5633b0f6", "scanner": "scanner-primary", "fingerprint": "a1e83832cd6ffab0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d8826d1b9202b6ee", "level": "note", "message": {"text": "Very large file: app/admin/registrations/page.tsx (1700 lines)"}, "properties": {"repobilityId": "05270c4cdb85b930", "scanner": "scanner-primary", "fingerprint": "d8826d1b9202b6ee", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-0a610d58ac5e49d3", "level": "note", "message": {"text": "Very large file: app/decklist/actions.ts (1826 lines)"}, "properties": {"repobilityId": "6463963afee30802", "scanner": "scanner-primary", "fingerprint": "0a610d58ac5e49d3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-5c2f813e6ba588ec", "level": "note", "message": {"text": "Very large file: app/decklist/[deckId]/client.tsx (1892 lines)"}, "properties": {"repobilityId": "70cd4f9bb1edd394", "scanner": "scanner-primary", "fingerprint": "5c2f813e6ba588ec", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-12f3193cc44ef721", "level": "note", "message": {"text": "Very large file: app/decklist/my-decks/client.tsx (2177 lines)"}, "properties": {"repobilityId": "15715a6e776bc6b9", "scanner": "scanner-primary", "fingerprint": "12f3193cc44ef721", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1b2134588e6a7d6f", "level": "note", "message": {"text": "Very large file: app/decklist/card-search/ModalWithClose.tsx (1661 lines)"}, "properties": {"repobilityId": "5ff95f4284678f65", "scanner": "scanner-primary", "fingerprint": "1b2134588e6a7d6f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-496b47636eaf530d", "level": "note", "message": {"text": "Very large file: app/decklist/card-search/client.tsx (3194 lines)"}, "properties": {"repobilityId": "f0c1ef557473d579", "scanner": "scanner-primary", "fingerprint": "496b47636eaf530d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-8330295d951ff423", "level": "note", "message": {"text": "Very large file: app/decklist/card-search/components/DeckBuilderPanel.tsx (3752 lines)"}, "properties": {"repobilityId": "3d43835f77f4730e", "scanner": "scanner-primary", "fingerprint": "8330295d951ff423", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ea3b5e389d8c9c0f", "level": "note", "message": {"text": "Low test-to-source ratio"}, "properties": {"repobilityId": "ef7b2552cc00a375", "scanner": "scanner-primary", "fingerprint": "ea3b5e389d8c9c0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["tests"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "2e6c946a6ccbf344", "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": "a8249db93a9f08c6", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-9d79c4077342a7d0", "level": "warning", "message": {"text": "Runtime service client appears to use placeholder configuration"}, "properties": {"repobilityId": "9e2fa572559094e5", "scanner": "scanner-primary", "fingerprint": "9d79c4077342a7d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "runtime-config", "service-client", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "6b33408ad1dc0abd", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "b591c45cd585c85b", "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": "b9ccd0069fbd28dd", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-dbe34e3c578eb187", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/inspect-firefox-profile/SKILL.md"}, "properties": {"repobilityId": "f48a15c0ac0da1e9", "scanner": "scanner-primary", "fingerprint": "dbe34e3c578eb187", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/inspect-firefox-profile/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-64824c71c8c531b8", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/price-stats/SKILL.md"}, "properties": {"repobilityId": "b0ee94d101343b9e", "scanner": "scanner-primary", "fingerprint": "64824c71c8c531b8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/price-stats/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-05a967f108ac02d9", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/check-price/SKILL.md"}, "properties": {"repobilityId": "39d6e8bcce5b8441", "scanner": "scanner-primary", "fingerprint": "05a967f108ac02d9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/check-price/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-23cd93fbe3b1b59f", "level": "none", "message": {"text": "Commented-code block (6 lines) in spacetimedb/src/schema.ts:145"}, "properties": {"repobilityId": "90bb3e17044cf0b6", "scanner": "scanner-primary", "fingerprint": "23cd93fbe3b1b59f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-88a0b91ec5dab8ac", "level": "none", "message": {"text": "Commented-code block (6 lines) in spacetimedb/src/index.ts:54"}, "properties": {"repobilityId": "3771e65874a5f1a5", "scanner": "scanner-primary", "fingerprint": "88a0b91ec5dab8ac", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-81bf8e923de8e6eb", "level": "none", "message": {"text": "Commented-code block (7 lines) in spacetimedb/src/cardAbilities.ts:1"}, "properties": {"repobilityId": "4d8c6bce27d610bc", "scanner": "scanner-primary", "fingerprint": "81bf8e923de8e6eb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6bb9a7d9d238811e", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/sync-duplicate-cards.ts:68"}, "properties": {"repobilityId": "785e3fc874db167d", "scanner": "scanner-primary", "fingerprint": "6bb9a7d9d238811e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8ab9321e4518e29a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-prices-api.ts:58"}, "properties": {"repobilityId": "cc586851d472331d", "scanner": "scanner-primary", "fingerprint": "8ab9321e4518e29a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-dae663d9c1aeadcf", "level": "none", "message": {"text": "Commented-code block (5 lines) in utils/supabase/getUserSafe.ts:3"}, "properties": {"repobilityId": "85ba4f34fd1910f4", "scanner": "scanner-primary", "fingerprint": "dae663d9c1aeadcf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b47eec92da0893f9", "level": "none", "message": {"text": "Commented-code block (5 lines) in utils/supabase/middleware.ts:58"}, "properties": {"repobilityId": "f5f19f1765e5a8a5", "scanner": "scanner-primary", "fingerprint": "b47eec92da0893f9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-90993b598475dfef", "level": "none", "message": {"text": "Commented-code block (7 lines) in utils/deckcheck/rules.ts:257"}, "properties": {"repobilityId": "8797c75c9b9c7dc4", "scanner": "scanner-primary", "fingerprint": "90993b598475dfef", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-551feed25f0461ea", "level": "none", "message": {"text": "Commented-code block (7 lines) in utils/deckcheck/index.ts:156"}, "properties": {"repobilityId": "3709b18c287b83f8", "scanner": "scanner-primary", "fingerprint": "551feed25f0461ea", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9769b67f6d244ab3", "level": "none", "message": {"text": "Commented-code block (35 lines) in utils/deckcheck/__tests__/rules-t2.test.ts:548"}, "properties": {"repobilityId": "2bd9c816f70bb09a", "scanner": "scanner-primary", "fingerprint": "9769b67f6d244ab3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-887864e2e43505b9", "level": "none", "message": {"text": "Commented-code block (6 lines) in utils/deckcheck/__tests__/rules.test.ts:2198"}, "properties": {"repobilityId": "f97a04c471a41bd1", "scanner": "scanner-primary", "fingerprint": "887864e2e43505b9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0aa70f011d230b36", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/ui/AuditLogPanel.tsx:54"}, "properties": {"repobilityId": "51a026816f58f252", "scanner": "scanner-primary", "fingerprint": "0aa70f011d230b36", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6079d3fed4236e09", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/ui/RepairTournamentBanner.tsx:37"}, "properties": {"repobilityId": "778b99c9ac74686b", "scanner": "scanner-primary", "fingerprint": "6079d3fed4236e09", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c23411cbad510d72", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/ui/StandingsTable.tsx:163"}, "properties": {"repobilityId": "2471a8d0e2530f2a", "scanner": "scanner-primary", "fingerprint": "c23411cbad510d72", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4205b7926d78df81", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/ui/TournamentRounds.tsx:149"}, "properties": {"repobilityId": "8e4f19f86fcc5996", "scanner": "scanner-primary", "fingerprint": "4205b7926d78df81", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7f1226fcd87e0ee7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/ui/TournamentRounds.tsx:273"}, "properties": {"repobilityId": "7b25e3663ae21998", "scanner": "scanner-primary", "fingerprint": "7f1226fcd87e0ee7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a1c0175542617377", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/ui/__tests__/standingsTable.test.ts:76"}, "properties": {"repobilityId": "c337d1756f45b259", "scanner": "scanner-primary", "fingerprint": "a1c0175542617377", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-88773fbd98207cc5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/rulings/page.tsx:367"}, "properties": {"repobilityId": "e583ebd023368671", "scanner": "scanner-primary", "fingerprint": "88773fbd98207cc5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bae92534b347fafc", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/collection/hooks/useCollectionState.ts:60"}, "properties": {"repobilityId": "3108b2b0cd10dbaf", "scanner": "scanner-primary", "fingerprint": "bae92534b347fafc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-79abccf1e3fcc119", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/threshingfloor/api/store/[key]/route.ts:21"}, "properties": {"repobilityId": "518bc375d801865b", "scanner": "scanner-primary", "fingerprint": "79abccf1e3fcc119", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2227173932a32b73", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/play/layout/multiplayerLayout.ts:496"}, "properties": {"repobilityId": "2218229fa952d2e6", "scanner": "scanner-primary", "fingerprint": "2227173932a32b73", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0bf09ed1bb4bed98", "level": "none", "message": {"text": "Commented-code block (8 lines) in app/play/components/SpacetimeConnectionResetWrapper.tsx:26"}, "properties": {"repobilityId": "b12414cdaf8311e2", "scanner": "scanner-primary", "fingerprint": "0bf09ed1bb4bed98", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2bf833275eea3ab6", "level": "none", "message": {"text": "Commented-code block (7 lines) in app/play/components/MultiplayerCanvas.tsx:329"}, "properties": {"repobilityId": "654b52c8152e9ad8", "scanner": "scanner-primary", "fingerprint": "2bf833275eea3ab6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4fb575882dea66fb", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/play/components/PregameScreen.tsx:689"}, "properties": {"repobilityId": "b33505a2a9c6f81a", "scanner": "scanner-primary", "fingerprint": "4fb575882dea66fb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-44c44d17606eabd1", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/play/components/TurnIndicator.tsx:8"}, "properties": {"repobilityId": "d99a6f2a73416acc", "scanner": "scanner-primary", "fingerprint": "44c44d17606eabd1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8d746094784016c7", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/play/components/LobbyList.tsx:30"}, "properties": {"repobilityId": "db5bed4d1a998a64", "scanner": "scanner-primary", "fingerprint": "8d746094784016c7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-96588f1bb6a16370", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/play/components/__tests__/isHandCardFaceVisible.test.ts:3"}, "properties": {"repobilityId": "38c7630bf17cd29c", "scanner": "scanner-primary", "fingerprint": "96588f1bb6a16370", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ce188d18a8512b0f", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/play/lib/__tests__/gameEntryDecision.test.ts:4"}, "properties": {"repobilityId": "4e4ead54322b5fc7", "scanner": "scanner-primary", "fingerprint": "ce188d18a8512b0f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1f347bf7438eb9e7", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/play/[code]/client.tsx:158"}, "properties": {"repobilityId": "ac10b348170ce53f", "scanner": "scanner-primary", "fingerprint": "1f347bf7438eb9e7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d71fce2780b1d948", "level": "none", "message": {"text": "Commented-code block (9 lines) in app/play/hooks/useSpacetimeConnection.ts:34"}, "properties": {"repobilityId": "0a79debef57113cb", "scanner": "scanner-primary", "fingerprint": "d71fce2780b1d948", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b8b24f62cd1b634b", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/play/hooks/undoStackCore.ts:4"}, "properties": {"repobilityId": "d5c3606bbbd927da", "scanner": "scanner-primary", "fingerprint": "b8b24f62cd1b634b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f281f5f25ca23588", "level": "none", "message": {"text": "Commented-code block (8 lines) in app/play/hooks/useGameState.ts:174"}, "properties": {"repobilityId": "8a18e7f0ab85c6b7", "scanner": "scanner-primary", "fingerprint": "f281f5f25ca23588", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-39f7725685bcea83", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/play/spectate/[code]/client.tsx:95"}, "properties": {"repobilityId": "d3b2351cb3d92b39", "scanner": "scanner-primary", "fingerprint": "39f7725685bcea83", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c771f0f5ce879303", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/tracker/reset-password/session-handler.tsx:6"}, "properties": {"repobilityId": "747b02d56bb449b7", "scanner": "scanner-primary", "fingerprint": "c771f0f5ce879303", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d7de607c63f7b37b", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/tracker/tournaments/__tests__/repair-actions.test.ts:326"}, "properties": {"repobilityId": "cac7d892ce004c0d", "scanner": "scanner-primary", "fingerprint": "d7de607c63f7b37b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b5ed4ae36be9bd4b", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/tracker/tournaments/[id]/page.tsx:337"}, "properties": {"repobilityId": "6591ab701e8bc3c4", "scanner": "scanner-primary", "fingerprint": "b5ed4ae36be9bd4b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4e52a9a4688dc995", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/tracker/tournaments/[id]/page.tsx:938"}, "properties": {"repobilityId": "8f15005dc0eae9db", "scanner": "scanner-primary", "fingerprint": "4e52a9a4688dc995", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b77671dc42e3036c", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/shared/types/gameActions.ts:93"}, "properties": {"repobilityId": "3c5e344762ced5f1", "scanner": "scanner-primary", "fingerprint": "b77671dc42e3036c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2d97ada623adae71", "level": "none", "message": {"text": "Commented-code block (8 lines) in app/shared/components/DeckSearchModal.tsx:240"}, "properties": {"repobilityId": "f89d308890ef4672", "scanner": "scanner-primary", "fingerprint": "2d97ada623adae71", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-876427774ddabaf0", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/shared/components/DeckExchangeModal.tsx:187"}, "properties": {"repobilityId": "7a89f1f6644c7c7f", "scanner": "scanner-primary", "fingerprint": "876427774ddabaf0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-406c7517eaf59c98", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/shared/components/CardChoicePrompt.tsx:44"}, "properties": {"repobilityId": "465be7d78620e515", "scanner": "scanner-primary", "fingerprint": "406c7517eaf59c98", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2de5b4933874940c", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/shared/components/GameCardNode.tsx:204"}, "properties": {"repobilityId": "13482b71bad12392", "scanner": "scanner-primary", "fingerprint": "2de5b4933874940c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a2a01c44829b8155", "level": "none", "message": {"text": "Commented-code block (7 lines) in app/shared/components/toastKeyboardNav.ts:8"}, "properties": {"repobilityId": "9df32d9e14944677", "scanner": "scanner-primary", "fingerprint": "a2a01c44829b8155", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d04203a0129a2ed8", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/shared/components/CardContextMenu.tsx:169"}, "properties": {"repobilityId": "9df025943f7f3e1c", "scanner": "scanner-primary", "fingerprint": "d04203a0129a2ed8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-423e0b93d9965c5f", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/shared/hooks/useModalCardDrag.ts:182"}, "properties": {"repobilityId": "0a4834ce247ee311", "scanner": "scanner-primary", "fingerprint": "423e0b93d9965c5f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-35c82a00f20b740c", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/goldfish/state/gameReducer.ts:659"}, "properties": {"repobilityId": "cc1af4ab100e5afd", "scanner": "scanner-primary", "fingerprint": "35c82a00f20b740c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-542338cbccf07155", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/goldfish/components/GoldfishCanvas.tsx:86"}, "properties": {"repobilityId": "5d4725c3217fa382", "scanner": "scanner-primary", "fingerprint": "542338cbccf07155", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0751083953f999a9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/spoilers/page.tsx:478"}, "properties": {"repobilityId": "2ffa7ed80c85563a", "scanner": "scanner-primary", "fingerprint": "0751083953f999a9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d5574637642051a3", "level": "none", "message": {"text": "Commented-code block (8 lines) in app/admin/cards/actions.ts:704"}, "properties": {"repobilityId": "516dd017d2380112", "scanner": "scanner-primary", "fingerprint": "d5574637642051a3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9d43d4d9ba6be8e3", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/decklist/card-search/client.tsx:2286"}, "properties": {"repobilityId": "1ee4402f801baf08", "scanner": "scanner-primary", "fingerprint": "9d43d4d9ba6be8e3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d8ee2959cb980a3d", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/decklist/card-search/utils/deckImportExport.ts:160"}, "properties": {"repobilityId": "555a11f0315daad1", "scanner": "scanner-primary", "fingerprint": "d8ee2959cb980a3d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8e8ddd2ceceb4d0b", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/decklist/card-search/components/DeckBuilderPanel.tsx:341"}, "properties": {"repobilityId": "99a184be003ada65", "scanner": "scanner-primary", "fingerprint": "8e8ddd2ceceb4d0b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fe1135d19fcc6b4a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/decklist/card-search/components/GenerateDeckImageModal.tsx:72"}, "properties": {"repobilityId": "6a8f35a476ccd5eb", "scanner": "scanner-primary", "fingerprint": "fe1135d19fcc6b4a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cf651f08d48b06d9", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/decklist/card-search/components/DeckCardList.tsx:121"}, "properties": {"repobilityId": "0fb1d4a22af6867b", "scanner": "scanner-primary", "fingerprint": "cf651f08d48b06d9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b4ad1f773ae042cb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/decklist/card-search/components/GeneratePDFModal.tsx:83"}, "properties": {"repobilityId": "c7eb0b0311f28438", "scanner": "scanner-primary", "fingerprint": "b4ad1f773ae042cb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-65e6522e4f77a0dc", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/decklist/card-search/hooks/useCardImageUrl.ts:6"}, "properties": {"repobilityId": "3bd8d89a424306c0", "scanner": "scanner-primary", "fingerprint": "65e6522e4f77a0dc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4cf68d5780f7f0bd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/rulings/discord-sync.ts:55"}, "properties": {"repobilityId": "20894077715d23f6", "scanner": "scanner-primary", "fingerprint": "4cf68d5780f7f0bd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-34c18adb23c44998", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/listings/fetch.ts:8"}, "properties": {"repobilityId": "fe4f95a92215738f", "scanner": "scanner-primary", "fingerprint": "34c18adb23c44998", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ab136f744a6bf686", "level": "none", "message": {"text": "Commented-code block (6 lines) in lib/cards/cardAbilities.ts:43"}, "properties": {"repobilityId": "c778810dcd35f1f1", "scanner": "scanner-primary", "fingerprint": "ab136f744a6bf686", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0984207afc765d6f", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/tournament/pairing.ts:320"}, "properties": {"repobilityId": "2b7141792ec6f8af", "scanner": "scanner-primary", "fingerprint": "0984207afc765d6f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0bd9ce07b18876f6", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/tournament/snapshotRewrite.ts:1"}, "properties": {"repobilityId": "12627c5959801e28", "scanner": "scanner-primary", "fingerprint": "0bd9ce07b18876f6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b42304ae48518a47", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/tournament/standingsScoring.ts:3"}, "properties": {"repobilityId": "12ff1de1ce2d1515", "scanner": "scanner-primary", "fingerprint": "b42304ae48518a47", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bc288f5d6c3f4eb0", "level": "none", "message": {"text": "Commented-code block (8 lines) in lib/tournament/standings.ts:3"}, "properties": {"repobilityId": "f22929e8cd273476", "scanner": "scanner-primary", "fingerprint": "bc288f5d6c3f4eb0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1be741daf6b2ffd8", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/tournament/types.ts:3"}, "properties": {"repobilityId": "a7aa9f3d11ec565c", "scanner": "scanner-primary", "fingerprint": "1be741daf6b2ffd8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3e72ddeed088ec1b", "level": "none", "message": {"text": "Commented-code block (7 lines) in lib/tournament/__tests__/standings.test.ts:42"}, "properties": {"repobilityId": "bdf3fc8e580ec3c1", "scanner": "scanner-primary", "fingerprint": "3e72ddeed088ec1b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ecabca7d3c18c87d", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/tournament/__tests__/simulator-scenarios.test.ts:399"}, "properties": {"repobilityId": "9987a0e9db652006", "scanner": "scanner-primary", "fingerprint": "ecabca7d3c18c87d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-10f9196ec6ce0bd9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/pricing/shopify.ts:19"}, "properties": {"repobilityId": "c20f924787000795", "scanner": "scanner-primary", "fingerprint": "10f9196ec6ce0bd9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-96cd82db533a04df", "level": "none", "message": {"text": "Commented-code block (8 lines) in .claude/skills/improve-area/pipeline.workflow.js:14"}, "properties": {"repobilityId": "88d02e06dadc820d", "scanner": "scanner-primary", "fingerprint": "96cd82db533a04df", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-45aee49f0b4c21cc", "level": "none", "message": {"text": "Commented-code block (5 lines) in e2e/repair/golden-path.spec.ts:15"}, "properties": {"repobilityId": "c9f9d474180f3c84", "scanner": "scanner-primary", "fingerprint": "45aee49f0b4c21cc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-55ec6baba7141327", "level": "none", "message": {"text": "Commented-code block (8 lines) in e2e/spectator/lobby-lifecycle.spec.ts:9"}, "properties": {"repobilityId": "7b46af83134c66da", "scanner": "scanner-primary", "fingerprint": "55ec6baba7141327", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3a263a3323158f5e", "level": "none", "message": {"text": "Commented-code block (6 lines) in e2e/spectator/board.spec.ts:22"}, "properties": {"repobilityId": "8f83e73e92261961", "scanner": "scanner-primary", "fingerprint": "3a263a3323158f5e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5fa1b867d6e46f9f", "level": "none", "message": {"text": "Commented-code block (5 lines) in e2e/spectator/spectator.spec.ts:9"}, "properties": {"repobilityId": "670816dbeecc0786", "scanner": "scanner-primary", "fingerprint": "5fa1b867d6e46f9f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d785c17821858dcb", "level": "note", "message": {"text": "22 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "f5222babac44ad42", "scanner": "scanner-primary", "fingerprint": "d785c17821858dcb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "1135b6b70e65cc68", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}]}]}