{"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-21138334341a4c78", "name": "Stray `console.log` in TS/JS \u2014 src/App.jsx:871", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/App.jsx:871"}, "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-bc0c91a8bad4a951", "name": "TODO/FIXME marker in shipping code \u2014 src/utils/saveCanvas.js:19", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/utils/saveCanvas.js:19"}, "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-196f0816998a1234", "name": "Stray `console.log` in TS/JS \u2014 src/utils/textStream.js:506", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/textStream.js:506"}, "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-d5363d92614cab3b", "name": "Icon-only button without accessible name \u2014 src/components/modals/AttributeModal.jsx:104", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/modals/AttributeModal.jsx:104"}, "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-ee3bd494cf688abb", "name": "TODO/FIXME marker in shipping code \u2014 src/components/home/HomePage.jsx:559", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/components/home/HomePage.jsx:559"}, "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-45ccf9bccc006e88", "name": "Icon-only button without accessible name \u2014 src/components/train/BattleDayView.jsx:218", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/train/BattleDayView.jsx:218"}, "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-4f50aec9ee1b5066", "name": "Icon-only button without accessible name \u2014 src/components/train/ComboMachine.jsx:629", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/train/ComboMachine.jsx:629"}, "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-986c59c2c670e721", "name": "Icon-only button without accessible name \u2014 Documents/MovesBook/v4-backup/src/components/modals/AttributeModal.jsx:110", "shortDescription": {"text": "Icon-only button without accessible name \u2014 Documents/MovesBook/v4-backup/src/components/modals/AttributeModal.jsx:110"}, "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-e33135f91f95d265", "name": "Icon-only button without accessible name \u2014 Documents/MovesBook/v4-backup/src/components/train/BattleDayView.jsx:204", "shortDescription": {"text": "Icon-only button without accessible name \u2014 Documents/MovesBook/v4-backup/src/components/train/BattleDayView.jsx:204"}, "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-a96b782d1d76167c", "name": "Icon-only button without accessible name \u2014 Documents/MovesBook/v4-backup/src/components/train/ComboMachine.jsx:624", "shortDescription": {"text": "Icon-only button without accessible name \u2014 Documents/MovesBook/v4-backup/src/components/train/ComboMachine.jsx:624"}, "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-65da7e3f10a09880", "name": "Possible secret in index_prod_2026_3_16_tablet.html", "shortDescription": {"text": "Possible secret in index_prod_2026_3_16_tablet.html"}, "fullDescription": {"text": "Detected pattern matching generic_api_key. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-d6fe2c29ba9ec3f6", "name": "Insecure pattern 'direct_innerhtml_assignment' in index_prod_2026_3_16_tablet.html:130", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in index_prod_2026_3_16_tablet.html:130"}, "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-945f526f5d2eb82e", "name": "Possible secret in index_prod_2026_03_17.html", "shortDescription": {"text": "Possible secret in index_prod_2026_03_17.html"}, "fullDescription": {"text": "Detected pattern matching generic_api_key. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-fd1bbc31a57afa6a", "name": "Insecure pattern 'direct_innerhtml_assignment' in index_prod_2026_03_17.html:106", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in index_prod_2026_03_17.html:106"}, "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-8002c4c690c24d5d", "name": "Possible secret in index_language_2026_03_16.html", "shortDescription": {"text": "Possible secret in index_language_2026_03_16.html"}, "fullDescription": {"text": "Detected pattern matching generic_api_key. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-52a41d260aff3ef7", "name": "Insecure pattern 'direct_innerhtml_assignment' in index_language_2026_03_16.html:107", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in index_language_2026_03_16.html:107"}, "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-fe94e2e3a742b3a8", "name": "Insecure pattern 'direct_innerhtml_assignment' in index.html:138", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in index.html:138"}, "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-39f7b50a07adcf61", "name": "Insecure pattern 'local_storage_auth_token' in index.html:257", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in index.html:257"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1d61bab2ac52f324", "name": "Possible secret in index-dev_v1_firestore_config.html", "shortDescription": {"text": "Possible secret in index-dev_v1_firestore_config.html"}, "fullDescription": {"text": "Detected pattern matching generic_api_key. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-f3eb937a1c953e4e", "name": "Insecure pattern 'direct_innerhtml_assignment' in index-dev_v1_firestore_config.html:111", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in index-dev_v1_firestore_config.html:111"}, "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-403a7bb49d0a4046", "name": "Possible secret in index_prod_2026_3_15.html", "shortDescription": {"text": "Possible secret in index_prod_2026_3_15.html"}, "fullDescription": {"text": "Detected pattern matching generic_api_key. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-a898a76281924032", "name": "Insecure pattern 'direct_innerhtml_assignment' in index_prod_2026_3_15.html:106", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in index_prod_2026_3_15.html:106"}, "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-995106299af532c0", "name": "Possible secret in index.original.html", "shortDescription": {"text": "Possible secret in index.original.html"}, "fullDescription": {"text": "Detected pattern matching generic_api_key. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-fba62dba3dee81d8", "name": "Insecure pattern 'direct_innerhtml_assignment' in index.original.html:111", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in index.original.html:111"}, "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-2f8a7e1beb877b48", "name": "Possible secret in Documents/MovesBook/v4-backup/index.html", "shortDescription": {"text": "Possible secret in Documents/MovesBook/v4-backup/index.html"}, "fullDescription": {"text": "Detected pattern matching generic_api_key. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-faa4ae6fba9a5791", "name": "Insecure pattern 'direct_innerhtml_assignment' in Documents/MovesBook/v4-backup/index.html:115", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in Documents/MovesBook/v4-backup/index.html:115"}, "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-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-34146f699c38c542", "name": "Very large file: backups/2026-03-25-cleanup/translations.js (3175 lines)", "shortDescription": {"text": "Very large file: backups/2026-03-25-cleanup/translations.js (3175 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-da17465495816a7e", "name": "Very large file: src/App.jsx (1835 lines)", "shortDescription": {"text": "Very large file: src/App.jsx (1835 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-668debd947c02cbc", "name": "Very large file: src/constants/manualContent.js (1362 lines)", "shortDescription": {"text": "Very large file: src/constants/manualContent.js (1362 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-18d55cab1f26f5b7", "name": "Very large file: src/utils/textStreamWraps.js (1468 lines)", "shortDescription": {"text": "Very large file: src/utils/textStreamWraps.js (1468 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-aa2e7782ca07b35d", "name": "Very large file: src/components/home/HomePage.jsx (1751 lines)", "shortDescription": {"text": "Very large file: src/components/home/HomePage.jsx (1751 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-55c457e8f0b22655", "name": "Very large file: src/components/battle/CompetitionSimulator.jsx (1385 lines)", "shortDescription": {"text": "Very large file: src/components/battle/CompetitionSimulator.jsx (1385 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-88b6713d149be25b", "name": "Very large file: src/components/train/Sparring.jsx (1242 lines)", "shortDescription": {"text": "Very large file: src/components/train/Sparring.jsx (1242 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-0877728726d350fc", "name": "Very large file: src/components/train/BattlePrepPage.jsx (1054 lines)", "shortDescription": {"text": "Very large file: src/components/train/BattlePrepPage.jsx (1054 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-33eb4082b81e7167", "name": "Very large file: src/components/train/Spar1v1.jsx (1080 lines)", "shortDescription": {"text": "Very large file: src/components/train/Spar1v1.jsx (1080 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-78f9ccaf17b01bc0", "name": "Very large file: Documents/MovesBook/v4-backup/src/constants/translations.js (12654 lines)", "shortDescription": {"text": "Very large file: Documents/MovesBook/v4-backup/src/constants/translations.js (12654 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-01f229df607d856c", "name": "Very large file: Documents/MovesBook/v4-backup/src/components/battle/CompetitionSimulator.jsx (1402 lines)", "shortDescription": {"text": "Very large file: Documents/MovesBook/v4-backup/src/components/battle/CompetitionSimulator.jsx (1402 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-195e80cff1d28027", "name": "Very large file: Documents/MovesBook/v4-backup/src/components/train/Sparring.jsx (1094 lines)", "shortDescription": {"text": "Very large file: Documents/MovesBook/v4-backup/src/components/train/Sparring.jsx (1094 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-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "0 test file(s) for 299 source file(s) (ratio 0.00). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d53e6fc6e96b42a4", "name": "43 TODO/FIXME markers", "shortDescription": {"text": "43 TODO/FIXME markers"}, "fullDescription": {"text": "High count of TODO/FIXME/HACK markers \u2014 track them as issues so they're not forgotten."}, "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-faccb9061e9b52a0", "name": "No README detected", "shortDescription": {"text": "No README detected"}, "fullDescription": {"text": "No README file was found. Generated repos without README context are hard to operate, validate, or safely hand off."}, "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 34 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 320 placeholder/mock markers across 106 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci, tests, operator-readme. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "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, ci, tests, operator-readme. 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-fa9aef8b7e8c47ff", "name": "Commented-code block (10 lines) in functions/index.js:14", "shortDescription": {"text": "Commented-code block (10 lines) in functions/index.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-be13025ea72b4bed", "name": "`fetch()` without try/.catch or AbortSignal \u2014 files/sw.js:47", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 files/sw.js:47"}, "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-af2bd077e55bdf80", "name": "`fetch()` without try/.catch or AbortSignal \u2014 public/sw.js:47", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 public/sw.js:47"}, "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-2b7f08c895a5b6ba", "name": "Commented-code block (5 lines) in src/App.jsx:325", "shortDescription": {"text": "Commented-code block (5 lines) in src/App.jsx:325"}, "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-c75fc9c4cb4baea9", "name": "Commented-code block (6 lines) in src/constants/textStreamCategories.js:128", "shortDescription": {"text": "Commented-code block (6 lines) in src/constants/textStreamCategories.js:128"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7730e2a390b20435", "name": "Commented-code block (7 lines) in src/utils/textStream.js:260", "shortDescription": {"text": "Commented-code block (7 lines) in src/utils/textStream.js:260"}, "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-2dbbe1ff7c7f3427", "name": "Commented-code block (5 lines) in src/utils/textStreamWraps.js:63", "shortDescription": {"text": "Commented-code block (5 lines) in src/utils/textStreamWraps.js:63"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3ab02adc354d8a6b", "name": "Commented-code block (6 lines) in src/utils/reportEngine.js:306", "shortDescription": {"text": "Commented-code block (6 lines) in src/utils/reportEngine.js:306"}, "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-fca43223e957f0c5", "name": "Commented-code block (5 lines) in src/components/shared/ArcVis.jsx:80", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/shared/ArcVis.jsx:80"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c342971d3d5af502", "name": "Commented-code block (6 lines) in src/components/shared/ErrorBoundary.jsx:4", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/shared/ErrorBoundary.jsx: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-08866dc4d987fc23", "name": "Commented-code block (6 lines) in src/components/home/DaySections.jsx:138", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/home/DaySections.jsx:138"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-20092dd138e0cd2a", "name": "Commented-code block (5 lines) in src/components/moves/WIPPage.jsx:142", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/moves/WIPPage.jsx:142"}, "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-2f7d53248d566bd4", "name": "Commented-code block (14 lines) in src/components/moves/MoveRow.jsx:11", "shortDescription": {"text": "Commented-code block (14 lines) in src/components/moves/MoveRow.jsx:11"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cccff6d2584cc7d0", "name": "Commented-code block (6 lines) in src/components/moves/map/ToTryListView.jsx:8", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/moves/map/ToTryListView.jsx:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-602bd2efcedc3529", "name": "Commented-code block (6 lines) in src/components/moves/map/SavedVariationsSheet.jsx:8", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/moves/map/SavedVariationsSheet.jsx:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-999461d2c6d77ab2", "name": "Commented-code block (5 lines) in src/components/moves/map/AtlasView.jsx:10", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/moves/map/AtlasView.jsx:10"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cf46aeded76f9795", "name": "Commented-code block (5 lines) in src/components/battle/RivalsPage.jsx:132", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/battle/RivalsPage.jsx:132"}, "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-9216192105398447", "name": "Commented-code block (5 lines) in src/components/train/BattleDayView.jsx:22", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/train/BattleDayView.jsx:22"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b70a0f3329882c8c", "name": "Commented-code block (5 lines) in src/components/train/Spar1v1ShareCard.jsx:27", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/train/Spar1v1ShareCard.jsx:27"}, "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-650a598e54090e3b", "name": "Legacy-named symbol `ph_legacy` in src/components/train/battlePrepHelpers.js:165", "shortDescription": {"text": "Legacy-named symbol `ph_legacy` in src/components/train/battlePrepHelpers.js:165"}, "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-4c2bffb34fb57c11", "name": "Commented-code block (10 lines) in src/components/train/battlePrepHelpers.js:138", "shortDescription": {"text": "Commented-code block (10 lines) in src/components/train/battlePrepHelpers.js:138"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-58e63c5fdfabd564", "name": "Legacy-named symbol `isLegacy` in src/components/train/GoalModal.jsx:31", "shortDescription": {"text": "Legacy-named symbol `isLegacy` in src/components/train/GoalModal.jsx:31"}, "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-b334d875f2339fa1", "name": "5 env vars used in code but missing from .env.example", "shortDescription": {"text": "5 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `DEV`, `MB_BASE`, `NODE_ENV`, `VITE_MB_TEST_EMAIL`, `VITE_MB_TEST_PASSWORD`. 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}}]}}, "automationDetails": {"id": "repobility/19025"}, "properties": {"repository": "sbreppez/MOVESBOOK-dev", "repoUrl": "https://github.com/sbreppez/MOVESBOOK-dev", "branch": "main"}, "results": [{"ruleId": "scanner-21138334341a4c78", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/App.jsx:871"}, "properties": {"repobilityId": "04de5bf5c80ff75c", "scanner": "scanner-primary", "fingerprint": "21138334341a4c78", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bc0c91a8bad4a951", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/utils/saveCanvas.js:19"}, "properties": {"repobilityId": "8c407d2902d3931d", "scanner": "scanner-primary", "fingerprint": "bc0c91a8bad4a951", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-196f0816998a1234", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/textStream.js:506"}, "properties": {"repobilityId": "ae207362b0902b48", "scanner": "scanner-primary", "fingerprint": "196f0816998a1234", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d5363d92614cab3b", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/modals/AttributeModal.jsx:104"}, "properties": {"repobilityId": "381cc928004b904b", "scanner": "scanner-primary", "fingerprint": "d5363d92614cab3b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-ee3bd494cf688abb", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/components/home/HomePage.jsx:559"}, "properties": {"repobilityId": "5e0f7220fc89c816", "scanner": "scanner-primary", "fingerprint": "ee3bd494cf688abb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-45ccf9bccc006e88", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/train/BattleDayView.jsx:218"}, "properties": {"repobilityId": "119cfe31d412cb1a", "scanner": "scanner-primary", "fingerprint": "45ccf9bccc006e88", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-4f50aec9ee1b5066", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/train/ComboMachine.jsx:629"}, "properties": {"repobilityId": "978d73df83b3e489", "scanner": "scanner-primary", "fingerprint": "4f50aec9ee1b5066", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-986c59c2c670e721", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 Documents/MovesBook/v4-backup/src/components/modals/AttributeModal.jsx:110"}, "properties": {"repobilityId": "bd2d7ab2999317f4", "scanner": "scanner-primary", "fingerprint": "986c59c2c670e721", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-e33135f91f95d265", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 Documents/MovesBook/v4-backup/src/components/train/BattleDayView.jsx:204"}, "properties": {"repobilityId": "f4d576dd9d1f9f9a", "scanner": "scanner-primary", "fingerprint": "e33135f91f95d265", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-a96b782d1d76167c", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 Documents/MovesBook/v4-backup/src/components/train/ComboMachine.jsx:624"}, "properties": {"repobilityId": "7b02174a6f11e14e", "scanner": "scanner-primary", "fingerprint": "a96b782d1d76167c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-65da7e3f10a09880", "level": "error", "message": {"text": "Possible secret in index_prod_2026_3_16_tablet.html"}, "properties": {"repobilityId": "22b1f7a9389e8585", "scanner": "scanner-primary", "fingerprint": "65da7e3f10a09880", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "index_prod_2026_3_16_tablet.html"}, "region": {"startLine": 59}}}]}, {"ruleId": "scanner-d6fe2c29ba9ec3f6", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in index_prod_2026_3_16_tablet.html:130"}, "properties": {"repobilityId": "0caff598bc4184f7", "scanner": "scanner-primary", "fingerprint": "d6fe2c29ba9ec3f6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "index_prod_2026_3_16_tablet.html"}, "region": {"startLine": 130}}}]}, {"ruleId": "scanner-945f526f5d2eb82e", "level": "error", "message": {"text": "Possible secret in index_prod_2026_03_17.html"}, "properties": {"repobilityId": "10aefa6a56bdf467", "scanner": "scanner-primary", "fingerprint": "945f526f5d2eb82e", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "index_prod_2026_03_17.html"}, "region": {"startLine": 35}}}]}, {"ruleId": "scanner-fd1bbc31a57afa6a", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in index_prod_2026_03_17.html:106"}, "properties": {"repobilityId": "0a545c8ec08e3d51", "scanner": "scanner-primary", "fingerprint": "fd1bbc31a57afa6a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "index_prod_2026_03_17.html"}, "region": {"startLine": 106}}}]}, {"ruleId": "scanner-8002c4c690c24d5d", "level": "error", "message": {"text": "Possible secret in index_language_2026_03_16.html"}, "properties": {"repobilityId": "80c0a12be4021d2b", "scanner": "scanner-primary", "fingerprint": "8002c4c690c24d5d", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "index_language_2026_03_16.html"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-8002c4c690c24d5d", "level": "error", "message": {"text": "Possible secret in index_language_2026_03_16.html"}, "properties": {"repobilityId": "6f3b4ec2aaa4f0fc", "scanner": "scanner-primary", "fingerprint": "8002c4c690c24d5d", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "index_language_2026_03_16.html"}, "region": {"startLine": 422}}}]}, {"ruleId": "scanner-8002c4c690c24d5d", "level": "error", "message": {"text": "Possible secret in index_language_2026_03_16.html"}, "properties": {"repobilityId": "6f3b4ec2aaa4f0fc", "scanner": "scanner-primary", "fingerprint": "8002c4c690c24d5d", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "index_language_2026_03_16.html"}, "region": {"startLine": 641}}}]}, {"ruleId": "scanner-8002c4c690c24d5d", "level": "error", "message": {"text": "Possible secret in index_language_2026_03_16.html"}, "properties": {"repobilityId": "6f3b4ec2aaa4f0fc", "scanner": "scanner-primary", "fingerprint": "8002c4c690c24d5d", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "index_language_2026_03_16.html"}, "region": {"startLine": 860}}}]}, {"ruleId": "scanner-8002c4c690c24d5d", "level": "error", "message": {"text": "Possible secret in index_language_2026_03_16.html"}, "properties": {"repobilityId": "6f3b4ec2aaa4f0fc", "scanner": "scanner-primary", "fingerprint": "8002c4c690c24d5d", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "index_language_2026_03_16.html"}, "region": {"startLine": 1079}}}]}, {"ruleId": "scanner-8002c4c690c24d5d", "level": "error", "message": {"text": "Possible secret in index_language_2026_03_16.html"}, "properties": {"repobilityId": "6f3b4ec2aaa4f0fc", "scanner": "scanner-primary", "fingerprint": "8002c4c690c24d5d", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "index_language_2026_03_16.html"}, "region": {"startLine": 1298}}}]}, {"ruleId": "scanner-8002c4c690c24d5d", "level": "error", "message": {"text": "Possible secret in index_language_2026_03_16.html"}, "properties": {"repobilityId": "6f3b4ec2aaa4f0fc", "scanner": "scanner-primary", "fingerprint": "8002c4c690c24d5d", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "index_language_2026_03_16.html"}, "region": {"startLine": 1517}}}]}, {"ruleId": "scanner-8002c4c690c24d5d", "level": "error", "message": {"text": "Possible secret in index_language_2026_03_16.html"}, "properties": {"repobilityId": "6f3b4ec2aaa4f0fc", "scanner": "scanner-primary", "fingerprint": "8002c4c690c24d5d", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "index_language_2026_03_16.html"}, "region": {"startLine": 1736}}}]}, {"ruleId": "scanner-52a41d260aff3ef7", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in index_language_2026_03_16.html:107"}, "properties": {"repobilityId": "fa0e506fc49e6542", "scanner": "scanner-primary", "fingerprint": "52a41d260aff3ef7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "index_language_2026_03_16.html"}, "region": {"startLine": 107}}}]}, {"ruleId": "scanner-fe94e2e3a742b3a8", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in index.html:138"}, "properties": {"repobilityId": "f91708437a3a5445", "scanner": "scanner-primary", "fingerprint": "fe94e2e3a742b3a8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "index.html"}, "region": {"startLine": 138}}}]}, {"ruleId": "scanner-39f7b50a07adcf61", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in index.html:257"}, "properties": {"repobilityId": "8f2a167064b03ceb", "scanner": "scanner-primary", "fingerprint": "39f7b50a07adcf61", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "index.html"}, "region": {"startLine": 257}}}]}, {"ruleId": "scanner-1d61bab2ac52f324", "level": "error", "message": {"text": "Possible secret in index-dev_v1_firestore_config.html"}, "properties": {"repobilityId": "6b1a8fb9ab4fff91", "scanner": "scanner-primary", "fingerprint": "1d61bab2ac52f324", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "index-dev_v1_firestore_config.html"}, "region": {"startLine": 39}}}]}, {"ruleId": "scanner-f3eb937a1c953e4e", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in index-dev_v1_firestore_config.html:111"}, "properties": {"repobilityId": "d8e9a9317100d22e", "scanner": "scanner-primary", "fingerprint": "f3eb937a1c953e4e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "index-dev_v1_firestore_config.html"}, "region": {"startLine": 111}}}]}, {"ruleId": "scanner-403a7bb49d0a4046", "level": "error", "message": {"text": "Possible secret in index_prod_2026_3_15.html"}, "properties": {"repobilityId": "f7b68fd9f47d2365", "scanner": "scanner-primary", "fingerprint": "403a7bb49d0a4046", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "index_prod_2026_3_15.html"}, "region": {"startLine": 35}}}]}, {"ruleId": "scanner-a898a76281924032", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in index_prod_2026_3_15.html:106"}, "properties": {"repobilityId": "e82d842f35550043", "scanner": "scanner-primary", "fingerprint": "a898a76281924032", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "index_prod_2026_3_15.html"}, "region": {"startLine": 106}}}]}, {"ruleId": "scanner-995106299af532c0", "level": "error", "message": {"text": "Possible secret in index.original.html"}, "properties": {"repobilityId": "523624cb7a26da3d", "scanner": "scanner-primary", "fingerprint": "995106299af532c0", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "index.original.html"}, "region": {"startLine": 39}}}]}, {"ruleId": "scanner-fba62dba3dee81d8", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in index.original.html:111"}, "properties": {"repobilityId": "f3ca5c651311a375", "scanner": "scanner-primary", "fingerprint": "fba62dba3dee81d8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "index.original.html"}, "region": {"startLine": 111}}}]}, {"ruleId": "scanner-2f8a7e1beb877b48", "level": "error", "message": {"text": "Possible secret in Documents/MovesBook/v4-backup/index.html"}, "properties": {"repobilityId": "6687508c2cc75d41", "scanner": "scanner-primary", "fingerprint": "2f8a7e1beb877b48", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Documents/MovesBook/v4-backup/index.html"}, "region": {"startLine": 43}}}]}, {"ruleId": "scanner-faa4ae6fba9a5791", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in Documents/MovesBook/v4-backup/index.html:115"}, "properties": {"repobilityId": "0e7387ce1308adf8", "scanner": "scanner-primary", "fingerprint": "faa4ae6fba9a5791", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Documents/MovesBook/v4-backup/index.html"}, "region": {"startLine": 115}}}]}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-34146f699c38c542", "level": "note", "message": {"text": "Very large file: backups/2026-03-25-cleanup/translations.js (3175 lines)"}, "properties": {"repobilityId": "33e9869f94dbbbc2", "scanner": "scanner-primary", "fingerprint": "34146f699c38c542", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-da17465495816a7e", "level": "note", "message": {"text": "Very large file: src/App.jsx (1835 lines)"}, "properties": {"repobilityId": "a59a84e7052cf35b", "scanner": "scanner-primary", "fingerprint": "da17465495816a7e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-668debd947c02cbc", "level": "note", "message": {"text": "Very large file: src/constants/manualContent.js (1362 lines)"}, "properties": {"repobilityId": "698182b1641b17e3", "scanner": "scanner-primary", "fingerprint": "668debd947c02cbc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-18d55cab1f26f5b7", "level": "note", "message": {"text": "Very large file: src/utils/textStreamWraps.js (1468 lines)"}, "properties": {"repobilityId": "c7ade8b6dea298f0", "scanner": "scanner-primary", "fingerprint": "18d55cab1f26f5b7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-aa2e7782ca07b35d", "level": "note", "message": {"text": "Very large file: src/components/home/HomePage.jsx (1751 lines)"}, "properties": {"repobilityId": "15b7aaad2932ea06", "scanner": "scanner-primary", "fingerprint": "aa2e7782ca07b35d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-55c457e8f0b22655", "level": "note", "message": {"text": "Very large file: src/components/battle/CompetitionSimulator.jsx (1385 lines)"}, "properties": {"repobilityId": "60c1319b5c5fca50", "scanner": "scanner-primary", "fingerprint": "55c457e8f0b22655", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-88b6713d149be25b", "level": "note", "message": {"text": "Very large file: src/components/train/Sparring.jsx (1242 lines)"}, "properties": {"repobilityId": "4c1f293d2d1d2daf", "scanner": "scanner-primary", "fingerprint": "88b6713d149be25b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-0877728726d350fc", "level": "note", "message": {"text": "Very large file: src/components/train/BattlePrepPage.jsx (1054 lines)"}, "properties": {"repobilityId": "f875809161cc3cb4", "scanner": "scanner-primary", "fingerprint": "0877728726d350fc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-33eb4082b81e7167", "level": "note", "message": {"text": "Very large file: src/components/train/Spar1v1.jsx (1080 lines)"}, "properties": {"repobilityId": "dfe45df0c82f8429", "scanner": "scanner-primary", "fingerprint": "33eb4082b81e7167", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-78f9ccaf17b01bc0", "level": "note", "message": {"text": "Very large file: Documents/MovesBook/v4-backup/src/constants/translations.js (12654 lines)"}, "properties": {"repobilityId": "0b2e0e712000cbdc", "scanner": "scanner-primary", "fingerprint": "78f9ccaf17b01bc0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-01f229df607d856c", "level": "note", "message": {"text": "Very large file: Documents/MovesBook/v4-backup/src/components/battle/CompetitionSimulator.jsx (1402 lines)"}, "properties": {"repobilityId": "6f89c5be7b50dc64", "scanner": "scanner-primary", "fingerprint": "01f229df607d856c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-195e80cff1d28027", "level": "note", "message": {"text": "Very large file: Documents/MovesBook/v4-backup/src/components/train/Sparring.jsx (1094 lines)"}, "properties": {"repobilityId": "e46065a410b67444", "scanner": "scanner-primary", "fingerprint": "195e80cff1d28027", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-d53e6fc6e96b42a4", "level": "note", "message": {"text": "43 TODO/FIXME markers"}, "properties": {"repobilityId": "4b38c118003e07d2", "scanner": "scanner-primary", "fingerprint": "d53e6fc6e96b42a4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["maintenance"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "1842d142a3b0089f", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-faccb9061e9b52a0", "level": "note", "message": {"text": "No README detected"}, "properties": {"repobilityId": "73ecd717e07e1d05", "scanner": "scanner-primary", "fingerprint": "faccb9061e9b52a0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["docs", "readme", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "e7b0a4a21eade6c7", "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": "e19870bc1db0a8ad", "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": "8359b22f72d8b1fa", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "0546cdf8e46d85d2", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "f84799d808d246e7", "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": "34b440dcb48ee557", "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": "44fe18da5b9bb52b", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-fa9aef8b7e8c47ff", "level": "none", "message": {"text": "Commented-code block (10 lines) in functions/index.js:14"}, "properties": {"repobilityId": "a9ecfb7ea0fd68b8", "scanner": "scanner-primary", "fingerprint": "fa9aef8b7e8c47ff", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-be13025ea72b4bed", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 files/sw.js:47"}, "properties": {"repobilityId": "a583bc78098ddf8a", "scanner": "scanner-primary", "fingerprint": "be13025ea72b4bed", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-af2bd077e55bdf80", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 public/sw.js:47"}, "properties": {"repobilityId": "9eb9f219d704150a", "scanner": "scanner-primary", "fingerprint": "af2bd077e55bdf80", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2b7f08c895a5b6ba", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/App.jsx:325"}, "properties": {"repobilityId": "e935ed3b17995135", "scanner": "scanner-primary", "fingerprint": "2b7f08c895a5b6ba", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c75fc9c4cb4baea9", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/constants/textStreamCategories.js:128"}, "properties": {"repobilityId": "edb07bb205220e2d", "scanner": "scanner-primary", "fingerprint": "c75fc9c4cb4baea9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7730e2a390b20435", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/utils/textStream.js:260"}, "properties": {"repobilityId": "6a72da67859f1228", "scanner": "scanner-primary", "fingerprint": "7730e2a390b20435", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2dbbe1ff7c7f3427", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/utils/textStreamWraps.js:63"}, "properties": {"repobilityId": "a59afa2dcb7253fb", "scanner": "scanner-primary", "fingerprint": "2dbbe1ff7c7f3427", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3ab02adc354d8a6b", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/utils/reportEngine.js:306"}, "properties": {"repobilityId": "6d707949c902d55d", "scanner": "scanner-primary", "fingerprint": "3ab02adc354d8a6b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fca43223e957f0c5", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/shared/ArcVis.jsx:80"}, "properties": {"repobilityId": "09053b16f90d8f1f", "scanner": "scanner-primary", "fingerprint": "fca43223e957f0c5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c342971d3d5af502", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/shared/ErrorBoundary.jsx:4"}, "properties": {"repobilityId": "d307477e29966d2c", "scanner": "scanner-primary", "fingerprint": "c342971d3d5af502", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-08866dc4d987fc23", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/home/DaySections.jsx:138"}, "properties": {"repobilityId": "b605d6e90ae8663c", "scanner": "scanner-primary", "fingerprint": "08866dc4d987fc23", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-20092dd138e0cd2a", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/moves/WIPPage.jsx:142"}, "properties": {"repobilityId": "27cf14ee67fccd24", "scanner": "scanner-primary", "fingerprint": "20092dd138e0cd2a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2f7d53248d566bd4", "level": "none", "message": {"text": "Commented-code block (14 lines) in src/components/moves/MoveRow.jsx:11"}, "properties": {"repobilityId": "2fb4ca93eaa8f017", "scanner": "scanner-primary", "fingerprint": "2f7d53248d566bd4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cccff6d2584cc7d0", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/moves/map/ToTryListView.jsx:8"}, "properties": {"repobilityId": "5a3f62af89cabab7", "scanner": "scanner-primary", "fingerprint": "cccff6d2584cc7d0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-602bd2efcedc3529", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/moves/map/SavedVariationsSheet.jsx:8"}, "properties": {"repobilityId": "79e3bd0ea528ddad", "scanner": "scanner-primary", "fingerprint": "602bd2efcedc3529", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-999461d2c6d77ab2", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/moves/map/AtlasView.jsx:10"}, "properties": {"repobilityId": "150ec7a782ab2bf4", "scanner": "scanner-primary", "fingerprint": "999461d2c6d77ab2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cf46aeded76f9795", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/battle/RivalsPage.jsx:132"}, "properties": {"repobilityId": "587c9a299f6e85c4", "scanner": "scanner-primary", "fingerprint": "cf46aeded76f9795", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9216192105398447", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/train/BattleDayView.jsx:22"}, "properties": {"repobilityId": "2487996888f9ee8f", "scanner": "scanner-primary", "fingerprint": "9216192105398447", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b70a0f3329882c8c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/train/Spar1v1ShareCard.jsx:27"}, "properties": {"repobilityId": "637f17acac6879a0", "scanner": "scanner-primary", "fingerprint": "b70a0f3329882c8c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-650a598e54090e3b", "level": "note", "message": {"text": "Legacy-named symbol `ph_legacy` in src/components/train/battlePrepHelpers.js:165"}, "properties": {"repobilityId": "bf0c0b6317d2d47d", "scanner": "scanner-primary", "fingerprint": "650a598e54090e3b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-4c2bffb34fb57c11", "level": "none", "message": {"text": "Commented-code block (10 lines) in src/components/train/battlePrepHelpers.js:138"}, "properties": {"repobilityId": "302e1fc029e449fe", "scanner": "scanner-primary", "fingerprint": "4c2bffb34fb57c11", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-58e63c5fdfabd564", "level": "note", "message": {"text": "Legacy-named symbol `isLegacy` in src/components/train/GoalModal.jsx:31"}, "properties": {"repobilityId": "c0b77c6f4ed101f9", "scanner": "scanner-primary", "fingerprint": "58e63c5fdfabd564", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b334d875f2339fa1", "level": "note", "message": {"text": "5 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "faa38682016f5d53", "scanner": "scanner-primary", "fingerprint": "b334d875f2339fa1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}]}]}