{"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-cf4974ffcf323eac", "name": "Stray `console.log` in TS/JS \u2014 scripts/gen-catalog.ts:252", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/gen-catalog.ts:252"}, "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-ad036b77a2759d88", "name": "Icon-only button without accessible name \u2014 src/ui/screens/CityMapScreen.tsx:282", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/screens/CityMapScreen.tsx:282"}, "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-c5479c5e1b6a6a37", "name": "Icon-only button without accessible name \u2014 src/ui/screens/CityMapScreen3D.tsx:3323", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/screens/CityMapScreen3D.tsx:3323"}, "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-c9beede6a2ea4963", "name": "React Flow <MiniMap> without dark background \u2014 src/ui/screens/TitleScreen.tsx:434", "shortDescription": {"text": "React Flow <MiniMap> without dark background \u2014 src/ui/screens/TitleScreen.tsx:434"}, "fullDescription": {"text": "A bare <MiniMap> renders with the vendor's white default in dark themes. Wrap the canvas in a class that overrides `.react-flow__minimap` background, or pass an explicit `style`/`maskColor`/`bgColor`.\n\nWhy: P1 in CHECKLIST.md \u2014 vendor defaults bleed light through.\nRule id: fq.minimap.no-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c05b507a539d2050", "name": "Icon-only button without accessible name \u2014 src/ui/components/PrestigeModal.tsx:60", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/PrestigeModal.tsx:60"}, "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-a8c16b3300a2b1bc", "name": "Icon-only button without accessible name \u2014 src/ui/components/WhatsNewModal.tsx:52", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/WhatsNewModal.tsx:52"}, "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-cc3031b137743f6a", "name": "Icon-only button without accessible name \u2014 src/ui/components/TitlesModal.tsx:144", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/TitlesModal.tsx:144"}, "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-76098052f50f782d", "name": "Icon-only button without accessible name \u2014 src/ui/components/ForcesOverview.tsx:84", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/ForcesOverview.tsx:84"}, "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-3a31ad1a42482aab", "name": "Icon-only button without accessible name \u2014 src/ui/components/DeedsModal.tsx:97", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/DeedsModal.tsx:97"}, "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-73046e766420e64b", "name": "Icon-only button without accessible name \u2014 src/ui/components/PortPanel.tsx:89", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/PortPanel.tsx:89"}, "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-83037618e3ee4e3d", "name": "Icon-only button without accessible name \u2014 src/ui/components/MarriagePicker.tsx:73", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/MarriagePicker.tsx:73"}, "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-2896e25c8559ea77", "name": "Icon-only button without accessible name \u2014 src/ui/components/InstallPrompt.tsx:92", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/InstallPrompt.tsx:92"}, "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-5575401ee9fe5d05", "name": "Icon-only button without accessible name \u2014 src/ui/components/ForgingModal.tsx:81", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/ForgingModal.tsx:81"}, "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-0946613e149be1a2", "name": "Icon-only button without accessible name \u2014 src/ui/components/CatalogModal.tsx:97", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/CatalogModal.tsx:97"}, "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-d7bf1d5944d206b9", "name": "Icon-only button without accessible name \u2014 src/ui/components/PrivateForcesModal.tsx:67", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/PrivateForcesModal.tsx:67"}, "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-c891732cf6dcb6e3", "name": "Icon-only button without accessible name \u2014 src/ui/components/ScenarioOfficersBrowser.tsx:183", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/ScenarioOfficersBrowser.tsx:183"}, "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-6d72598c441080ed", "name": "Icon-only button without accessible name \u2014 src/ui/components/OfficersTab.tsx:178", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/OfficersTab.tsx:178"}, "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-dfe2bfddfc6e6b67", "name": "Icon-only button without accessible name \u2014 src/ui/components/BattlePrepModal.tsx:276", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/BattlePrepModal.tsx:276"}, "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-2dcab2ee2596805c", "name": "Icon-only button without accessible name \u2014 src/ui/components/CourtModal.tsx:72", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/CourtModal.tsx:72"}, "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-d097442182171575", "name": "Icon-only button without accessible name \u2014 src/ui/components/LegionsModal.tsx:90", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/LegionsModal.tsx:90"}, "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-26fa093201e8036e", "name": "Icon-only button without accessible name \u2014 src/ui/components/SchemesModal.tsx:67", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/SchemesModal.tsx:67"}, "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-4dfea6fd7a35cadc", "name": "Icon-only button without accessible name \u2014 src/ui/components/CareerModal.tsx:82", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/CareerModal.tsx:82"}, "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-2ee284183a6c0fcb", "name": "Icon-only button without accessible name \u2014 src/ui/components/CustomOfficerCreator.tsx:106", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/CustomOfficerCreator.tsx:106"}, "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-8eb8ea7fd9e8614f", "name": "Icon-only button without accessible name \u2014 src/ui/components/TribePanel.tsx:111", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/TribePanel.tsx:111"}, "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-6aec4c13ae23afed", "name": "Icon-only button without accessible name \u2014 src/ui/components/BondsModal.tsx:150", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/BondsModal.tsx:150"}, "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-e3cecd196bcb3250", "name": "Icon-only button without accessible name \u2014 src/ui/components/TrainingPicker.tsx:60", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/TrainingPicker.tsx:60"}, "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-d60ace22d2ef058f", "name": "Icon-only button without accessible name \u2014 src/ui/components/MarchPicker.tsx:194", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/MarchPicker.tsx:194"}, "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-995d2ed6d2fed359", "name": "Icon-only button without accessible name \u2014 src/ui/components/AttackPortPicker.tsx:83", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/AttackPortPicker.tsx:83"}, "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-8c904cc345530fc0", "name": "Icon-only button without accessible name \u2014 src/ui/components/ItemsBrowser.tsx:173", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/ItemsBrowser.tsx:173"}, "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-bcff5925e4264661", "name": "Icon-only button without accessible name \u2014 src/ui/components/OfficerDetail.tsx:208", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/OfficerDetail.tsx:208"}, "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-8688161457886ce0", "name": "Icon-only button without accessible name \u2014 src/ui/components/DiplomacyGraphModal.tsx:70", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/DiplomacyGraphModal.tsx:70"}, "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-3e5843e980442de8", "name": "Icon-only button without accessible name \u2014 src/ui/components/AdvisorModal.tsx:78", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/AdvisorModal.tsx:78"}, "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-727dc02ece485e06", "name": "Icon-only button without accessible name \u2014 src/ui/components/ArmouryModal.tsx:144", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/ArmouryModal.tsx:144"}, "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-86e0196fe1b0acf6", "name": "Icon-only button without accessible name \u2014 src/ui/components/BuildStockadePicker.tsx:75", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/BuildStockadePicker.tsx:75"}, "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-fc755595aa6bf42e", "name": "Icon-only button without accessible name \u2014 src/ui/components/OfficerPicker.tsx:85", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/OfficerPicker.tsx:85"}, "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-890f034b9ca788a4", "name": "Icon-only button without accessible name \u2014 src/ui/components/FortPanel.tsx:124", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/FortPanel.tsx:124"}, "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-ea487e81cd9f0944", "name": "Icon-only button without accessible name \u2014 src/ui/components/ScenicPanel.tsx:90", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/ScenicPanel.tsx:90"}, "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-d44a4ec625dd0e64", "name": "Icon-only button without accessible name \u2014 src/ui/components/EncyclopediaModal.tsx:100", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/EncyclopediaModal.tsx:100"}, "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-bad58f2841a147e2", "name": "Icon-only button without accessible name \u2014 src/ui/components/BattleHistoryModal.tsx:85", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/BattleHistoryModal.tsx:85"}, "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-9b085380760a4345", "name": "Icon-only button without accessible name \u2014 src/ui/components/RelationshipBrowserModal.tsx:130", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/RelationshipBrowserModal.tsx:130"}, "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-02185edd942ab48e", "name": "Icon-only button without accessible name \u2014 src/ui/components/ChronicleModal.tsx:78", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/ChronicleModal.tsx:78"}, "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-4d02001c4edc96f5", "name": "Icon-only button without accessible name \u2014 src/ui/components/RelationsModal.tsx:75", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/RelationsModal.tsx:75"}, "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-44a69d6db4c90a8e", "name": "Icon-only button without accessible name \u2014 src/ui/components/SitePanel.tsx:100", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/SitePanel.tsx:100"}, "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-d33ccb3a4f4d7921", "name": "Icon-only button without accessible name \u2014 src/ui/components/BattleDetailModal.tsx:33", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/BattleDetailModal.tsx:33"}, "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-e8eb993667112b1b", "name": "Icon-only button without accessible name \u2014 src/ui/components/HostagePicker.tsx:58", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/HostagePicker.tsx:58"}, "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-cfe8df740d5bc457", "name": "Icon-only button without accessible name \u2014 src/ui/components/WishesModal.tsx:86", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/WishesModal.tsx:86"}, "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-4cfab63a79639738", "name": "Icon-only button without accessible name \u2014 src/ui/components/EventEditorModal.tsx:106", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/EventEditorModal.tsx:106"}, "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-7c5310cea9bda151", "name": "Icon-only button without accessible name \u2014 src/ui/components/HeroModeModal.tsx:76", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/HeroModeModal.tsx:76"}, "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-6e6bf8a2a84765d4", "name": "Icon-only button without accessible name \u2014 src/ui/components/DiplomacyModal.tsx:116", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/DiplomacyModal.tsx:116"}, "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-5f7a78c866efcac5", "name": "Icon-only button without accessible name \u2014 src/ui/components/BattleReplayModal.tsx:84", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/BattleReplayModal.tsx:84"}, "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-da294128f42a2c3d", "name": "Icon-only button without accessible name \u2014 src/ui/components/GovernorsModal.tsx:73", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/GovernorsModal.tsx:73"}, "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-265962320721dd95", "name": "Icon-only button without accessible name \u2014 src/ui/components/SaveSlotsModal.tsx:100", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/SaveSlotsModal.tsx:100"}, "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-e128669947989b9d", "name": "Icon-only button without accessible name \u2014 src/ui/components/FormationsModal.tsx:131", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/FormationsModal.tsx:131"}, "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-a39314d446b8d258", "name": "Icon-only button without accessible name \u2014 src/ui/components/EspionageModal.tsx:153", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/ui/components/EspionageModal.tsx:153"}, "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-b060e5565fbd3cc4", "name": "Insecure pattern 'cors_wildcard' in api/leaderboard.js:34", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in api/leaderboard.js:34"}, "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-6372cebde0220094", "name": "No auth library detected", "shortDescription": {"text": "No auth library detected"}, "fullDescription": {"text": "The scanner did not find any standard auth library (JWT, OAuth, NextAuth, Auth0, etc.). The repo has auth/admin/session surface indicators, so auth may live in custom code, in a separate service, or be missing."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-28c4a04bd807da0c", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/deploy-pages@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ad6701f0a8405e22", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ee701f93459d42bb", "name": "Very large file: src/ui/screens/TacticalBattleScreen3D.tsx (4653 lines)", "shortDescription": {"text": "Very large file: src/ui/screens/TacticalBattleScreen3D.tsx (4653 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-22376c57c0174e35", "name": "Very large file: src/ui/screens/MapScreen.tsx (929 lines)", "shortDescription": {"text": "Very large file: src/ui/screens/MapScreen.tsx (929 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-3dec98a4f187991a", "name": "Very large file: src/ui/screens/CityMapScreen3D.tsx (3800 lines)", "shortDescription": {"text": "Very large file: src/ui/screens/CityMapScreen3D.tsx (3800 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-e99aae1fbe34e6f9", "name": "Very large file: src/ui/screens/TitleScreen.tsx (900 lines)", "shortDescription": {"text": "Very large file: src/ui/screens/TitleScreen.tsx (900 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-e5539bd0a82ca075", "name": "Very large file: src/ui/components/OfficerDetail.tsx (1617 lines)", "shortDescription": {"text": "Very large file: src/ui/components/OfficerDetail.tsx (1617 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-e4ac772b708f590e", "name": "Very large file: src/ui/components/TacticsModal.tsx (1153 lines)", "shortDescription": {"text": "Very large file: src/ui/components/TacticsModal.tsx (1153 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-6755f008b34a6e98", "name": "Very large file: src/ui/components/StrategicMap3D.tsx (7368 lines)", "shortDescription": {"text": "Very large file: src/ui/components/StrategicMap3D.tsx (7368 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-d34dee70a06ea47c", "name": "Very large file: src/game/state/store.ts (6934 lines)", "shortDescription": {"text": "Very large file: src/game/state/store.ts (6934 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-63f38c177bfa1ddd", "name": "Very large file: src/game/systems/tactical.ts (3709 lines)", "shortDescription": {"text": "Very large file: src/game/systems/tactical.ts (3709 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-c5f131a1d7131401", "name": "Very large file: src/game/systems/combat.ts (1302 lines)", "shortDescription": {"text": "Very large file: src/game/systems/combat.ts (1302 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-30dedfae0a2fa720", "name": "Very large file: src/game/systems/resolution.ts (1682 lines)", "shortDescription": {"text": "Very large file: src/game/systems/resolution.ts (1682 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea3b5e389d8c9c0f", "name": "Low test-to-source ratio", "shortDescription": {"text": "Low test-to-source ratio"}, "fullDescription": {"text": "63 tests / 256 src (ratio 0.25)."}, "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 9 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 82 placeholder/mock markers across 19 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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-f8ac21423af5fff2", "name": "Commented-code block (6 lines) in api/leaderboard.js:1", "shortDescription": {"text": "Commented-code block (6 lines) in api/leaderboard.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3684ed60c4fdf8a7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 api/leaderboard.js:19", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/leaderboard.js:19"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d7c3e5b902a8fbb7", "name": "Commented-code block (5 lines) in src/main.tsx:11", "shortDescription": {"text": "Commented-code block (5 lines) in src/main.tsx: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-a8898f929716fbb3", "name": "Commented-code block (6 lines) in src/ui/viewWindow.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in src/ui/viewWindow.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9e5091c5ada90127", "name": "Commented-code block (5 lines) in src/ui/screens/TacticalBattleScreen3D.tsx:1494", "shortDescription": {"text": "Commented-code block (5 lines) in src/ui/screens/TacticalBattleScreen3D.tsx:1494"}, "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-f86c2daca38a3a0d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/ui/screens/TacticalBattleScreen3D.tsx:1497", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/ui/screens/TacticalBattleScreen3D.tsx:1497"}, "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-c6d5202a8d466229", "name": "Commented-code block (5 lines) in src/ui/screens/MapScreen.tsx:244", "shortDescription": {"text": "Commented-code block (5 lines) in src/ui/screens/MapScreen.tsx:244"}, "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-df121170cedb615f", "name": "Commented-code block (5 lines) in src/ui/screens/CityMapScreen3D.tsx:484", "shortDescription": {"text": "Commented-code block (5 lines) in src/ui/screens/CityMapScreen3D.tsx:484"}, "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-0338097582a7ac1c", "name": "Commented-code block (5 lines) in src/ui/components/BattlePrepModal.tsx:238", "shortDescription": {"text": "Commented-code block (5 lines) in src/ui/components/BattlePrepModal.tsx:238"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-654ccf85fe556a1c", "name": "Legacy-named symbol `isOld` in src/ui/components/OfficerDetail.tsx:1185", "shortDescription": {"text": "Legacy-named symbol `isOld` in src/ui/components/OfficerDetail.tsx:1185"}, "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-d6f8e73d621e3eac", "name": "Commented-code block (5 lines) in src/ui/components/IntroDive.tsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/ui/components/IntroDive.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bfd0bb9558cd47d5", "name": "Commented-code block (5 lines) in src/ui/components/LocatorMap.tsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/ui/components/LocatorMap.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6432ad54a9e9882e", "name": "Commented-code block (5 lines) in src/ui/components/StrategicMap3D.tsx:515", "shortDescription": {"text": "Commented-code block (5 lines) in src/ui/components/StrategicMap3D.tsx:515"}, "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-0fb364aa7a9aadbf", "name": "Commented-code block (7 lines) in src/ui/components/EspionageModal.tsx:83", "shortDescription": {"text": "Commented-code block (7 lines) in src/ui/components/EspionageModal.tsx:83"}, "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-93aaeb354fc5627c", "name": "Commented-code block (5 lines) in src/game/state/gameState.ts:502", "shortDescription": {"text": "Commented-code block (5 lines) in src/game/state/gameState.ts:502"}, "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-748a12312f58b15b", "name": "Commented-code block (5 lines) in src/game/state/store.ts:2393", "shortDescription": {"text": "Commented-code block (5 lines) in src/game/state/store.ts:2393"}, "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-a977b5bf67e2986a", "name": "Commented-code block (6 lines) in src/game/systems/ai.ts:440", "shortDescription": {"text": "Commented-code block (6 lines) in src/game/systems/ai.ts:440"}, "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-50f5b01f0c6a4452", "name": "Commented-code block (5 lines) in src/game/systems/battlefieldTerrain.ts:269", "shortDescription": {"text": "Commented-code block (5 lines) in src/game/systems/battlefieldTerrain.ts:269"}, "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-4e3aa8d11bd7412d", "name": "Commented-code block (7 lines) in src/game/systems/tactical.ts:674", "shortDescription": {"text": "Commented-code block (7 lines) in src/game/systems/tactical.ts:674"}, "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-e71534ff6aad7069", "name": "Commented-code block (6 lines) in src/game/systems/aiBuild.ts:349", "shortDescription": {"text": "Commented-code block (6 lines) in src/game/systems/aiBuild.ts:349"}, "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-c4f312239a003870", "name": "Commented-code block (7 lines) in src/game/systems/combat.ts:1019", "shortDescription": {"text": "Commented-code block (7 lines) in src/game/systems/combat.ts:1019"}, "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-0851213bdac71604", "name": "Commented-code block (7 lines) in src/game/systems/diplomacy.ts:305", "shortDescription": {"text": "Commented-code block (7 lines) in src/game/systems/diplomacy.ts:305"}, "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-eaffd4c2a7407c0b", "name": "Commented-code block (6 lines) in src/game/systems/resolution.ts:231", "shortDescription": {"text": "Commented-code block (6 lines) in src/game/systems/resolution.ts:231"}, "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-6489d303436b73b2", "name": "Commented-code block (5 lines) in src/game/systems/wordWar.ts:119", "shortDescription": {"text": "Commented-code block (5 lines) in src/game/systems/wordWar.ts:119"}, "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}}]}}, "automationDetails": {"id": "repobility/19154"}, "properties": {"repository": "Seanye333/three-kingdom-masters", "repoUrl": "https://github.com/Seanye333/three-kingdom-masters", "branch": "main"}, "results": [{"ruleId": "scanner-cf4974ffcf323eac", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/gen-catalog.ts:252"}, "properties": {"repobilityId": "54a3e9630bc365e9", "scanner": "scanner-primary", "fingerprint": "cf4974ffcf323eac", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ad036b77a2759d88", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/screens/CityMapScreen.tsx:282"}, "properties": {"repobilityId": "5acac9869206f0ed", "scanner": "scanner-primary", "fingerprint": "ad036b77a2759d88", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-c5479c5e1b6a6a37", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/screens/CityMapScreen3D.tsx:3323"}, "properties": {"repobilityId": "7513101f0abc1d06", "scanner": "scanner-primary", "fingerprint": "c5479c5e1b6a6a37", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-c9beede6a2ea4963", "level": "note", "message": {"text": "React Flow <MiniMap> without dark background \u2014 src/ui/screens/TitleScreen.tsx:434"}, "properties": {"repobilityId": "77aa772b93b4ac54", "scanner": "scanner-primary", "fingerprint": "c9beede6a2ea4963", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.minimap.no-bg"]}}, {"ruleId": "scanner-c05b507a539d2050", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/PrestigeModal.tsx:60"}, "properties": {"repobilityId": "9d23e475e1d7d069", "scanner": "scanner-primary", "fingerprint": "c05b507a539d2050", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-a8c16b3300a2b1bc", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/WhatsNewModal.tsx:52"}, "properties": {"repobilityId": "1ec14c421bd39c8f", "scanner": "scanner-primary", "fingerprint": "a8c16b3300a2b1bc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-cc3031b137743f6a", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/TitlesModal.tsx:144"}, "properties": {"repobilityId": "349e90382c6eb870", "scanner": "scanner-primary", "fingerprint": "cc3031b137743f6a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-76098052f50f782d", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/ForcesOverview.tsx:84"}, "properties": {"repobilityId": "ad696e626cf75ef6", "scanner": "scanner-primary", "fingerprint": "76098052f50f782d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-3a31ad1a42482aab", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/DeedsModal.tsx:97"}, "properties": {"repobilityId": "f9d1b706c58d2a6f", "scanner": "scanner-primary", "fingerprint": "3a31ad1a42482aab", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-73046e766420e64b", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/PortPanel.tsx:89"}, "properties": {"repobilityId": "792a3c34443cfef2", "scanner": "scanner-primary", "fingerprint": "73046e766420e64b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-83037618e3ee4e3d", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/MarriagePicker.tsx:73"}, "properties": {"repobilityId": "315ece334bbd5a6a", "scanner": "scanner-primary", "fingerprint": "83037618e3ee4e3d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-2896e25c8559ea77", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/InstallPrompt.tsx:92"}, "properties": {"repobilityId": "82dc221a3f2f8efd", "scanner": "scanner-primary", "fingerprint": "2896e25c8559ea77", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-5575401ee9fe5d05", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/ForgingModal.tsx:81"}, "properties": {"repobilityId": "b3b0c9a42edc1822", "scanner": "scanner-primary", "fingerprint": "5575401ee9fe5d05", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-0946613e149be1a2", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/CatalogModal.tsx:97"}, "properties": {"repobilityId": "78b7ac2ba59c7fb8", "scanner": "scanner-primary", "fingerprint": "0946613e149be1a2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-d7bf1d5944d206b9", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/PrivateForcesModal.tsx:67"}, "properties": {"repobilityId": "09d8f820deb68013", "scanner": "scanner-primary", "fingerprint": "d7bf1d5944d206b9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-c891732cf6dcb6e3", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/ScenarioOfficersBrowser.tsx:183"}, "properties": {"repobilityId": "471f9af32cc8d99a", "scanner": "scanner-primary", "fingerprint": "c891732cf6dcb6e3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-6d72598c441080ed", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/OfficersTab.tsx:178"}, "properties": {"repobilityId": "931b2949e2fb9c39", "scanner": "scanner-primary", "fingerprint": "6d72598c441080ed", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-dfe2bfddfc6e6b67", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/BattlePrepModal.tsx:276"}, "properties": {"repobilityId": "da6ffcc9632ec0ab", "scanner": "scanner-primary", "fingerprint": "dfe2bfddfc6e6b67", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-2dcab2ee2596805c", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/CourtModal.tsx:72"}, "properties": {"repobilityId": "52f67847d56b0f7b", "scanner": "scanner-primary", "fingerprint": "2dcab2ee2596805c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-d097442182171575", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/LegionsModal.tsx:90"}, "properties": {"repobilityId": "996d72987f66a166", "scanner": "scanner-primary", "fingerprint": "d097442182171575", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-26fa093201e8036e", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/SchemesModal.tsx:67"}, "properties": {"repobilityId": "042332a23578565b", "scanner": "scanner-primary", "fingerprint": "26fa093201e8036e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-4dfea6fd7a35cadc", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/CareerModal.tsx:82"}, "properties": {"repobilityId": "a8ef29f5d6dac67e", "scanner": "scanner-primary", "fingerprint": "4dfea6fd7a35cadc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-2ee284183a6c0fcb", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/CustomOfficerCreator.tsx:106"}, "properties": {"repobilityId": "28f578be3b40dcaf", "scanner": "scanner-primary", "fingerprint": "2ee284183a6c0fcb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-8eb8ea7fd9e8614f", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/TribePanel.tsx:111"}, "properties": {"repobilityId": "f9c7f0702efbf65e", "scanner": "scanner-primary", "fingerprint": "8eb8ea7fd9e8614f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-6aec4c13ae23afed", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/BondsModal.tsx:150"}, "properties": {"repobilityId": "584bf08a15b2a4a6", "scanner": "scanner-primary", "fingerprint": "6aec4c13ae23afed", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-e3cecd196bcb3250", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/TrainingPicker.tsx:60"}, "properties": {"repobilityId": "1dc22616f34df5e5", "scanner": "scanner-primary", "fingerprint": "e3cecd196bcb3250", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-d60ace22d2ef058f", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/MarchPicker.tsx:194"}, "properties": {"repobilityId": "ff93ef138cf1f1be", "scanner": "scanner-primary", "fingerprint": "d60ace22d2ef058f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-995d2ed6d2fed359", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/AttackPortPicker.tsx:83"}, "properties": {"repobilityId": "d6654c705797dadb", "scanner": "scanner-primary", "fingerprint": "995d2ed6d2fed359", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-8c904cc345530fc0", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/ItemsBrowser.tsx:173"}, "properties": {"repobilityId": "55fb031739da79c0", "scanner": "scanner-primary", "fingerprint": "8c904cc345530fc0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-bcff5925e4264661", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/OfficerDetail.tsx:208"}, "properties": {"repobilityId": "0ffa025f91872f7f", "scanner": "scanner-primary", "fingerprint": "bcff5925e4264661", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-8688161457886ce0", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/DiplomacyGraphModal.tsx:70"}, "properties": {"repobilityId": "15d91a9f65b3ad16", "scanner": "scanner-primary", "fingerprint": "8688161457886ce0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-3e5843e980442de8", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/AdvisorModal.tsx:78"}, "properties": {"repobilityId": "7360643b9a5ca915", "scanner": "scanner-primary", "fingerprint": "3e5843e980442de8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-727dc02ece485e06", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/ArmouryModal.tsx:144"}, "properties": {"repobilityId": "3512262298f4f814", "scanner": "scanner-primary", "fingerprint": "727dc02ece485e06", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-86e0196fe1b0acf6", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/BuildStockadePicker.tsx:75"}, "properties": {"repobilityId": "3fd406f81c4818c3", "scanner": "scanner-primary", "fingerprint": "86e0196fe1b0acf6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-fc755595aa6bf42e", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/OfficerPicker.tsx:85"}, "properties": {"repobilityId": "994b5ec362f6d251", "scanner": "scanner-primary", "fingerprint": "fc755595aa6bf42e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-890f034b9ca788a4", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/FortPanel.tsx:124"}, "properties": {"repobilityId": "5d5ed5e4df1a3fc9", "scanner": "scanner-primary", "fingerprint": "890f034b9ca788a4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-ea487e81cd9f0944", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/ScenicPanel.tsx:90"}, "properties": {"repobilityId": "f001c1d2bc7ec5ee", "scanner": "scanner-primary", "fingerprint": "ea487e81cd9f0944", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-d44a4ec625dd0e64", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/EncyclopediaModal.tsx:100"}, "properties": {"repobilityId": "730e0edd9b916060", "scanner": "scanner-primary", "fingerprint": "d44a4ec625dd0e64", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-bad58f2841a147e2", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/BattleHistoryModal.tsx:85"}, "properties": {"repobilityId": "093175aff19d86fd", "scanner": "scanner-primary", "fingerprint": "bad58f2841a147e2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-9b085380760a4345", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/RelationshipBrowserModal.tsx:130"}, "properties": {"repobilityId": "680dc124211bf6df", "scanner": "scanner-primary", "fingerprint": "9b085380760a4345", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-02185edd942ab48e", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/ChronicleModal.tsx:78"}, "properties": {"repobilityId": "2a260b83410dfbc0", "scanner": "scanner-primary", "fingerprint": "02185edd942ab48e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-4d02001c4edc96f5", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/RelationsModal.tsx:75"}, "properties": {"repobilityId": "423cdebfddca9082", "scanner": "scanner-primary", "fingerprint": "4d02001c4edc96f5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-44a69d6db4c90a8e", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/SitePanel.tsx:100"}, "properties": {"repobilityId": "7c9abd0d4ed2768e", "scanner": "scanner-primary", "fingerprint": "44a69d6db4c90a8e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-d33ccb3a4f4d7921", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/BattleDetailModal.tsx:33"}, "properties": {"repobilityId": "983fdb870a1a63a7", "scanner": "scanner-primary", "fingerprint": "d33ccb3a4f4d7921", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-e8eb993667112b1b", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/HostagePicker.tsx:58"}, "properties": {"repobilityId": "300468b76ac1acc9", "scanner": "scanner-primary", "fingerprint": "e8eb993667112b1b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-cfe8df740d5bc457", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/WishesModal.tsx:86"}, "properties": {"repobilityId": "d8d5f79a73772df3", "scanner": "scanner-primary", "fingerprint": "cfe8df740d5bc457", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-4cfab63a79639738", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/EventEditorModal.tsx:106"}, "properties": {"repobilityId": "da452a91a06b08c8", "scanner": "scanner-primary", "fingerprint": "4cfab63a79639738", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-7c5310cea9bda151", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/HeroModeModal.tsx:76"}, "properties": {"repobilityId": "3ec165a5dab6216c", "scanner": "scanner-primary", "fingerprint": "7c5310cea9bda151", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-6e6bf8a2a84765d4", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/DiplomacyModal.tsx:116"}, "properties": {"repobilityId": "c23e9befd3acfd14", "scanner": "scanner-primary", "fingerprint": "6e6bf8a2a84765d4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-5f7a78c866efcac5", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/BattleReplayModal.tsx:84"}, "properties": {"repobilityId": "4b2f39f661459ccd", "scanner": "scanner-primary", "fingerprint": "5f7a78c866efcac5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-da294128f42a2c3d", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/GovernorsModal.tsx:73"}, "properties": {"repobilityId": "7fa1c0af9166f022", "scanner": "scanner-primary", "fingerprint": "da294128f42a2c3d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-265962320721dd95", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/SaveSlotsModal.tsx:100"}, "properties": {"repobilityId": "d6cb0b50edfb7795", "scanner": "scanner-primary", "fingerprint": "265962320721dd95", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-e128669947989b9d", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/FormationsModal.tsx:131"}, "properties": {"repobilityId": "e39101a86864b30c", "scanner": "scanner-primary", "fingerprint": "e128669947989b9d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-a39314d446b8d258", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/ui/components/EspionageModal.tsx:153"}, "properties": {"repobilityId": "83311b1314161be4", "scanner": "scanner-primary", "fingerprint": "a39314d446b8d258", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-b060e5565fbd3cc4", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in api/leaderboard.js:34"}, "properties": {"repobilityId": "b3925ca5017627b0", "scanner": "scanner-primary", "fingerprint": "b060e5565fbd3cc4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "api/leaderboard.js"}, "region": {"startLine": 34}}}]}, {"ruleId": "scanner-6372cebde0220094", "level": "warning", "message": {"text": "No auth library detected"}, "properties": {"repobilityId": "a5b6035a5bbf8054", "scanner": "scanner-primary", "fingerprint": "6372cebde0220094", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["coverage", "auth"]}}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "419d1ec7943efec2", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 44}}}]}, {"ruleId": "scanner-ad6701f0a8405e22", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "8384c23520d55657", "scanner": "scanner-primary", "fingerprint": "ad6701f0a8405e22", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ee701f93459d42bb", "level": "note", "message": {"text": "Very large file: src/ui/screens/TacticalBattleScreen3D.tsx (4653 lines)"}, "properties": {"repobilityId": "21b90effe4e23999", "scanner": "scanner-primary", "fingerprint": "ee701f93459d42bb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-22376c57c0174e35", "level": "note", "message": {"text": "Very large file: src/ui/screens/MapScreen.tsx (929 lines)"}, "properties": {"repobilityId": "d6d9e29d5471cf12", "scanner": "scanner-primary", "fingerprint": "22376c57c0174e35", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3dec98a4f187991a", "level": "note", "message": {"text": "Very large file: src/ui/screens/CityMapScreen3D.tsx (3800 lines)"}, "properties": {"repobilityId": "991cd99abe458559", "scanner": "scanner-primary", "fingerprint": "3dec98a4f187991a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e99aae1fbe34e6f9", "level": "note", "message": {"text": "Very large file: src/ui/screens/TitleScreen.tsx (900 lines)"}, "properties": {"repobilityId": "4a517fa0bb366bd0", "scanner": "scanner-primary", "fingerprint": "e99aae1fbe34e6f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e5539bd0a82ca075", "level": "note", "message": {"text": "Very large file: src/ui/components/OfficerDetail.tsx (1617 lines)"}, "properties": {"repobilityId": "c4a398313c64ef6b", "scanner": "scanner-primary", "fingerprint": "e5539bd0a82ca075", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e4ac772b708f590e", "level": "note", "message": {"text": "Very large file: src/ui/components/TacticsModal.tsx (1153 lines)"}, "properties": {"repobilityId": "9301cad86b0f7871", "scanner": "scanner-primary", "fingerprint": "e4ac772b708f590e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6755f008b34a6e98", "level": "note", "message": {"text": "Very large file: src/ui/components/StrategicMap3D.tsx (7368 lines)"}, "properties": {"repobilityId": "25a0c5aff8ecd151", "scanner": "scanner-primary", "fingerprint": "6755f008b34a6e98", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d34dee70a06ea47c", "level": "note", "message": {"text": "Very large file: src/game/state/store.ts (6934 lines)"}, "properties": {"repobilityId": "3793d38268679345", "scanner": "scanner-primary", "fingerprint": "d34dee70a06ea47c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-63f38c177bfa1ddd", "level": "note", "message": {"text": "Very large file: src/game/systems/tactical.ts (3709 lines)"}, "properties": {"repobilityId": "02181086a3a4ea06", "scanner": "scanner-primary", "fingerprint": "63f38c177bfa1ddd", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c5f131a1d7131401", "level": "note", "message": {"text": "Very large file: src/game/systems/combat.ts (1302 lines)"}, "properties": {"repobilityId": "35e79131f1bad672", "scanner": "scanner-primary", "fingerprint": "c5f131a1d7131401", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-30dedfae0a2fa720", "level": "note", "message": {"text": "Very large file: src/game/systems/resolution.ts (1682 lines)"}, "properties": {"repobilityId": "58d94ea5690c4e3b", "scanner": "scanner-primary", "fingerprint": "30dedfae0a2fa720", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ea3b5e389d8c9c0f", "level": "note", "message": {"text": "Low test-to-source ratio"}, "properties": {"repobilityId": "ef7b2552cc00a375", "scanner": "scanner-primary", "fingerprint": "ea3b5e389d8c9c0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["tests"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "1dc62917f797c10d", "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": "a84e474f81bc4acb", "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": "1805fa5f80ae352d", "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": "8299aa4f5973ff8c", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "496ac4d2f5ac2021", "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": "75e6281d363cc09c", "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": "f1dce635287b3d1a", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-f8ac21423af5fff2", "level": "none", "message": {"text": "Commented-code block (6 lines) in api/leaderboard.js:1"}, "properties": {"repobilityId": "dca39dbb8e9def0b", "scanner": "scanner-primary", "fingerprint": "f8ac21423af5fff2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3684ed60c4fdf8a7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/leaderboard.js:19"}, "properties": {"repobilityId": "82f1b956107c30a7", "scanner": "scanner-primary", "fingerprint": "3684ed60c4fdf8a7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d7c3e5b902a8fbb7", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/main.tsx:11"}, "properties": {"repobilityId": "7d919d309c3f0e93", "scanner": "scanner-primary", "fingerprint": "d7c3e5b902a8fbb7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a8898f929716fbb3", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/ui/viewWindow.ts:1"}, "properties": {"repobilityId": "1f9e8b11cfefe3e6", "scanner": "scanner-primary", "fingerprint": "a8898f929716fbb3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9e5091c5ada90127", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/ui/screens/TacticalBattleScreen3D.tsx:1494"}, "properties": {"repobilityId": "c64fe9db79503932", "scanner": "scanner-primary", "fingerprint": "9e5091c5ada90127", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f86c2daca38a3a0d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/ui/screens/TacticalBattleScreen3D.tsx:1497"}, "properties": {"repobilityId": "cb769977309e4cb6", "scanner": "scanner-primary", "fingerprint": "f86c2daca38a3a0d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c6d5202a8d466229", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/ui/screens/MapScreen.tsx:244"}, "properties": {"repobilityId": "7f1fedb593f87eb4", "scanner": "scanner-primary", "fingerprint": "c6d5202a8d466229", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-df121170cedb615f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/ui/screens/CityMapScreen3D.tsx:484"}, "properties": {"repobilityId": "56998e1ad1e71b22", "scanner": "scanner-primary", "fingerprint": "df121170cedb615f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0338097582a7ac1c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/ui/components/BattlePrepModal.tsx:238"}, "properties": {"repobilityId": "a8055a82151da81e", "scanner": "scanner-primary", "fingerprint": "0338097582a7ac1c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-654ccf85fe556a1c", "level": "note", "message": {"text": "Legacy-named symbol `isOld` in src/ui/components/OfficerDetail.tsx:1185"}, "properties": {"repobilityId": "9aeb93dbcee8e5a8", "scanner": "scanner-primary", "fingerprint": "654ccf85fe556a1c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d6f8e73d621e3eac", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/ui/components/IntroDive.tsx:1"}, "properties": {"repobilityId": "2a9cb8414b511b70", "scanner": "scanner-primary", "fingerprint": "d6f8e73d621e3eac", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bfd0bb9558cd47d5", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/ui/components/LocatorMap.tsx:1"}, "properties": {"repobilityId": "bc86c04cd5e28b7a", "scanner": "scanner-primary", "fingerprint": "bfd0bb9558cd47d5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6432ad54a9e9882e", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/ui/components/StrategicMap3D.tsx:515"}, "properties": {"repobilityId": "ea23d83c3c511c72", "scanner": "scanner-primary", "fingerprint": "6432ad54a9e9882e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0fb364aa7a9aadbf", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/ui/components/EspionageModal.tsx:83"}, "properties": {"repobilityId": "3d43a6a626e99a94", "scanner": "scanner-primary", "fingerprint": "0fb364aa7a9aadbf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-93aaeb354fc5627c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/game/state/gameState.ts:502"}, "properties": {"repobilityId": "0e781b9943b48dc3", "scanner": "scanner-primary", "fingerprint": "93aaeb354fc5627c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-748a12312f58b15b", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/game/state/store.ts:2393"}, "properties": {"repobilityId": "c6ccd3b8bf6eb58e", "scanner": "scanner-primary", "fingerprint": "748a12312f58b15b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a977b5bf67e2986a", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/game/systems/ai.ts:440"}, "properties": {"repobilityId": "246e53ee69a8a682", "scanner": "scanner-primary", "fingerprint": "a977b5bf67e2986a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-50f5b01f0c6a4452", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/game/systems/battlefieldTerrain.ts:269"}, "properties": {"repobilityId": "94952ca8362d221a", "scanner": "scanner-primary", "fingerprint": "50f5b01f0c6a4452", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4e3aa8d11bd7412d", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/game/systems/tactical.ts:674"}, "properties": {"repobilityId": "b36d488ec6592350", "scanner": "scanner-primary", "fingerprint": "4e3aa8d11bd7412d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e71534ff6aad7069", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/game/systems/aiBuild.ts:349"}, "properties": {"repobilityId": "1de7933f08187b69", "scanner": "scanner-primary", "fingerprint": "e71534ff6aad7069", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c4f312239a003870", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/game/systems/combat.ts:1019"}, "properties": {"repobilityId": "230651c81fee055b", "scanner": "scanner-primary", "fingerprint": "c4f312239a003870", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0851213bdac71604", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/game/systems/diplomacy.ts:305"}, "properties": {"repobilityId": "15247688f2b5983e", "scanner": "scanner-primary", "fingerprint": "0851213bdac71604", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-eaffd4c2a7407c0b", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/game/systems/resolution.ts:231"}, "properties": {"repobilityId": "3d5c3b72b3614c39", "scanner": "scanner-primary", "fingerprint": "eaffd4c2a7407c0b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6489d303436b73b2", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/game/systems/wordWar.ts:119"}, "properties": {"repobilityId": "5f77ab74ab85da8f", "scanner": "scanner-primary", "fingerprint": "6489d303436b73b2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}]}]}