{"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-971d0f69f79c5da8", "name": "TODO/FIXME marker in shipping code \u2014 scripts/generate-card-hashes.js:15", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 scripts/generate-card-hashes.js:15"}, "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-2b3d8f2780f2ce9f", "name": "Stray `console.log` in TS/JS \u2014 scripts/generate-card-hashes.js:137", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generate-card-hashes.js:137"}, "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-c065ada0fe1c3acb", "name": "Stray `console.log` in TS/JS \u2014 scripts/patch-camera-preview.js:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/patch-camera-preview.js:22"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9e4a9773ae0e50d9", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/UI.jsx:251", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/UI.jsx:251"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f1eb06f1aaa267c9", "name": "Stray `console.log` in TS/JS \u2014 src/lib/scryfall.js:171", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/scryfall.js:171"}, "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-1760ea4922abb046", "name": "Stray `console.log` in TS/JS \u2014 src/lib/fx.js:40", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/fx.js:40"}, "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-a2ea4c97c21d52a4", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/lib/miniMarkdown.jsx:2", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/lib/miniMarkdown.jsx:2"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-12befe4f6fc5908a", "name": "Icon-only button without accessible name \u2014 src/pages/Trading.jsx:270", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/pages/Trading.jsx:270"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c8c6b5863445e14", "name": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 src/pages/Admin.jsx:385", "shortDescription": {"text": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 src/pages/Admin.jsx:385"}, "fullDescription": {"text": "React Flow edge labels render with a white rectangle behind the text by default, which scatters bright boxes across a dark canvas. Either drop the label, or override `.react-flow__edge-textbg` and `.react-flow__edge-text` in your stylesheet.\n\nWhy: P-H in CHECKLIST.md \u2014 vendor edge labels bleed white through a dark canvas.\nRule id: fq.edge-label.no-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-dacd450afcaa8a57", "name": "Stray `console.log` in TS/JS \u2014 src/pages/Collection.jsx:467", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/pages/Collection.jsx:467"}, "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-035396b6149140f3", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/pages/Home.jsx:1456", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/pages/Home.jsx:1456"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ff8dbe6434f0c23c", "name": "Insecure pattern 'cors_wildcard' in CLAUDE.md:280", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in CLAUDE.md:280"}, "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-16a7365071d024dc", "name": "Insecure pattern 'cors_wildcard' in cloudflare/og-worker/worker.js:32", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in cloudflare/og-worker/worker.js:32"}, "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-ff5a407a934f81c7", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/admin-dashboard-summary/index.ts:4", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/admin-dashboard-summary/index.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-094d347ea310c607", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/stripe-create-checkout/index.ts:4", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/stripe-create-checkout/index.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-bb5d8f8ed4f9c49e", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/admin-users-directory/index.ts:4", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/admin-users-directory/index.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-ee9b3d34c2147162", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/combo-proxy/index.ts:2", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/combo-proxy/index.ts:2"}, "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-f986897acf035ba9", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/admin-delete-account/index.ts:4", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/admin-delete-account/index.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-f87ba6b51e5d6d0c", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/admin-update-user-settings/index.ts:4", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/admin-update-user-settings/index.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-c08c4bfc8b043821", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/UI.jsx:251", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/UI.jsx:251"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c7caa074adb05054", "name": "Insecure pattern 'exec_used' in src/pages/Admin.jsx:412", "shortDescription": {"text": "Insecure pattern 'exec_used' in src/pages/Admin.jsx:412"}, "fullDescription": {"text": "Found a known-risky pattern (exec_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-631cc0ced81ba795", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/pages/Admin.jsx:396", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/pages/Admin.jsx:396"}, "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-560c9c9e269ebe79", "name": "Insecure pattern 'dangerous_innerhtml' in src/pages/Home.jsx:1456", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/pages/Home.jsx:1456"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a638e7143eec12d2", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-28c4a04bd807da0c", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ad6701f0a8405e22", "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-5461b56675483314", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9ea5635930915347", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cb639d9a10a47b23", "name": "package.json defines install-time lifecycle scripts", "shortDescription": {"text": "package.json defines install-time lifecycle scripts"}, "fullDescription": {"text": "preinstall/install/postinstall/prepare scripts execute during dependency installation. Review them carefully for network calls, obfuscation, shell execution, or credential access."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a61391356cdb4fe0", "name": "Very large file: src/components/DeckStats.jsx (1168 lines)", "shortDescription": {"text": "Very large file: src/components/DeckStats.jsx (1168 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-12aa5bb21c33b6e1", "name": "Very large file: src/components/ImportModal.jsx (1181 lines)", "shortDescription": {"text": "Very large file: src/components/ImportModal.jsx (1181 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-830d21ee49757889", "name": "Very large file: src/components/CardBrowserViews.jsx (1192 lines)", "shortDescription": {"text": "Very large file: src/components/CardBrowserViews.jsx (1192 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-891da34cbd42cd3d", "name": "Very large file: src/components/CardComponents.jsx (1858 lines)", "shortDescription": {"text": "Very large file: src/components/CardComponents.jsx (1858 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-d35833b037b8390a", "name": "Very large file: src/pages/Settings.jsx (1357 lines)", "shortDescription": {"text": "Very large file: src/pages/Settings.jsx (1357 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-14119aded5000140", "name": "Very large file: src/pages/LifeTracker.jsx (2564 lines)", "shortDescription": {"text": "Very large file: src/pages/LifeTracker.jsx (2564 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-88fe7f929e1d77d5", "name": "Very large file: src/pages/DeckBrowser.jsx (1372 lines)", "shortDescription": {"text": "Very large file: src/pages/DeckBrowser.jsx (1372 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-428f4c6fe3c4494a", "name": "Very large file: src/pages/Trading.jsx (1428 lines)", "shortDescription": {"text": "Very large file: src/pages/Trading.jsx (1428 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-cf5dd37a74f5a18a", "name": "Very large file: src/pages/Lists.jsx (1486 lines)", "shortDescription": {"text": "Very large file: src/pages/Lists.jsx (1486 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-6cdecfb67ac67f8a", "name": "Very large file: src/pages/Admin.jsx (1766 lines)", "shortDescription": {"text": "Very large file: src/pages/Admin.jsx (1766 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-4e29b5383cd2a44b", "name": "Very large file: src/pages/Folders.jsx (2187 lines)", "shortDescription": {"text": "Very large file: src/pages/Folders.jsx (2187 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ce7e8baf9b7736cd", "name": "Very large file: src/pages/DeckBuilder.jsx (5560 lines)", "shortDescription": {"text": "Very large file: src/pages/DeckBuilder.jsx (5560 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-41eefe3fcb40f3ee", "name": "Very large file: src/pages/Profile.jsx (1287 lines)", "shortDescription": {"text": "Very large file: src/pages/Profile.jsx (1287 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-0b3cb3b3f06edc1e", "name": "Very large file: src/pages/Collection.jsx (1728 lines)", "shortDescription": {"text": "Very large file: src/pages/Collection.jsx (1728 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-80de3e6bea2b05b6", "name": "Very large file: src/pages/Home.jsx (1632 lines)", "shortDescription": {"text": "Very large file: src/pages/Home.jsx (1632 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-cdd61dd01fb37e6a", "name": "Very large file: src/pages/Stats.jsx (1853 lines)", "shortDescription": {"text": "Very large file: src/pages/Stats.jsx (1853 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-87eae09d9f2a9274", "name": "Very large file: src/scanner/CardScanner.jsx (2313 lines)", "shortDescription": {"text": "Very large file: src/scanner/CardScanner.jsx (2313 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea3b5e389d8c9c0f", "name": "Low test-to-source ratio", "shortDescription": {"text": "Low test-to-source ratio"}, "fullDescription": {"text": "34 tests / 170 src (ratio 0.20)."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 54 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 119 placeholder/mock markers across 35 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-17d866d91a7c451e", "name": "Agent instruction/config may expose a secret: CLAUDE.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: CLAUDE.md"}, "fullDescription": {"text": "Agent-facing files are routinely pasted into LLM/tool contexts. Move literal tokens, keys, and passwords into a secret manager or document them as placeholders only."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-cbb5857940ba0dc2", "name": "Agent instruction/config may expose a secret: AGENTS.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: AGENTS.md"}, "fullDescription": {"text": "Agent-facing files are routinely pasted into LLM/tool contexts. Move literal tokens, keys, and passwords into a secret manager or document them as placeholders only."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-718c8e93a50ab259", "name": "Legacy-named symbol `buildLegacy` in scripts/generate-android-icons.mjs:21", "shortDescription": {"text": "Legacy-named symbol `buildLegacy` in scripts/generate-android-icons.mjs:21"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ec18ce2a742f3474", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/backfill-card-prints.mjs:73", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/backfill-card-prints.mjs:73"}, "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-9a436aa5d13b2639", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/cache-set-icons.mjs:14", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/cache-set-icons.mjs:14"}, "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-15b466535fd0af4a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/sync-card-prices.mjs:78", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/sync-card-prices.mjs:78"}, "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-252e4a15ec7eb493", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/generate-card-hashes.js:96", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/generate-card-hashes.js:96"}, "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-c82c4ed7b856abdf", "name": "`fetch()` without try/.catch or AbortSignal \u2014 cloudflare/og-worker/worker.js:35", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 cloudflare/og-worker/worker.js:35"}, "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-8a21541fa969e67d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/stripe-create-checkout/index.ts:37", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/stripe-create-checkout/index.ts: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-66ab38f3f1aa566e", "name": "Commented-code block (8 lines) in src/components/ExportModal.jsx:6", "shortDescription": {"text": "Commented-code block (8 lines) in src/components/ExportModal.jsx: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-4681728d7df0bca5", "name": "Commented-code block (5 lines) in src/components/AddCardModal.jsx:489", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/AddCardModal.jsx:489"}, "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-63ebe1e5e2a90e1c", "name": "Legacy-named symbol `arcanevault_browser_table_columns_v1` in src/components/CardBrowserViews.jsx:373", "shortDescription": {"text": "Legacy-named symbol `arcanevault_browser_table_columns_v1` in src/components/CardBrowserViews.jsx:373"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-53bf0512109555c5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/CardComponents.jsx:455", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/CardComponents.jsx:455"}, "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-bfd3d69da354919d", "name": "Commented-code block (5 lines) in src/components/deckBuilder/BuildAssistant.jsx:36", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/deckBuilder/BuildAssistant.jsx:36"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d9f96c06441a108a", "name": "Commented-code block (6 lines) in src/components/deckBuilder/GuidedCommanderPicker.jsx:32", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/deckBuilder/GuidedCommanderPicker.jsx:32"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-13c1dee1c8f28ead", "name": "Legacy-named symbol `dl_set_releases_v1` in src/lib/deckBuilderApi.js:251", "shortDescription": {"text": "Legacy-named symbol `dl_set_releases_v1` in src/lib/deckBuilderApi.js:251"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bd00f174890825af", "name": "Commented-code block (7 lines) in src/lib/deckBuilderApi.js:241", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/deckBuilderApi.js:241"}, "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-44b14fcc29122466", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/deckBuilderApi.js:572", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/deckBuilderApi.js:572"}, "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-f119be361d34b1b9", "name": "Commented-code block (12 lines) in src/lib/filterCore.js:72", "shortDescription": {"text": "Commented-code block (12 lines) in src/lib/filterCore.js:72"}, "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-f88b96c6883e5a71", "name": "Commented-code block (5 lines) in src/lib/buyLinks.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/buyLinks.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f03f2e09d2846318", "name": "Commented-code block (7 lines) in src/lib/wishlistSync.js:3", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/wishlistSync.js: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-d291e9a9527016e7", "name": "Legacy-named symbol `arcanevault_game_changers_v1` in src/lib/commanderBracket.js:22", "shortDescription": {"text": "Legacy-named symbol `arcanevault_game_changers_v1` in src/lib/commanderBracket.js:22"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aaaa0351d8044a6e", "name": "Commented-code block (10 lines) in src/lib/commanderBracket.js:4", "shortDescription": {"text": "Commented-code block (10 lines) in src/lib/commanderBracket.js:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-40e28e3f8a1dfbee", "name": "Commented-code block (5 lines) in src/lib/playgroupStats.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/playgroupStats.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a415dafb35aed0cd", "name": "Legacy-named symbol `arcanevault_sfcache_v2` in src/lib/scryfall.js:139", "shortDescription": {"text": "Legacy-named symbol `arcanevault_sfcache_v2` in src/lib/scryfall.js:139"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b1e61b7fab396e7a", "name": "Commented-code block (6 lines) in src/lib/scryfall.js:313", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/scryfall.js:313"}, "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-2b0d6f5040ca9107", "name": "Legacy-named symbol `av_no_shared_price_v1` in src/lib/sharedCardPrices.js:175", "shortDescription": {"text": "Legacy-named symbol `av_no_shared_price_v1` in src/lib/sharedCardPrices.js:175"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6ac00e3b3aa02309", "name": "Commented-code block (6 lines) in src/lib/sharedCardPrices.js:169", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/sharedCardPrices.js: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-5008dd84f1834c13", "name": "Legacy-named symbol `arcanevault_consent_v1` in src/lib/consent.js:1", "shortDescription": {"text": "Legacy-named symbol `arcanevault_consent_v1` in src/lib/consent.js:1"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-549f84f4933bfbb7", "name": "Commented-code block (5 lines) in src/lib/db.js:549", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/db.js:549"}, "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-7e903b52e30d2942", "name": "Commented-code block (5 lines) in src/lib/hydrateWorker.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/hydrateWorker.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c0e5cc6bfa202d5b", "name": "Commented-code block (5 lines) in src/lib/commandZone.js:4", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/commandZone.js:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-264ec7686fc5dd0a", "name": "Commented-code block (5 lines) in src/lib/cardCategory.js:156", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/cardCategory.js: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-929c13b69fb2eb8f", "name": "Commented-code block (5 lines) in src/lib/priceCoerce.js:6", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/priceCoerce.js:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c15f091c01395a58", "name": "Commented-code block (5 lines) in src/lib/deckBuildAssistant.js:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/deckBuildAssistant.js: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-bff192402b6d7195", "name": "Commented-code block (5 lines) in src/lib/printingOptimize.js:5", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/printingOptimize.js:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d2502d81245e2fcf", "name": "Commented-code block (7 lines) in src/lib/uuid.js:1", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/uuid.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-296c2c5e2ddec663", "name": "Commented-code block (5 lines) in src/lib/colorFilter.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/colorFilter.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6f6d7584e5245267", "name": "Commented-code block (5 lines) in src/lib/collectionFetchers.js:21", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/collectionFetchers.js: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-246c51650ec5d85f", "name": "Commented-code block (5 lines) in src/lib/miniMarkdown.jsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/miniMarkdown.jsx: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-3f6aeb8743fa2048", "name": "Commented-code block (5 lines) in src/lib/deckBuilderWrites.js:14", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/deckBuilderWrites.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-8b20bfa5a504d93d", "name": "Commented-code block (7 lines) in src/lib/dayChange.js:7", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/dayChange.js:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bc912e2715d3ae35", "name": "Legacy-named symbol `myOld` in src/pages/LifeTracker.jsx:1715", "shortDescription": {"text": "Legacy-named symbol `myOld` in src/pages/LifeTracker.jsx:1715"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f3be73ec83bd44bb", "name": "Legacy-named symbol `av_tournaments_v1` in src/pages/Tournaments.jsx:24", "shortDescription": {"text": "Legacy-named symbol `av_tournaments_v1` in src/pages/Tournaments.jsx:24"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c14a6b542f7635c4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/pages/DeckView.jsx:200", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/pages/DeckView.jsx:200"}, "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-683da203aa42c994", "name": "Legacy-named symbol `deckbuilder_visible_columns_v1` in src/pages/DeckBuilder.jsx:574", "shortDescription": {"text": "Legacy-named symbol `deckbuilder_visible_columns_v1` in src/pages/DeckBuilder.jsx:574"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ce4a986ef9596bdf", "name": "Commented-code block (7 lines) in src/pages/DeckBuilder.jsx:667", "shortDescription": {"text": "Commented-code block (7 lines) in src/pages/DeckBuilder.jsx:667"}, "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-eed21c6cf0182623", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/pages/DeckBuilder.jsx:642", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/pages/DeckBuilder.jsx:642"}, "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-185b8e9668732d64", "name": "Legacy-named symbol `loadCardsLegacy` in src/pages/Collection.jsx:454", "shortDescription": {"text": "Legacy-named symbol `loadCardsLegacy` in src/pages/Collection.jsx:454"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a224540b7f325488", "name": "Legacy-named symbol `av_mtg_news_v1` in src/pages/Home.jsx:304", "shortDescription": {"text": "Legacy-named symbol `av_mtg_news_v1` in src/pages/Home.jsx:304"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-eee89591cc1d2ab0", "name": "Commented-code block (9 lines) in src/pages/Home.jsx:232", "shortDescription": {"text": "Commented-code block (9 lines) in src/pages/Home.jsx:232"}, "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-60930a1139230d5d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/pages/Home.jsx:319", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/pages/Home.jsx:319"}, "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-b8261a513de20842", "name": "Commented-code block (7 lines) in src/scanner/ScannerEngine.js:65", "shortDescription": {"text": "Commented-code block (7 lines) in src/scanner/ScannerEngine.js:65"}, "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-f242aa146d998270", "name": "Commented-code block (5 lines) in src/scanner/DatabaseService.js:37", "shortDescription": {"text": "Commented-code block (5 lines) in src/scanner/DatabaseService.js:37"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d93adce33b6dbcfd", "name": "Commented-code block (5 lines) in src/scanner/CardScanner.jsx:1377", "shortDescription": {"text": "Commented-code block (5 lines) in src/scanner/CardScanner.jsx:1377"}, "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-8dd93d286b9e3c8d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useCombosFetch.js:43", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useCombosFetch.js:43"}, "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-29d34057416a4b4e", "name": "Commented-code block (5 lines) in src/hooks/useFilterWorker.js:28", "shortDescription": {"text": "Commented-code block (5 lines) in src/hooks/useFilterWorker.js:28"}, "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-250f57e8a1dbd3c5", "name": "4 env vars used in code but missing from .env.example", "shortDescription": {"text": "4 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `BASE_URL`, `DEV`, `SUPABASE_SERVICE_KEY`, `VITE_CAPACITOR`. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-536bac350ac92ddd", "name": "Frontend route `/discover` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `/discover` has no Link/navigate to it \u2014 src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5c940beaeac54bb4", "name": "Frontend route `/builder/:id/playtest` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `/builder/:id/playtest` has no Link/navigate to it \u2014 src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c50eee96f20dc9a7", "name": "Frontend route `/builder/:id` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `/builder/:id` has no Link/navigate to it \u2014 src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-73cc3447d4efb5d0", "name": "Frontend route `/profile/:username` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `/profile/:username` has no Link/navigate to it \u2014 src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a3e65fccfb6da1ad", "name": "Frontend route `/share/:token` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `/share/:token` has no Link/navigate to it \u2014 src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9dae2974fb1ea29b", "name": "Frontend route `/d/:id` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `/d/:id` has no Link/navigate to it \u2014 src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-307590395e39f6d2", "name": "Frontend route `/join/:code` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `/join/:code` has no Link/navigate to it \u2014 src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d885bb7397295b53", "name": "Frontend route `/join-tournament/:code` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `/join-tournament/:code` has no Link/navigate to it \u2014 src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1297ef009c2c6bc0", "name": "Frontend route `/*` has no Link/navigate to it \u2014 src/App.jsx", "shortDescription": {"text": "Frontend route `/*` has no Link/navigate to it \u2014 src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/21115"}, "properties": {"repository": "themazzy/arcanevault", "repoUrl": "https://github.com/themazzy/arcanevault", "branch": "main"}, "results": [{"ruleId": "scanner-971d0f69f79c5da8", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 scripts/generate-card-hashes.js:15"}, "properties": {"repobilityId": "a47dbf4a5154d883", "scanner": "scanner-primary", "fingerprint": "971d0f69f79c5da8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-2b3d8f2780f2ce9f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generate-card-hashes.js:137"}, "properties": {"repobilityId": "03a561b6ef232d0f", "scanner": "scanner-primary", "fingerprint": "2b3d8f2780f2ce9f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c065ada0fe1c3acb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/patch-camera-preview.js:22"}, "properties": {"repobilityId": "13d311b80e5b760d", "scanner": "scanner-primary", "fingerprint": "c065ada0fe1c3acb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9e4a9773ae0e50d9", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/UI.jsx:251"}, "properties": {"repobilityId": "d7828fc7a92f1de0", "scanner": "scanner-primary", "fingerprint": "9e4a9773ae0e50d9", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-f1eb06f1aaa267c9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/scryfall.js:171"}, "properties": {"repobilityId": "516caa0d165ecbf0", "scanner": "scanner-primary", "fingerprint": "f1eb06f1aaa267c9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1760ea4922abb046", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/fx.js:40"}, "properties": {"repobilityId": "517bba35e75bfe60", "scanner": "scanner-primary", "fingerprint": "1760ea4922abb046", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a2ea4c97c21d52a4", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/lib/miniMarkdown.jsx:2"}, "properties": {"repobilityId": "cb5302d692729633", "scanner": "scanner-primary", "fingerprint": "a2ea4c97c21d52a4", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-12befe4f6fc5908a", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/pages/Trading.jsx:270"}, "properties": {"repobilityId": "babf0fdb7f8c8bc7", "scanner": "scanner-primary", "fingerprint": "12befe4f6fc5908a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-2c8c6b5863445e14", "level": "note", "message": {"text": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 src/pages/Admin.jsx:385"}, "properties": {"repobilityId": "b1766f2eb410367f", "scanner": "scanner-primary", "fingerprint": "2c8c6b5863445e14", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.edge-label.no-bg"]}}, {"ruleId": "scanner-dacd450afcaa8a57", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/pages/Collection.jsx:467"}, "properties": {"repobilityId": "37ee2ac2cc647ff2", "scanner": "scanner-primary", "fingerprint": "dacd450afcaa8a57", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-035396b6149140f3", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/pages/Home.jsx:1456"}, "properties": {"repobilityId": "dbae66c2a4210d24", "scanner": "scanner-primary", "fingerprint": "035396b6149140f3", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-ff8dbe6434f0c23c", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in CLAUDE.md:280"}, "properties": {"repobilityId": "357ad155aeba7b11", "scanner": "scanner-primary", "fingerprint": "ff8dbe6434f0c23c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "CLAUDE.md"}, "region": {"startLine": 280}}}]}, {"ruleId": "scanner-16a7365071d024dc", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in cloudflare/og-worker/worker.js:32"}, "properties": {"repobilityId": "7be9bf06b1c97a89", "scanner": "scanner-primary", "fingerprint": "16a7365071d024dc", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "cloudflare/og-worker/worker.js"}, "region": {"startLine": 32}}}]}, {"ruleId": "scanner-ff5a407a934f81c7", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/admin-dashboard-summary/index.ts:4"}, "properties": {"repobilityId": "47092b060f20db01", "scanner": "scanner-primary", "fingerprint": "ff5a407a934f81c7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/admin-dashboard-summary/index.ts"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-094d347ea310c607", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/stripe-create-checkout/index.ts:4"}, "properties": {"repobilityId": "8f8eb373ab077e6e", "scanner": "scanner-primary", "fingerprint": "094d347ea310c607", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/stripe-create-checkout/index.ts"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-bb5d8f8ed4f9c49e", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/admin-users-directory/index.ts:4"}, "properties": {"repobilityId": "b8801ea8d66d70ed", "scanner": "scanner-primary", "fingerprint": "bb5d8f8ed4f9c49e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/admin-users-directory/index.ts"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-ee9b3d34c2147162", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/combo-proxy/index.ts:2"}, "properties": {"repobilityId": "37c57a613d67f006", "scanner": "scanner-primary", "fingerprint": "ee9b3d34c2147162", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/combo-proxy/index.ts"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-f986897acf035ba9", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/admin-delete-account/index.ts:4"}, "properties": {"repobilityId": "537eb079eca97835", "scanner": "scanner-primary", "fingerprint": "f986897acf035ba9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/admin-delete-account/index.ts"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-f87ba6b51e5d6d0c", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/admin-update-user-settings/index.ts:4"}, "properties": {"repobilityId": "b28d96ee92de9354", "scanner": "scanner-primary", "fingerprint": "f87ba6b51e5d6d0c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/admin-update-user-settings/index.ts"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-c08c4bfc8b043821", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/UI.jsx:251"}, "properties": {"repobilityId": "0cff04208bcd290a", "scanner": "scanner-primary", "fingerprint": "c08c4bfc8b043821", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/UI.jsx"}, "region": {"startLine": 251}}}]}, {"ruleId": "scanner-c7caa074adb05054", "level": "error", "message": {"text": "Insecure pattern 'exec_used' in src/pages/Admin.jsx:412"}, "properties": {"repobilityId": "3430d4a20e26ade9", "scanner": "scanner-primary", "fingerprint": "c7caa074adb05054", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "exec_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/pages/Admin.jsx"}, "region": {"startLine": 412}}}]}, {"ruleId": "scanner-631cc0ced81ba795", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/pages/Admin.jsx:396"}, "properties": {"repobilityId": "c611c7604b3c1a4e", "scanner": "scanner-primary", "fingerprint": "631cc0ced81ba795", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/pages/Admin.jsx"}, "region": {"startLine": 396}}}]}, {"ruleId": "scanner-560c9c9e269ebe79", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/pages/Home.jsx:1456"}, "properties": {"repobilityId": "4d3e65fc682a359e", "scanner": "scanner-primary", "fingerprint": "560c9c9e269ebe79", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/pages/Home.jsx"}, "region": {"startLine": 1456}}}]}, {"ruleId": "scanner-a638e7143eec12d2", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "e4118266f220611f", "scanner": "scanner-primary", "fingerprint": "a638e7143eec12d2", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/build-android.yml"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-a638e7143eec12d2", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "7148158b985bb303", "scanner": "scanner-primary", "fingerprint": "a638e7143eec12d2", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/build-android.yml"}, "region": {"startLine": 24}}}]}, {"ruleId": "scanner-a638e7143eec12d2", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "c4ac8d8091d22fd6", "scanner": "scanner-primary", "fingerprint": "a638e7143eec12d2", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/build-android.yml"}, "region": {"startLine": 30}}}]}, {"ruleId": "scanner-a638e7143eec12d2", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "02b31928ee102415", "scanner": "scanner-primary", "fingerprint": "a638e7143eec12d2", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/build-android.yml"}, "region": {"startLine": 56}}}]}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "2aee2e2d969c7c6b", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 23}}}]}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "8ef93418bde27bdb", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "bee6b8956e03198c", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 29}}}]}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "b70dbcc8f54d72ab", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 48}}}]}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "419d1ec7943efec2", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 61}}}]}, {"ruleId": "scanner-ad6701f0a8405e22", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "8384c23520d55657", "scanner": "scanner-primary", "fingerprint": "ad6701f0a8405e22", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5461b56675483314", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "65dd74cfb2a9c42a", "scanner": "scanner-primary", "fingerprint": "5461b56675483314", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/card-price-sync.yml"}, "region": {"startLine": 16}}}]}, {"ruleId": "scanner-5461b56675483314", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ca71ef9482a745ad", "scanner": "scanner-primary", "fingerprint": "5461b56675483314", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/card-price-sync.yml"}, "region": {"startLine": 19}}}]}, {"ruleId": "scanner-9ea5635930915347", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "bb4dedaed7127e76", "scanner": "scanner-primary", "fingerprint": "9ea5635930915347", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/build-ios.yml"}, "region": {"startLine": 12}}}]}, {"ruleId": "scanner-9ea5635930915347", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "7e142c4de9eb85c9", "scanner": "scanner-primary", "fingerprint": "9ea5635930915347", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/build-ios.yml"}, "region": {"startLine": 15}}}]}, {"ruleId": "scanner-9ea5635930915347", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "cf2f1940aba20177", "scanner": "scanner-primary", "fingerprint": "9ea5635930915347", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/build-ios.yml"}, "region": {"startLine": 63}}}]}, {"ruleId": "scanner-cb639d9a10a47b23", "level": "note", "message": {"text": "package.json defines install-time lifecycle scripts"}, "properties": {"repobilityId": "edeab51902066991", "scanner": "scanner-primary", "fingerprint": "cb639d9a10a47b23", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "npm", "install-scripts"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a61391356cdb4fe0", "level": "note", "message": {"text": "Very large file: src/components/DeckStats.jsx (1168 lines)"}, "properties": {"repobilityId": "42b7fad5e7aff4d6", "scanner": "scanner-primary", "fingerprint": "a61391356cdb4fe0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-12aa5bb21c33b6e1", "level": "note", "message": {"text": "Very large file: src/components/ImportModal.jsx (1181 lines)"}, "properties": {"repobilityId": "2241ca68a88002c3", "scanner": "scanner-primary", "fingerprint": "12aa5bb21c33b6e1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-830d21ee49757889", "level": "note", "message": {"text": "Very large file: src/components/CardBrowserViews.jsx (1192 lines)"}, "properties": {"repobilityId": "afecdfe5278d9544", "scanner": "scanner-primary", "fingerprint": "830d21ee49757889", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-891da34cbd42cd3d", "level": "note", "message": {"text": "Very large file: src/components/CardComponents.jsx (1858 lines)"}, "properties": {"repobilityId": "51d96ee50376c53a", "scanner": "scanner-primary", "fingerprint": "891da34cbd42cd3d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d35833b037b8390a", "level": "note", "message": {"text": "Very large file: src/pages/Settings.jsx (1357 lines)"}, "properties": {"repobilityId": "9bb16a7351c04361", "scanner": "scanner-primary", "fingerprint": "d35833b037b8390a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-14119aded5000140", "level": "note", "message": {"text": "Very large file: src/pages/LifeTracker.jsx (2564 lines)"}, "properties": {"repobilityId": "238e642562d5f8ef", "scanner": "scanner-primary", "fingerprint": "14119aded5000140", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-88fe7f929e1d77d5", "level": "note", "message": {"text": "Very large file: src/pages/DeckBrowser.jsx (1372 lines)"}, "properties": {"repobilityId": "988e062183f6fc6e", "scanner": "scanner-primary", "fingerprint": "88fe7f929e1d77d5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-428f4c6fe3c4494a", "level": "note", "message": {"text": "Very large file: src/pages/Trading.jsx (1428 lines)"}, "properties": {"repobilityId": "15e82ff39bf53621", "scanner": "scanner-primary", "fingerprint": "428f4c6fe3c4494a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-cf5dd37a74f5a18a", "level": "note", "message": {"text": "Very large file: src/pages/Lists.jsx (1486 lines)"}, "properties": {"repobilityId": "323cfaeed1c8c708", "scanner": "scanner-primary", "fingerprint": "cf5dd37a74f5a18a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6cdecfb67ac67f8a", "level": "note", "message": {"text": "Very large file: src/pages/Admin.jsx (1766 lines)"}, "properties": {"repobilityId": "a2efb6cbf1955806", "scanner": "scanner-primary", "fingerprint": "6cdecfb67ac67f8a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4e29b5383cd2a44b", "level": "note", "message": {"text": "Very large file: src/pages/Folders.jsx (2187 lines)"}, "properties": {"repobilityId": "10d06d820ae13bbc", "scanner": "scanner-primary", "fingerprint": "4e29b5383cd2a44b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ce7e8baf9b7736cd", "level": "note", "message": {"text": "Very large file: src/pages/DeckBuilder.jsx (5560 lines)"}, "properties": {"repobilityId": "b1b4e99586821b19", "scanner": "scanner-primary", "fingerprint": "ce7e8baf9b7736cd", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-41eefe3fcb40f3ee", "level": "note", "message": {"text": "Very large file: src/pages/Profile.jsx (1287 lines)"}, "properties": {"repobilityId": "acf1991aaf01e93e", "scanner": "scanner-primary", "fingerprint": "41eefe3fcb40f3ee", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-0b3cb3b3f06edc1e", "level": "note", "message": {"text": "Very large file: src/pages/Collection.jsx (1728 lines)"}, "properties": {"repobilityId": "e17ef652c3ba724e", "scanner": "scanner-primary", "fingerprint": "0b3cb3b3f06edc1e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-80de3e6bea2b05b6", "level": "note", "message": {"text": "Very large file: src/pages/Home.jsx (1632 lines)"}, "properties": {"repobilityId": "e5be0243836b7790", "scanner": "scanner-primary", "fingerprint": "80de3e6bea2b05b6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-cdd61dd01fb37e6a", "level": "note", "message": {"text": "Very large file: src/pages/Stats.jsx (1853 lines)"}, "properties": {"repobilityId": "d38852c847b0a124", "scanner": "scanner-primary", "fingerprint": "cdd61dd01fb37e6a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-87eae09d9f2a9274", "level": "note", "message": {"text": "Very large file: src/scanner/CardScanner.jsx (2313 lines)"}, "properties": {"repobilityId": "7ba75f03f2c5f473", "scanner": "scanner-primary", "fingerprint": "87eae09d9f2a9274", "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-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "9ff4bcc0c1297cc9", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "e4aa2132a6f91a04", "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": "83be6d8da50c16f4", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "f8961a793eada2d1", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "92eed9390e3025fb", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "096924e2a2be9188", "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": "917153bdf3a88535", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-17d866d91a7c451e", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: CLAUDE.md"}, "properties": {"repobilityId": "ccce5984e58a48f0", "scanner": "scanner-primary", "fingerprint": "17d866d91a7c451e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "CLAUDE.md"}, "region": {"startLine": 58}}}]}, {"ruleId": "scanner-cbb5857940ba0dc2", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: AGENTS.md"}, "properties": {"repobilityId": "e12c7213d5eadf3e", "scanner": "scanner-primary", "fingerprint": "cbb5857940ba0dc2", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "agents_md"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "AGENTS.md"}, "region": {"startLine": 62}}}]}, {"ruleId": "scanner-718c8e93a50ab259", "level": "note", "message": {"text": "Legacy-named symbol `buildLegacy` in scripts/generate-android-icons.mjs:21"}, "properties": {"repobilityId": "292374b9a946e45d", "scanner": "scanner-primary", "fingerprint": "718c8e93a50ab259", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ec18ce2a742f3474", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/backfill-card-prints.mjs:73"}, "properties": {"repobilityId": "490f45628a050148", "scanner": "scanner-primary", "fingerprint": "ec18ce2a742f3474", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9a436aa5d13b2639", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/cache-set-icons.mjs:14"}, "properties": {"repobilityId": "7412282e227ee6a8", "scanner": "scanner-primary", "fingerprint": "9a436aa5d13b2639", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-15b466535fd0af4a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/sync-card-prices.mjs:78"}, "properties": {"repobilityId": "83524ec739dd8a0c", "scanner": "scanner-primary", "fingerprint": "15b466535fd0af4a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-252e4a15ec7eb493", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/generate-card-hashes.js:96"}, "properties": {"repobilityId": "2c886df0c66d4107", "scanner": "scanner-primary", "fingerprint": "252e4a15ec7eb493", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c82c4ed7b856abdf", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 cloudflare/og-worker/worker.js:35"}, "properties": {"repobilityId": "ac845fad0d64a45a", "scanner": "scanner-primary", "fingerprint": "c82c4ed7b856abdf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8a21541fa969e67d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/stripe-create-checkout/index.ts:37"}, "properties": {"repobilityId": "d4c3f3bdecb85c0f", "scanner": "scanner-primary", "fingerprint": "8a21541fa969e67d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-66ab38f3f1aa566e", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/components/ExportModal.jsx:6"}, "properties": {"repobilityId": "80741e9790712eca", "scanner": "scanner-primary", "fingerprint": "66ab38f3f1aa566e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4681728d7df0bca5", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/AddCardModal.jsx:489"}, "properties": {"repobilityId": "d8f0e3d23510f98c", "scanner": "scanner-primary", "fingerprint": "4681728d7df0bca5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-63ebe1e5e2a90e1c", "level": "note", "message": {"text": "Legacy-named symbol `arcanevault_browser_table_columns_v1` in src/components/CardBrowserViews.jsx:373"}, "properties": {"repobilityId": "d26a0f2431b8657d", "scanner": "scanner-primary", "fingerprint": "63ebe1e5e2a90e1c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-53bf0512109555c5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/CardComponents.jsx:455"}, "properties": {"repobilityId": "7521d2de50d020f9", "scanner": "scanner-primary", "fingerprint": "53bf0512109555c5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bfd3d69da354919d", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/deckBuilder/BuildAssistant.jsx:36"}, "properties": {"repobilityId": "4abb21a92cc4a145", "scanner": "scanner-primary", "fingerprint": "bfd3d69da354919d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d9f96c06441a108a", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/deckBuilder/GuidedCommanderPicker.jsx:32"}, "properties": {"repobilityId": "ff7c417fc62beb94", "scanner": "scanner-primary", "fingerprint": "d9f96c06441a108a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-13c1dee1c8f28ead", "level": "note", "message": {"text": "Legacy-named symbol `dl_set_releases_v1` in src/lib/deckBuilderApi.js:251"}, "properties": {"repobilityId": "80804eac50f7bbed", "scanner": "scanner-primary", "fingerprint": "13c1dee1c8f28ead", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-bd00f174890825af", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/deckBuilderApi.js:241"}, "properties": {"repobilityId": "55f8fe283615bf50", "scanner": "scanner-primary", "fingerprint": "bd00f174890825af", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-44b14fcc29122466", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/deckBuilderApi.js:572"}, "properties": {"repobilityId": "e9467bd70c22e370", "scanner": "scanner-primary", "fingerprint": "44b14fcc29122466", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f119be361d34b1b9", "level": "none", "message": {"text": "Commented-code block (12 lines) in src/lib/filterCore.js:72"}, "properties": {"repobilityId": "e297e950a66a9223", "scanner": "scanner-primary", "fingerprint": "f119be361d34b1b9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f88b96c6883e5a71", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/buyLinks.js:1"}, "properties": {"repobilityId": "a31cd7f65373d355", "scanner": "scanner-primary", "fingerprint": "f88b96c6883e5a71", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f03f2e09d2846318", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/wishlistSync.js:3"}, "properties": {"repobilityId": "aa76b0715dc93642", "scanner": "scanner-primary", "fingerprint": "f03f2e09d2846318", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d291e9a9527016e7", "level": "note", "message": {"text": "Legacy-named symbol `arcanevault_game_changers_v1` in src/lib/commanderBracket.js:22"}, "properties": {"repobilityId": "462df0dce3b668a4", "scanner": "scanner-primary", "fingerprint": "d291e9a9527016e7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-aaaa0351d8044a6e", "level": "none", "message": {"text": "Commented-code block (10 lines) in src/lib/commanderBracket.js:4"}, "properties": {"repobilityId": "0c6be3ca0ccad61e", "scanner": "scanner-primary", "fingerprint": "aaaa0351d8044a6e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-40e28e3f8a1dfbee", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/playgroupStats.js:1"}, "properties": {"repobilityId": "4d23506a5cd2f0cd", "scanner": "scanner-primary", "fingerprint": "40e28e3f8a1dfbee", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a415dafb35aed0cd", "level": "note", "message": {"text": "Legacy-named symbol `arcanevault_sfcache_v2` in src/lib/scryfall.js:139"}, "properties": {"repobilityId": "8c487ab169e8212c", "scanner": "scanner-primary", "fingerprint": "a415dafb35aed0cd", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b1e61b7fab396e7a", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/scryfall.js:313"}, "properties": {"repobilityId": "425deb43ed466e36", "scanner": "scanner-primary", "fingerprint": "b1e61b7fab396e7a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2b0d6f5040ca9107", "level": "note", "message": {"text": "Legacy-named symbol `av_no_shared_price_v1` in src/lib/sharedCardPrices.js:175"}, "properties": {"repobilityId": "029c8f6b4a3c991d", "scanner": "scanner-primary", "fingerprint": "2b0d6f5040ca9107", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-6ac00e3b3aa02309", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/sharedCardPrices.js:169"}, "properties": {"repobilityId": "989a2a8d448caadc", "scanner": "scanner-primary", "fingerprint": "6ac00e3b3aa02309", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5008dd84f1834c13", "level": "note", "message": {"text": "Legacy-named symbol `arcanevault_consent_v1` in src/lib/consent.js:1"}, "properties": {"repobilityId": "71d69f0bd3802ef8", "scanner": "scanner-primary", "fingerprint": "5008dd84f1834c13", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-549f84f4933bfbb7", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/db.js:549"}, "properties": {"repobilityId": "f4bf12d2e0dc65bd", "scanner": "scanner-primary", "fingerprint": "549f84f4933bfbb7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7e903b52e30d2942", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/hydrateWorker.js:1"}, "properties": {"repobilityId": "48388d39102cc298", "scanner": "scanner-primary", "fingerprint": "7e903b52e30d2942", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c0e5cc6bfa202d5b", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/commandZone.js:4"}, "properties": {"repobilityId": "8d157d67231baee9", "scanner": "scanner-primary", "fingerprint": "c0e5cc6bfa202d5b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-264ec7686fc5dd0a", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/cardCategory.js:156"}, "properties": {"repobilityId": "215c37a9820885c7", "scanner": "scanner-primary", "fingerprint": "264ec7686fc5dd0a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-929c13b69fb2eb8f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/priceCoerce.js:6"}, "properties": {"repobilityId": "de535c10ae15d676", "scanner": "scanner-primary", "fingerprint": "929c13b69fb2eb8f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c15f091c01395a58", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/deckBuildAssistant.js:3"}, "properties": {"repobilityId": "04e7ab550739a1fc", "scanner": "scanner-primary", "fingerprint": "c15f091c01395a58", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bff192402b6d7195", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/printingOptimize.js:5"}, "properties": {"repobilityId": "da17b4aabe2d7f73", "scanner": "scanner-primary", "fingerprint": "bff192402b6d7195", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d2502d81245e2fcf", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/uuid.js:1"}, "properties": {"repobilityId": "f4a7eea91cf9fba4", "scanner": "scanner-primary", "fingerprint": "d2502d81245e2fcf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-296c2c5e2ddec663", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/colorFilter.js:1"}, "properties": {"repobilityId": "54bc3391d50045e7", "scanner": "scanner-primary", "fingerprint": "296c2c5e2ddec663", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6f6d7584e5245267", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/collectionFetchers.js:21"}, "properties": {"repobilityId": "76db13dcd263b149", "scanner": "scanner-primary", "fingerprint": "6f6d7584e5245267", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-246c51650ec5d85f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/miniMarkdown.jsx:1"}, "properties": {"repobilityId": "4af69b48768910b9", "scanner": "scanner-primary", "fingerprint": "246c51650ec5d85f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3f6aeb8743fa2048", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/deckBuilderWrites.js:14"}, "properties": {"repobilityId": "38ee97ac76e87f03", "scanner": "scanner-primary", "fingerprint": "3f6aeb8743fa2048", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8b20bfa5a504d93d", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/dayChange.js:7"}, "properties": {"repobilityId": "5efb2bc14e49e8b6", "scanner": "scanner-primary", "fingerprint": "8b20bfa5a504d93d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bc912e2715d3ae35", "level": "note", "message": {"text": "Legacy-named symbol `myOld` in src/pages/LifeTracker.jsx:1715"}, "properties": {"repobilityId": "5b2de0661cdf012c", "scanner": "scanner-primary", "fingerprint": "bc912e2715d3ae35", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-f3be73ec83bd44bb", "level": "note", "message": {"text": "Legacy-named symbol `av_tournaments_v1` in src/pages/Tournaments.jsx:24"}, "properties": {"repobilityId": "b53a01188f62d427", "scanner": "scanner-primary", "fingerprint": "f3be73ec83bd44bb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-c14a6b542f7635c4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/pages/DeckView.jsx:200"}, "properties": {"repobilityId": "367461b4d9817368", "scanner": "scanner-primary", "fingerprint": "c14a6b542f7635c4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-683da203aa42c994", "level": "note", "message": {"text": "Legacy-named symbol `deckbuilder_visible_columns_v1` in src/pages/DeckBuilder.jsx:574"}, "properties": {"repobilityId": "7ae3e90bca8dee32", "scanner": "scanner-primary", "fingerprint": "683da203aa42c994", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ce4a986ef9596bdf", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/pages/DeckBuilder.jsx:667"}, "properties": {"repobilityId": "4a3992a658d20b48", "scanner": "scanner-primary", "fingerprint": "ce4a986ef9596bdf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-eed21c6cf0182623", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/pages/DeckBuilder.jsx:642"}, "properties": {"repobilityId": "aa845b1619fc15d3", "scanner": "scanner-primary", "fingerprint": "eed21c6cf0182623", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-185b8e9668732d64", "level": "note", "message": {"text": "Legacy-named symbol `loadCardsLegacy` in src/pages/Collection.jsx:454"}, "properties": {"repobilityId": "85485145c01ad4b0", "scanner": "scanner-primary", "fingerprint": "185b8e9668732d64", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a224540b7f325488", "level": "note", "message": {"text": "Legacy-named symbol `av_mtg_news_v1` in src/pages/Home.jsx:304"}, "properties": {"repobilityId": "ad979c98e30e1962", "scanner": "scanner-primary", "fingerprint": "a224540b7f325488", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-eee89591cc1d2ab0", "level": "none", "message": {"text": "Commented-code block (9 lines) in src/pages/Home.jsx:232"}, "properties": {"repobilityId": "319cbbc445831c09", "scanner": "scanner-primary", "fingerprint": "eee89591cc1d2ab0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-60930a1139230d5d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/pages/Home.jsx:319"}, "properties": {"repobilityId": "58c0770fc42d5d48", "scanner": "scanner-primary", "fingerprint": "60930a1139230d5d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b8261a513de20842", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/scanner/ScannerEngine.js:65"}, "properties": {"repobilityId": "fb1c7a878c7ed2d3", "scanner": "scanner-primary", "fingerprint": "b8261a513de20842", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f242aa146d998270", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/scanner/DatabaseService.js:37"}, "properties": {"repobilityId": "53493c11245147ef", "scanner": "scanner-primary", "fingerprint": "f242aa146d998270", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d93adce33b6dbcfd", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/scanner/CardScanner.jsx:1377"}, "properties": {"repobilityId": "8fc58ec320aac55f", "scanner": "scanner-primary", "fingerprint": "d93adce33b6dbcfd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8dd93d286b9e3c8d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useCombosFetch.js:43"}, "properties": {"repobilityId": "c7b12ec694bfd3f4", "scanner": "scanner-primary", "fingerprint": "8dd93d286b9e3c8d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-29d34057416a4b4e", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/hooks/useFilterWorker.js:28"}, "properties": {"repobilityId": "0f1fa5bfa8bc6a20", "scanner": "scanner-primary", "fingerprint": "29d34057416a4b4e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-250f57e8a1dbd3c5", "level": "none", "message": {"text": "4 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "57584f22b735b5ee", "scanner": "scanner-primary", "fingerprint": "250f57e8a1dbd3c5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-536bac350ac92ddd", "level": "warning", "message": {"text": "Frontend route `/discover` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "c558bf5009452662", "scanner": "scanner-primary", "fingerprint": "536bac350ac92ddd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-5c940beaeac54bb4", "level": "warning", "message": {"text": "Frontend route `/builder/:id/playtest` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "21604b13a13abf5d", "scanner": "scanner-primary", "fingerprint": "5c940beaeac54bb4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c50eee96f20dc9a7", "level": "warning", "message": {"text": "Frontend route `/builder/:id` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "b2a7edb1d51e0194", "scanner": "scanner-primary", "fingerprint": "c50eee96f20dc9a7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-73cc3447d4efb5d0", "level": "warning", "message": {"text": "Frontend route `/profile/:username` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "aac2bb96f7cb144f", "scanner": "scanner-primary", "fingerprint": "73cc3447d4efb5d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a3e65fccfb6da1ad", "level": "warning", "message": {"text": "Frontend route `/share/:token` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "bd554b58984e52d5", "scanner": "scanner-primary", "fingerprint": "a3e65fccfb6da1ad", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-9dae2974fb1ea29b", "level": "warning", "message": {"text": "Frontend route `/d/:id` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "da51195c84bedc14", "scanner": "scanner-primary", "fingerprint": "9dae2974fb1ea29b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-307590395e39f6d2", "level": "warning", "message": {"text": "Frontend route `/join/:code` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "cc4979cebda58c66", "scanner": "scanner-primary", "fingerprint": "307590395e39f6d2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d885bb7397295b53", "level": "warning", "message": {"text": "Frontend route `/join-tournament/:code` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "16254a2a4efcddbb", "scanner": "scanner-primary", "fingerprint": "d885bb7397295b53", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-1297ef009c2c6bc0", "level": "warning", "message": {"text": "Frontend route `/*` has no Link/navigate to it \u2014 src/App.jsx"}, "properties": {"repobilityId": "f87c08f0ec456eb2", "scanner": "scanner-primary", "fingerprint": "1297ef009c2c6bc0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}]}]}