{"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-70dd88d57de5b628", "name": "Possibly dead Python function: extract_name_and_type", "shortDescription": {"text": "Possibly dead Python function: extract_name_and_type"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e14f378079a2e57c", "name": "Stray `console.log` in TS/JS \u2014 vite.config.ts:15", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 vite.config.ts:15"}, "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-2c3d59cc13148ef8", "name": "Stray `console.log` in TS/JS \u2014 scripts/setupSqlExec.ts:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/setupSqlExec.ts:10"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1091bd757c1aaa47", "name": "Stray `console.log` in TS/JS \u2014 scripts/inspectStore.ts:36", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/inspectStore.ts:36"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-69944c41e9d6dbad", "name": "Stray `console.log` in TS/JS \u2014 scripts/migrateDatabaseDirect.ts:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrateDatabaseDirect.ts: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-b38eb2fc7262988c", "name": "Stray `console.log` in TS/JS \u2014 scripts/updateCards.ts:60", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/updateCards.ts:60"}, "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-8122d0defb24dc72", "name": "Stray `console.log` in TS/JS \u2014 scripts/parseCards.ts:505", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/parseCards.ts:505"}, "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-a8d75ce30238e7b8", "name": "Stray `console.log` in TS/JS \u2014 scripts/parseCardsV2.ts:629", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/parseCardsV2.ts:629"}, "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-78ef06f95171198f", "name": "Stray `console.log` in TS/JS \u2014 scripts/getLogs.js:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/getLogs.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-484b594553cea9a9", "name": "Stray `console.log` in TS/JS \u2014 scripts/migrateImages.ts:83", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrateImages.ts:83"}, "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-1b213ea3c727db45", "name": "Stray `console.log` in TS/JS \u2014 scripts/migrateDatabaseHttp.ts:113", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrateDatabaseHttp.ts:113"}, "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-667f5cca7e2380c6", "name": "Stray `console.log` in TS/JS \u2014 scripts/debugRoute.ts:39", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/debugRoute.ts:39"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f31ac18e18097e67", "name": "Stray `console.log` in TS/JS \u2014 scripts/checkStructure.js:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/checkStructure.js:12"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-834a212a38e5eb59", "name": "Stray `console.log` in TS/JS \u2014 scripts/testCardLoading.ts:23", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/testCardLoading.ts:23"}, "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-2772ea22c14116da", "name": "Stray `console.log` in TS/JS \u2014 scripts/checkIds.ts:17", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/checkIds.ts:17"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f21ec0a56fb0ad7e", "name": "Stray `console.log` in TS/JS \u2014 scripts/test.ts:5", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test.ts:5"}, "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-c1f5fe2b33331074", "name": "Stray `console.log` in TS/JS \u2014 scripts/downloadMissingImages.ts:63", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/downloadMissingImages.ts:63"}, "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-43f2fa193c066e94", "name": "Stray `console.log` in TS/JS \u2014 scripts/copyAssets.js:26", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/copyAssets.js:26"}, "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-f5002e3a231dbfc6", "name": "Stray `console.log` in TS/JS \u2014 scripts/generateCleanCards.js:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generateCleanCards.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-57029829aa370693", "name": "Stray `console.log` in TS/JS \u2014 scripts/migrateDatabaseAdvanced.ts:137", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrateDatabaseAdvanced.ts: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-f02ff5b1ee062321", "name": "Stray `console.log` in TS/JS \u2014 scripts/auditStarters.ts:146", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/auditStarters.ts:146"}, "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-949991c8d576ac27", "name": "Stray `console.log` in TS/JS \u2014 scripts/updateCardIds.ts:43", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/updateCardIds.ts:43"}, "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-9a93b065cf8bd2f2", "name": "Stray `console.log` in TS/JS \u2014 scripts/analyzeTypes.ts:192", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/analyzeTypes.ts:192"}, "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-d4302eb8faa80cd6", "name": "Stray `console.log` in TS/JS \u2014 scripts/downloadImages.ts:34", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/downloadImages.ts:34"}, "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-658eb6f3cb0b2dbe", "name": "Stray `console.log` in TS/JS \u2014 scripts/countCards.ts:48", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/countCards.ts:48"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8fc6702f01e2c4de", "name": "Stray `console.log` in TS/JS \u2014 scripts/inspectSupabaseData.ts:21", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/inspectSupabaseData.ts:21"}, "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-39d909dbaa9cb7e0", "name": "Stray `console.log` in TS/JS \u2014 scripts/downloadImages.js:41", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/downloadImages.js:41"}, "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-d79dfd94fb6b8b10", "name": "Stray `console.log` in TS/JS \u2014 scripts/compileEffects.ts:294", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/compileEffects.ts:294"}, "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-8316fdacc61e3b1e", "name": "Stray `console.log` in TS/JS \u2014 scripts/checkAuthStatus.ts:24", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/checkAuthStatus.ts:24"}, "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-ec6f75c9f11112a5", "name": "Stray `console.log` in TS/JS \u2014 scripts/downloadSpecificImages.ts:70", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/downloadSpecificImages.ts:70"}, "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-7f4df6858bea2e82", "name": "Stray `console.log` in TS/JS \u2014 scripts/updateCards.js:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/updateCards.js:19"}, "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-03e6f40b877e4c74", "name": "Stray `console.log` in TS/JS \u2014 scripts/downloadPages.ts:87", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/downloadPages.ts:87"}, "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-80c8d6d2d135a9cc", "name": "Stray `console.log` in TS/JS \u2014 scripts/checkCards.ts:35", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/checkCards.ts:35"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-178dfc1a255c4c38", "name": "Stray `console.log` in TS/JS \u2014 scripts/countExpectedImages.ts:37", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/countExpectedImages.ts:37"}, "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-982b44d8be9d581c", "name": "Stray `console.log` in TS/JS \u2014 scripts/extractIllustrations.ts:88", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/extractIllustrations.ts:88"}, "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-0a757cb6c0e4f4e0", "name": "Stray `console.log` in TS/JS \u2014 scripts/optimizeImages.ts:80", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/optimizeImages.ts:80"}, "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-6854d4bce5bb367d", "name": "Stray `console.log` in TS/JS \u2014 scripts/checkTables.ts:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/checkTables.ts:8"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f4afef3175a2a54f", "name": "Stray `console.log` in TS/JS \u2014 scripts/analyzeCardStructure.ts:144", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/analyzeCardStructure.ts:144"}, "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-fa9e40cc02c17528", "name": "Stray `console.log` in TS/JS \u2014 scripts/cardWorker.js:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/cardWorker.js:16"}, "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-b994bbceeb7e0713", "name": "Stray `console.log` in TS/JS \u2014 scripts/migrateDatabase.ts:85", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrateDatabase.ts:85"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6be3fe2f37feae82", "name": "Stray `console.log` in TS/JS \u2014 scripts/validateData.ts:159", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/validateData.ts:159"}, "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-d59ce18cbb7a5585", "name": "Stray `console.log` in TS/JS \u2014 scripts/testSupabaseSync.ts:21", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/testSupabaseSync.ts:21"}, "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-591216cda526cb34", "name": "Icon-only button without accessible name \u2014 src/components/cards/CardDetailModal.vue:227", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/cards/CardDetailModal.vue:227"}, "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-dbfaa5cee90a418d", "name": "Stray `console.log` in TS/JS \u2014 src/server/index.ts:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/server/index.ts:19"}, "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-24dee4af4d80df40", "name": "Stray `console.log` in TS/JS \u2014 src/parser/index.ts:126", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/parser/index.ts:126"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c1174eb1ac80a829", "name": "Stray `console.log` in TS/JS \u2014 src/parser/hero.ts:3", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/parser/hero.ts:3"}, "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-627d6a565e787c4f", "name": "TODO/FIXME marker in shipping code \u2014 src/views/CardDetailsView.vue:199", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/views/CardDetailsView.vue:199"}, "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-b371e0029a0206eb", "name": "Insecure pattern 'node_child_process' in scripts/getLogs.js:8", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/getLogs.js:8"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-10f0e83d6568f6ed", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/_shared/cors.ts:3", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/_shared/cors.ts:3"}, "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-3fab7843c5294ce9", "name": "Possible secret in src/stores/__tests__/authStore.spec.ts", "shortDescription": {"text": "Possible secret in src/stores/__tests__/authStore.spec.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-9c96ef9b6aee608d", "name": "Insecure pattern 'vue_v_html' in src/components/card/CardZoomModal.vue:79", "shortDescription": {"text": "Insecure pattern 'vue_v_html' in src/components/card/CardZoomModal.vue:79"}, "fullDescription": {"text": "Found a known-risky pattern (vue_v_html). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d32692e07feaaa1d", "name": "Insecure pattern 'vue_v_html' in src/views/CollectionView.vue:334", "shortDescription": {"text": "Insecure pattern 'vue_v_html' in src/views/CollectionView.vue:334"}, "fullDescription": {"text": "Found a known-risky pattern (vue_v_html). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-27924aa79fa4a517", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/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-46c644c6227e4d4a", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/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-1838a141491ce38c", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-42e7c69f6b405939", "name": "Very large file: src/stores/gameStore.ts (1868 lines)", "shortDescription": {"text": "Very large file: src/stores/gameStore.ts (1868 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 598 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-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-11811b011f86d9a3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/setupSqlExec.ts:36", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/setupSqlExec.ts:36"}, "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-4ffcebe8b424f0c9", "name": "Network/subprocess call without timeout or try/except \u2014 scripts/analyze_card_types.py:55", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/analyze_card_types.py:55"}, "fullDescription": {"text": "`requests.get(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9ff22201383e0b33", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/migrateDatabaseHttp.ts:190", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/migrateDatabaseHttp.ts:190"}, "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-362f1464b502681a", "name": "Commented-code block (5 lines) in scripts/extractIllustrations.ts:23", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/extractIllustrations.ts:23"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-841e81874307fe67", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/stores/cardStore.ts:190", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/stores/cardStore.ts:190"}, "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-19d06c85d85dd6ae", "name": "Commented-code block (5 lines) in src/game/rules/types.ts:57", "shortDescription": {"text": "Commented-code block (5 lines) in src/game/rules/types.ts:57"}, "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-bac9bd0bfa10b6e9", "name": "Commented-code block (5 lines) in src/game/engine/authority.ts:102", "shortDescription": {"text": "Commented-code block (5 lines) in src/game/engine/authority.ts:102"}, "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-d1e25e6bc47a52fb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/services/collectionFileService.ts:44", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/services/collectionFileService.ts:44"}, "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-9e12a73ed1b17ca1", "name": "Commented-code block (5 lines) in src/validators/deck.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in src/validators/deck.ts:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-022e6399d1ef2beb", "name": "12 env vars used in code but missing from .env.example", "shortDescription": {"text": "12 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `BASE_URL`, `CI`, `DEV`, `FIRECRAWL_API_KEY`, `NODE_ENV`, `PG_DATABASE`, `PG_HOST`, `PG_PASSWORD` + 4 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0f8a15ae99807950", "name": "Dangling fetch: GET /data/errata.json (src/services/errataService.ts:26)", "shortDescription": {"text": "Dangling fetch: GET /data/errata.json (src/services/errataService.ts:26)"}, "fullDescription": {"text": "`src/services/errataService.ts:26` calls `GET /data/errata.json` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/data/errata.json`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5b9f1737cea80e87", "name": "Dangling fetch: GET /data/${extension}.json (src/services/cardLoader.ts:225)", "shortDescription": {"text": "Dangling fetch: GET /data/${extension}.json (src/services/cardLoader.ts:225)"}, "fullDescription": {"text": "`src/services/cardLoader.ts:225` calls `GET /data/${extension}.json` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/data/<p>.json`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8e93aaeae4459f99", "name": "Dangling fetch: GET /data/community-decks.json (src/services/communityDeckService.ts:40)", "shortDescription": {"text": "Dangling fetch: GET /data/community-decks.json (src/services/communityDeckService.ts:40)"}, "fullDescription": {"text": "`src/services/communityDeckService.ts:40` calls `GET /data/community-decks.json` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/data/community-decks.json`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f24a6cf717da88cf", "name": "Unused endpoint: POST /api/collection/backup", "shortDescription": {"text": "Unused endpoint: POST /api/collection/backup"}, "fullDescription": {"text": "`src/server/index.ts` declares `POST /api/collection/backup` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4895e5e6f245af90", "name": "Unused endpoint: USE /data", "shortDescription": {"text": "Unused endpoint: USE /data"}, "fullDescription": {"text": "`src/server/index.ts` declares `USE /data` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/22941"}, "properties": {"repository": "xairon/wakfu_deck_builder", "repoUrl": "https://github.com/xairon/wakfu_deck_builder", "branch": "main"}, "results": [{"ruleId": "scanner-70dd88d57de5b628", "level": "note", "message": {"text": "Possibly dead Python function: extract_name_and_type"}, "properties": {"repobilityId": "bef90e1000758b43", "scanner": "scanner-primary", "fingerprint": "70dd88d57de5b628", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/analyze_card_types.py:36"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e14f378079a2e57c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 vite.config.ts:15"}, "properties": {"repobilityId": "ab305e17677e589d", "scanner": "scanner-primary", "fingerprint": "e14f378079a2e57c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2c3d59cc13148ef8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/setupSqlExec.ts:10"}, "properties": {"repobilityId": "02811be19512b14b", "scanner": "scanner-primary", "fingerprint": "2c3d59cc13148ef8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1091bd757c1aaa47", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/inspectStore.ts:36"}, "properties": {"repobilityId": "9e62f0464697dc42", "scanner": "scanner-primary", "fingerprint": "1091bd757c1aaa47", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-69944c41e9d6dbad", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrateDatabaseDirect.ts:22"}, "properties": {"repobilityId": "822e0e55c0930f59", "scanner": "scanner-primary", "fingerprint": "69944c41e9d6dbad", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b38eb2fc7262988c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/updateCards.ts:60"}, "properties": {"repobilityId": "e5d6cb2e99c3528c", "scanner": "scanner-primary", "fingerprint": "b38eb2fc7262988c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8122d0defb24dc72", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/parseCards.ts:505"}, "properties": {"repobilityId": "d8956791d9d2e6c3", "scanner": "scanner-primary", "fingerprint": "8122d0defb24dc72", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a8d75ce30238e7b8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/parseCardsV2.ts:629"}, "properties": {"repobilityId": "246143b05c24ff14", "scanner": "scanner-primary", "fingerprint": "a8d75ce30238e7b8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-78ef06f95171198f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/getLogs.js:22"}, "properties": {"repobilityId": "a0f200777dd13c25", "scanner": "scanner-primary", "fingerprint": "78ef06f95171198f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-484b594553cea9a9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrateImages.ts:83"}, "properties": {"repobilityId": "0c4da5f09715aa0d", "scanner": "scanner-primary", "fingerprint": "484b594553cea9a9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1b213ea3c727db45", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrateDatabaseHttp.ts:113"}, "properties": {"repobilityId": "51672f97f042fc9c", "scanner": "scanner-primary", "fingerprint": "1b213ea3c727db45", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-667f5cca7e2380c6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/debugRoute.ts:39"}, "properties": {"repobilityId": "a2b19b0de7ee9595", "scanner": "scanner-primary", "fingerprint": "667f5cca7e2380c6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f31ac18e18097e67", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/checkStructure.js:12"}, "properties": {"repobilityId": "07ca2f333c51d8b1", "scanner": "scanner-primary", "fingerprint": "f31ac18e18097e67", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-834a212a38e5eb59", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/testCardLoading.ts:23"}, "properties": {"repobilityId": "5f3a26b63aefbc5b", "scanner": "scanner-primary", "fingerprint": "834a212a38e5eb59", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2772ea22c14116da", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/checkIds.ts:17"}, "properties": {"repobilityId": "cec31324458e8133", "scanner": "scanner-primary", "fingerprint": "2772ea22c14116da", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f21ec0a56fb0ad7e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test.ts:5"}, "properties": {"repobilityId": "366bd2f243af55e3", "scanner": "scanner-primary", "fingerprint": "f21ec0a56fb0ad7e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c1f5fe2b33331074", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/downloadMissingImages.ts:63"}, "properties": {"repobilityId": "8da3ee97b1f3ea4a", "scanner": "scanner-primary", "fingerprint": "c1f5fe2b33331074", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-43f2fa193c066e94", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/copyAssets.js:26"}, "properties": {"repobilityId": "cd5799d08bed46ea", "scanner": "scanner-primary", "fingerprint": "43f2fa193c066e94", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f5002e3a231dbfc6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generateCleanCards.js:22"}, "properties": {"repobilityId": "3d446b13abe506d2", "scanner": "scanner-primary", "fingerprint": "f5002e3a231dbfc6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-57029829aa370693", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrateDatabaseAdvanced.ts:137"}, "properties": {"repobilityId": "4499c3fa22d614c2", "scanner": "scanner-primary", "fingerprint": "57029829aa370693", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f02ff5b1ee062321", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/auditStarters.ts:146"}, "properties": {"repobilityId": "46a2352189c1c369", "scanner": "scanner-primary", "fingerprint": "f02ff5b1ee062321", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-949991c8d576ac27", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/updateCardIds.ts:43"}, "properties": {"repobilityId": "5b9209c9bece09e2", "scanner": "scanner-primary", "fingerprint": "949991c8d576ac27", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9a93b065cf8bd2f2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/analyzeTypes.ts:192"}, "properties": {"repobilityId": "f4a9e262e51f5873", "scanner": "scanner-primary", "fingerprint": "9a93b065cf8bd2f2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d4302eb8faa80cd6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/downloadImages.ts:34"}, "properties": {"repobilityId": "f075a3e8eef90b63", "scanner": "scanner-primary", "fingerprint": "d4302eb8faa80cd6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-658eb6f3cb0b2dbe", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/countCards.ts:48"}, "properties": {"repobilityId": "4b90c645930bfdcd", "scanner": "scanner-primary", "fingerprint": "658eb6f3cb0b2dbe", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8fc6702f01e2c4de", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/inspectSupabaseData.ts:21"}, "properties": {"repobilityId": "563800b474897519", "scanner": "scanner-primary", "fingerprint": "8fc6702f01e2c4de", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-39d909dbaa9cb7e0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/downloadImages.js:41"}, "properties": {"repobilityId": "399175208db5914d", "scanner": "scanner-primary", "fingerprint": "39d909dbaa9cb7e0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d79dfd94fb6b8b10", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/compileEffects.ts:294"}, "properties": {"repobilityId": "cda7ff833287a858", "scanner": "scanner-primary", "fingerprint": "d79dfd94fb6b8b10", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8316fdacc61e3b1e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/checkAuthStatus.ts:24"}, "properties": {"repobilityId": "0b82959e518b7b16", "scanner": "scanner-primary", "fingerprint": "8316fdacc61e3b1e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ec6f75c9f11112a5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/downloadSpecificImages.ts:70"}, "properties": {"repobilityId": "57a78c9b5246404c", "scanner": "scanner-primary", "fingerprint": "ec6f75c9f11112a5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7f4df6858bea2e82", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/updateCards.js:19"}, "properties": {"repobilityId": "486d1167df7c710b", "scanner": "scanner-primary", "fingerprint": "7f4df6858bea2e82", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-03e6f40b877e4c74", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/downloadPages.ts:87"}, "properties": {"repobilityId": "91308c4c7e965a79", "scanner": "scanner-primary", "fingerprint": "03e6f40b877e4c74", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-80c8d6d2d135a9cc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/checkCards.ts:35"}, "properties": {"repobilityId": "ca2c85b23dd086d6", "scanner": "scanner-primary", "fingerprint": "80c8d6d2d135a9cc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-178dfc1a255c4c38", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/countExpectedImages.ts:37"}, "properties": {"repobilityId": "7b08004785de229b", "scanner": "scanner-primary", "fingerprint": "178dfc1a255c4c38", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-982b44d8be9d581c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/extractIllustrations.ts:88"}, "properties": {"repobilityId": "ba26134eb87f447e", "scanner": "scanner-primary", "fingerprint": "982b44d8be9d581c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0a757cb6c0e4f4e0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/optimizeImages.ts:80"}, "properties": {"repobilityId": "f567abe45da00a83", "scanner": "scanner-primary", "fingerprint": "0a757cb6c0e4f4e0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6854d4bce5bb367d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/checkTables.ts:8"}, "properties": {"repobilityId": "41bd6af88d0ad853", "scanner": "scanner-primary", "fingerprint": "6854d4bce5bb367d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f4afef3175a2a54f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/analyzeCardStructure.ts:144"}, "properties": {"repobilityId": "0714057e287fe900", "scanner": "scanner-primary", "fingerprint": "f4afef3175a2a54f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fa9e40cc02c17528", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/cardWorker.js:16"}, "properties": {"repobilityId": "feaae3e5316c7378", "scanner": "scanner-primary", "fingerprint": "fa9e40cc02c17528", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b994bbceeb7e0713", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrateDatabase.ts:85"}, "properties": {"repobilityId": "4511145e15e85d1f", "scanner": "scanner-primary", "fingerprint": "b994bbceeb7e0713", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6be3fe2f37feae82", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/validateData.ts:159"}, "properties": {"repobilityId": "580f8a8bdcb3d162", "scanner": "scanner-primary", "fingerprint": "6be3fe2f37feae82", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d59ce18cbb7a5585", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/testSupabaseSync.ts:21"}, "properties": {"repobilityId": "83dde1babbe2342b", "scanner": "scanner-primary", "fingerprint": "d59ce18cbb7a5585", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-591216cda526cb34", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/cards/CardDetailModal.vue:227"}, "properties": {"repobilityId": "743723f7a74e4791", "scanner": "scanner-primary", "fingerprint": "591216cda526cb34", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-dbfaa5cee90a418d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/server/index.ts:19"}, "properties": {"repobilityId": "cc5d38780f9577eb", "scanner": "scanner-primary", "fingerprint": "dbfaa5cee90a418d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-24dee4af4d80df40", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/parser/index.ts:126"}, "properties": {"repobilityId": "4a2ee74fcbd83c82", "scanner": "scanner-primary", "fingerprint": "24dee4af4d80df40", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c1174eb1ac80a829", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/parser/hero.ts:3"}, "properties": {"repobilityId": "bd4ce9704a6feca3", "scanner": "scanner-primary", "fingerprint": "c1174eb1ac80a829", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-627d6a565e787c4f", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/views/CardDetailsView.vue:199"}, "properties": {"repobilityId": "d7dcbff54aaf7147", "scanner": "scanner-primary", "fingerprint": "627d6a565e787c4f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-b371e0029a0206eb", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/getLogs.js:8"}, "properties": {"repobilityId": "89370bddec0db3cd", "scanner": "scanner-primary", "fingerprint": "b371e0029a0206eb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/getLogs.js"}, "region": {"startLine": 8}}}]}, {"ruleId": "scanner-10f0e83d6568f6ed", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/_shared/cors.ts:3"}, "properties": {"repobilityId": "7c8e268f4e944077", "scanner": "scanner-primary", "fingerprint": "10f0e83d6568f6ed", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/_shared/cors.ts"}, "region": {"startLine": 3}}}]}, {"ruleId": "scanner-3fab7843c5294ce9", "level": "error", "message": {"text": "Possible secret in src/stores/__tests__/authStore.spec.ts"}, "properties": {"repobilityId": "00b1b9cc4704e2a3", "scanner": "scanner-primary", "fingerprint": "3fab7843c5294ce9", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/stores/__tests__/authStore.spec.ts"}, "region": {"startLine": 123}}}]}, {"ruleId": "scanner-3fab7843c5294ce9", "level": "error", "message": {"text": "Possible secret in src/stores/__tests__/authStore.spec.ts"}, "properties": {"repobilityId": "00b1b9cc4704e2a3", "scanner": "scanner-primary", "fingerprint": "3fab7843c5294ce9", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/stores/__tests__/authStore.spec.ts"}, "region": {"startLine": 151}}}]}, {"ruleId": "scanner-9c96ef9b6aee608d", "level": "warning", "message": {"text": "Insecure pattern 'vue_v_html' in src/components/card/CardZoomModal.vue:79"}, "properties": {"repobilityId": "fec12adc1416ebeb", "scanner": "scanner-primary", "fingerprint": "9c96ef9b6aee608d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "vue_v_html"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/card/CardZoomModal.vue"}, "region": {"startLine": 79}}}]}, {"ruleId": "scanner-d32692e07feaaa1d", "level": "warning", "message": {"text": "Insecure pattern 'vue_v_html' in src/views/CollectionView.vue:334"}, "properties": {"repobilityId": "cddfd39cd640d79e", "scanner": "scanner-primary", "fingerprint": "d32692e07feaaa1d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "vue_v_html"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/views/CollectionView.vue"}, "region": {"startLine": 334}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ae16880318b99912", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 19}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "989a74409a402368", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ae16880318b99912", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 41}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "989a74409a402368", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 44}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "bd7f3c1c34d83159", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 56}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ae16880318b99912", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 68}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "989a74409a402368", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 71}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "bd7f3c1c34d83159", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 89}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ae16880318b99912", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 101}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "989a74409a402368", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 104}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "bd7f3c1c34d83159", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 116}}}]}, {"ruleId": "scanner-46c644c6227e4d4a", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "2644034c718fb80d", "scanner": "scanner-primary", "fingerprint": "46c644c6227e4d4a", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release.yml"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-46c644c6227e4d4a", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "eeb76410cc935c30", "scanner": "scanner-primary", "fingerprint": "46c644c6227e4d4a", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release.yml"}, "region": {"startLine": 24}}}]}, {"ruleId": "scanner-46c644c6227e4d4a", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "2644034c718fb80d", "scanner": "scanner-primary", "fingerprint": "46c644c6227e4d4a", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release.yml"}, "region": {"startLine": 40}}}]}, {"ruleId": "scanner-46c644c6227e4d4a", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "eeb76410cc935c30", "scanner": "scanner-primary", "fingerprint": "46c644c6227e4d4a", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release.yml"}, "region": {"startLine": 43}}}]}, {"ruleId": "scanner-46c644c6227e4d4a", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "2644034c718fb80d", "scanner": "scanner-primary", "fingerprint": "46c644c6227e4d4a", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release.yml"}, "region": {"startLine": 59}}}]}, {"ruleId": "scanner-46c644c6227e4d4a", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "eeb76410cc935c30", "scanner": "scanner-primary", "fingerprint": "46c644c6227e4d4a", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release.yml"}, "region": {"startLine": 62}}}]}, {"ruleId": "scanner-46c644c6227e4d4a", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "2644034c718fb80d", "scanner": "scanner-primary", "fingerprint": "46c644c6227e4d4a", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release.yml"}, "region": {"startLine": 79}}}]}, {"ruleId": "scanner-46c644c6227e4d4a", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "eeb76410cc935c30", "scanner": "scanner-primary", "fingerprint": "46c644c6227e4d4a", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release.yml"}, "region": {"startLine": 82}}}]}, {"ruleId": "scanner-46c644c6227e4d4a", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "9e54fac6c290138e", "scanner": "scanner-primary", "fingerprint": "46c644c6227e4d4a", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release.yml"}, "region": {"startLine": 88}}}]}, {"ruleId": "scanner-46c644c6227e4d4a", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "b8d11574406cfe94", "scanner": "scanner-primary", "fingerprint": "46c644c6227e4d4a", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release.yml"}, "region": {"startLine": 94}}}]}, {"ruleId": "scanner-1838a141491ce38c", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "b8fd4f5048f96576", "scanner": "scanner-primary", "fingerprint": "1838a141491ce38c", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-42e7c69f6b405939", "level": "note", "message": {"text": "Very large file: src/stores/gameStore.ts (1868 lines)"}, "properties": {"repobilityId": "4e21b3fb02e0e947", "scanner": "scanner-primary", "fingerprint": "42e7c69f6b405939", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "dbe4d92361bdc66b", "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": "74700a90ca851faf", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "1184f2a730b4c6fa", "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": "d75b3df7459ee881", "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": "59bb504a645634bf", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-11811b011f86d9a3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/setupSqlExec.ts:36"}, "properties": {"repobilityId": "c4cafa69338d4193", "scanner": "scanner-primary", "fingerprint": "11811b011f86d9a3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4ffcebe8b424f0c9", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/analyze_card_types.py:55"}, "properties": {"repobilityId": "33ee29dafd1eba28", "scanner": "scanner-primary", "fingerprint": "4ffcebe8b424f0c9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9ff22201383e0b33", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/migrateDatabaseHttp.ts:190"}, "properties": {"repobilityId": "fa2bd023303c7e81", "scanner": "scanner-primary", "fingerprint": "9ff22201383e0b33", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-362f1464b502681a", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/extractIllustrations.ts:23"}, "properties": {"repobilityId": "0d05dccb8bcadd85", "scanner": "scanner-primary", "fingerprint": "362f1464b502681a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-841e81874307fe67", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/stores/cardStore.ts:190"}, "properties": {"repobilityId": "bfd8890fcb581769", "scanner": "scanner-primary", "fingerprint": "841e81874307fe67", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-19d06c85d85dd6ae", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/game/rules/types.ts:57"}, "properties": {"repobilityId": "a411ba44c8499c1e", "scanner": "scanner-primary", "fingerprint": "19d06c85d85dd6ae", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bac9bd0bfa10b6e9", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/game/engine/authority.ts:102"}, "properties": {"repobilityId": "424e94ec0c0e4452", "scanner": "scanner-primary", "fingerprint": "bac9bd0bfa10b6e9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d1e25e6bc47a52fb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/services/collectionFileService.ts:44"}, "properties": {"repobilityId": "add56099a324b37b", "scanner": "scanner-primary", "fingerprint": "d1e25e6bc47a52fb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9e12a73ed1b17ca1", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/validators/deck.ts:5"}, "properties": {"repobilityId": "db816bf831153ef0", "scanner": "scanner-primary", "fingerprint": "9e12a73ed1b17ca1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-022e6399d1ef2beb", "level": "note", "message": {"text": "12 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "7bf4178327da75a2", "scanner": "scanner-primary", "fingerprint": "022e6399d1ef2beb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-0f8a15ae99807950", "level": "error", "message": {"text": "Dangling fetch: GET /data/errata.json (src/services/errataService.ts:26)"}, "properties": {"repobilityId": "f801912bf33e14c4", "scanner": "scanner-primary", "fingerprint": "0f8a15ae99807950", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5b9f1737cea80e87", "level": "error", "message": {"text": "Dangling fetch: GET /data/${extension}.json (src/services/cardLoader.ts:225)"}, "properties": {"repobilityId": "6aefa8d4e7687b5b", "scanner": "scanner-primary", "fingerprint": "5b9f1737cea80e87", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8e93aaeae4459f99", "level": "error", "message": {"text": "Dangling fetch: GET /data/community-decks.json (src/services/communityDeckService.ts:40)"}, "properties": {"repobilityId": "8bd2cf76b16c6bd9", "scanner": "scanner-primary", "fingerprint": "8e93aaeae4459f99", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f24a6cf717da88cf", "level": "note", "message": {"text": "Unused endpoint: POST /api/collection/backup"}, "properties": {"repobilityId": "bbab714d84829f92", "scanner": "scanner-primary", "fingerprint": "f24a6cf717da88cf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4895e5e6f245af90", "level": "note", "message": {"text": "Unused endpoint: USE /data"}, "properties": {"repobilityId": "c5e12ebf8a586952", "scanner": "scanner-primary", "fingerprint": "4895e5e6f245af90", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}