{"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-bead75b0f9233e05", "name": "No API endpoints detected", "shortDescription": {"text": "No API endpoints detected"}, "fullDescription": {"text": "The scanner did not find FastAPI/Flask/Express/NestJS/GraphQL/gRPC routes. If this repo exposes APIs, the framework may be unsupported."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7fb79096d263b032", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/Breadcrumb.tsx:26", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/Breadcrumb.tsx:26"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b8f514c5b2a161a3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/MatchCard.tsx:83", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/MatchCard.tsx:83"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4e67ef4c90186527", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/WCWatchCountryContent.tsx:174", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/WCWatchCountryContent.tsx:174"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-765b21ad721df497", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/WCGroupPredictionsTemplate.tsx:184", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/WCGroupPredictionsTemplate.tsx:184"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-57a3fc6569c01e5c", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/WCGroupPredictionsTemplate.tsx:357", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/WCGroupPredictionsTemplate.tsx:357"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1d4d6e942111236d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/WCGroupTable.tsx:79", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/WCGroupTable.tsx:79"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-27ba6565ec6d1275", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/TimezoneBanner.tsx:41", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/TimezoneBanner.tsx:41"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9fdf2f020ad90a69", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/WCTeamPageContent.tsx:253", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/WCTeamPageContent.tsx:253"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f0ea6d5fda5f78ee", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/WCTeamPageContent.tsx:652", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/WCTeamPageContent.tsx:652"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fb7e5d27686c360c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/WCCountdownBanner.tsx:109", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/WCCountdownBanner.tsx:109"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8e39e1e6565bd8bd", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/WCRoundPage.tsx:129", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/WCRoundPage.tsx:129"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f7852638b5a1cbc1", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/WCRoundPage.tsx:114", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/WCRoundPage.tsx:114"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9af8d4e48d1a26d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/page.tsx:278", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/page.tsx:278"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-07cb234169e74f84", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/page.tsx:417", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/page.tsx:417"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cfcc16ec092cb752", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/match/[id]/page.tsx:1010", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/match/[id]/page.tsx:1010"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-987c5f07e2ffb832", "name": "Stray `console.log` in TS/JS \u2014 src/app/match/[id]/page.tsx:2076", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/match/[id]/page.tsx:2076"}, "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-9ea7562d63d011b7", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/match/[id]/page.tsx:688", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/match/[id]/page.tsx:688"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-df7f340761359150", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026-standings/page.tsx:149", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026-standings/page.tsx:149"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3bffdea6eb6e15ef", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/world-cup-2026-results/page.tsx:221", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/world-cup-2026-results/page.tsx:221"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d179ebbae9090a09", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026-results/page.tsx:132", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026-results/page.tsx:132"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9f4aabbe4a7b5db6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/world-cup-2026/page.tsx:231", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/world-cup-2026/page.tsx:231"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c443256e3d7f13c6", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/page.tsx:109", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/page.tsx:109"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ff63309e621eed54", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/world-cup-2026/bracket/page.tsx:171", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/world-cup-2026/bracket/page.tsx:171"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-75217f664df983ee", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/bracket/page.tsx:129", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/bracket/page.tsx:129"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bf8db3234ae669c4", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/matches/page.tsx:82", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/matches/page.tsx:82"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3f67058c494084d4", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/world-cup-2026/predictions/page.tsx:321", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/world-cup-2026/predictions/page.tsx:321"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9b68f7a8e4a0f505", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/predictions/page.tsx:126", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/predictions/page.tsx:126"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4c1df6a7e3acbc27", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/world-cup-2026/fixtures/page.tsx:241", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/world-cup-2026/fixtures/page.tsx:241"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-eec220caa0bedcb3", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/fixtures/page.tsx:135", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/fixtures/page.tsx:135"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-084df446eb0aaf07", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/groups/page.tsx:65", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/groups/page.tsx:65"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ac57810c398a5f8d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/world-cup-2026/teams/page.tsx:237", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/world-cup-2026/teams/page.tsx:237"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-506e363ed824b9b9", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/teams/page.tsx:89", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/teams/page.tsx:89"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-34357f9d999b0e7b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/world-cup-2026/teams/[slug]/page.tsx:528", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/world-cup-2026/teams/[slug]/page.tsx:528"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1f7cd3910f5a8f81", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/teams/[slug]/page.tsx:415", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/teams/[slug]/page.tsx:415"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-71a1befa00f7d25b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/world-cup-2026/matches-today/page.tsx:95", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/world-cup-2026/matches-today/page.tsx:95"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-36505d82e838493b", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/matches-today/page.tsx:387", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/matches-today/page.tsx:387"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-02451e8127eed2cc", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/world-cup-2026/[group]/page.tsx:207", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/world-cup-2026/[group]/page.tsx:207"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-325471a66138119e", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/[group]/page.tsx:166", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/[group]/page.tsx:166"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d22fe352cea88dd4", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/venues/page.tsx:95", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/venues/page.tsx:95"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6dbee4b21f55d17f", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/venues/[venue]/page.tsx:141", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/venues/[venue]/page.tsx:141"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-208de3d51271b94e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/world-cup-2026/watch-live/page.tsx:216", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/world-cup-2026/watch-live/page.tsx:216"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3cfc1f2aad0a4eb1", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/watch-live/page.tsx:302", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/watch-live/page.tsx:302"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-54516a06c57c65e9", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/winner-predictions/page.tsx:211", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/winner-predictions/page.tsx:211"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3a0de53515925219", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/tv-schedule/page.tsx:111", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/tv-schedule/page.tsx:111"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4fcbd25fea5aa562", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/tv-schedule/[country]/page.tsx:130", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/tv-schedule/[country]/page.tsx:130"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-68fe427659aa7ee2", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/golden-boot-predictions/page.tsx:160", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/golden-boot-predictions/page.tsx:160"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e7593440369e7ff7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/world-cup-2026/matches-tomorrow/page.tsx:124", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/world-cup-2026/matches-tomorrow/page.tsx:124"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0182f2c0e383834f", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/matches-tomorrow/page.tsx:344", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/matches-tomorrow/page.tsx:344"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0bb62daa3b11aa74", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/host-cities/page.tsx:184", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/host-cities/page.tsx:184"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-de4c0b487bb54081", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/streaming-guide/page.tsx:142", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/streaming-guide/page.tsx:142"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-065e7945e68615eb", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/push/opt-in/route.ts:41", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/push/opt-in/route.ts:41"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0f5c273cfc862fb2", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/orchestrator/route.ts:162", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/orchestrator/route.ts:162"}, "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-4c9b517e63ab76fa", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/debug/provider-smoke/route.ts:119", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/debug/provider-smoke/route.ts:119"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-edeb7ebceb857fcd", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/debug/provider-health/route.ts:113", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/debug/provider-health/route.ts:113"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0f54bf3e52a489e0", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/telemetry/navigation/route.ts:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/telemetry/navigation/route.ts:19"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6d3aac3523a254ea", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/predict/[id]/page.tsx:378", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/predict/[id]/page.tsx:378"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b85bd079885f8908", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/predict/[id]/page.tsx:112", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/predict/[id]/page.tsx:112"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2802695ed3bad3c1", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026-bracket/page.tsx:166", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026-bracket/page.tsx:166"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cf2e03a7fa61ee0a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/teams/[slug]/page.tsx:363", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/teams/[slug]/page.tsx:363"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ae1d444e21fd8981", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/teams/[slug]/page.tsx:203", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/teams/[slug]/page.tsx:203"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9965108a2213558e", "name": "Stray `console.log` in TS/JS \u2014 src/app/[alias]/page.tsx:110", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/[alias]/page.tsx:110"}, "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-d1cb6274fe2f9394", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/world-cup-2026-groups/page.tsx:153", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/world-cup-2026-groups/page.tsx:153"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3b41790b137190d0", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026-groups/page.tsx:99", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026-groups/page.tsx:99"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f52fa7db1dd8de86", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/performance/page.tsx:308", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/performance/page.tsx:308"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-af11cae20195691a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/world-cup-2026-predictions/page.tsx:192", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/world-cup-2026-predictions/page.tsx:192"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-42adac8b2053020e", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026-predictions/page.tsx:125", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026-predictions/page.tsx:125"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a9c0f62fc787a47a", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/competition/[code]/page.tsx:103", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/competition/[code]/page.tsx:103"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ba166cf158717fdd", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/world-cup-2026-schedule/page.tsx:285", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/world-cup-2026-schedule/page.tsx:285"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0cbc8ee51ea8504b", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026-schedule/page.tsx:193", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026-schedule/page.tsx:193"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1ed685cb5cf14027", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026-live-stream/page.tsx:133", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026-live-stream/page.tsx:133"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-251f4ca30eaaba4a", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026-tv-guide/page.tsx:145", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026-tv-guide/page.tsx:145"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-465234adca5151e2", "name": "Stray `console.log` in TS/JS \u2014 src/lib/cache.ts:108", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/cache.ts:108"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2eb1a7b8817cc178", "name": "Stray `console.log` in TS/JS \u2014 src/lib/api-audit.ts:103", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/api-audit.ts:103"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d98176eac98b4097", "name": "Stray `console.log` in TS/JS \u2014 src/lib/match-state-overlay.ts:92", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/match-state-overlay.ts:92"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c8b6d18875109ef4", "name": "Stray `console.log` in TS/JS \u2014 src/lib/rate-safe.ts:145", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/rate-safe.ts:145"}, "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-6481a4f3551e678a", "name": "Stray `console.log` in TS/JS \u2014 src/lib/live-cache.ts:143", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/live-cache.ts:143"}, "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-6fa86b9d8f330d16", "name": "Stray `console.log` in TS/JS \u2014 src/lib/kv-cache.ts:121", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/kv-cache.ts:121"}, "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-8cdbd7885ff0c3fd", "name": "Stray `console.log` in TS/JS \u2014 src/lib/refresh.ts:197", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/refresh.ts:197"}, "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-aab551367e6c18e8", "name": "Stray `console.log` in TS/JS \u2014 src/lib/revalidation.ts:116", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/revalidation.ts:116"}, "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-22716566c7792fb7", "name": "Stray `console.log` in TS/JS \u2014 src/lib/data-source-tracker.ts:54", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/data-source-tracker.ts:54"}, "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-829a22b4ef2fbcec", "name": "Stray `console.log` in TS/JS \u2014 src/lib/match-snapshot.ts:204", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/match-snapshot.ts:204"}, "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-b4b3e1532f88ec6d", "name": "Stray `console.log` in TS/JS \u2014 src/lib/rate-limiter.ts:73", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/rate-limiter.ts:73"}, "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-d2b8834596d34dc3", "name": "Stray `console.log` in TS/JS \u2014 src/lib/providers/football-data.ts:79", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/providers/football-data.ts:79"}, "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-d5044820f46a3448", "name": "Stray `console.log` in TS/JS \u2014 src/lib/providers/manager.ts:70", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/providers/manager.ts:70"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b8b43887dc4fad51", "name": "Stray `console.log` in TS/JS \u2014 src/lib/prewarm/worldcup.ts:313", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/prewarm/worldcup.ts:313"}, "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-e3e313cbbec913f6", "name": "Insecure pattern 'node_child_process' in scripts/crawl-links.mjs:33", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/crawl-links.mjs:33"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-31eaf96fdf38a362", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/Breadcrumb.tsx:26", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/Breadcrumb.tsx:26"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f05525d59c912a91", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/WCWatchCountryContent.tsx:174", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/WCWatchCountryContent.tsx:174"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cc488d6257dfcfea", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/WCTeamPageContent.tsx:652", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/WCTeamPageContent.tsx:652"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d2e4ad488b0aada", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/WCRoundPage.tsx:114", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/WCRoundPage.tsx:114"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-87b9ca09954873bb", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/page.tsx:417", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/page.tsx:417"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f5f1c3fa384da6d9", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/match/[id]/page.tsx:688", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/match/[id]/page.tsx:688"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1d02cb5a2f538f4b", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026-standings/page.tsx:149", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026-standings/page.tsx:149"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6e3df0f5c201b709", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026-results/page.tsx:132", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026-results/page.tsx:132"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4ed64d54a9c63f7d", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/page.tsx:109", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/page.tsx:109"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2bc25ef7129e9e3a", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/bracket/page.tsx:129", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/bracket/page.tsx:129"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9e373c68d5e7be5c", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/matches/page.tsx:82", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/matches/page.tsx:82"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-181fc5a715c2edb5", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/predictions/page.tsx:126", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/predictions/page.tsx:126"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-eb42e24bb74c5c61", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/groups/page.tsx:65", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/groups/page.tsx:65"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5869d3606cc55193", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/teams/page.tsx:89", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/teams/page.tsx:89"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-64bcfaddbe43360a", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/teams/[slug]/page.tsx:415", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/teams/[slug]/page.tsx:415"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a1cba44c2363fa22", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/matches-today/page.tsx:387", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/matches-today/page.tsx:387"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0c98fa73a12c0a3f", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/[group]/page.tsx:166", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/[group]/page.tsx:166"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-812fe0057c430960", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/venues/page.tsx:95", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/venues/page.tsx:95"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0a0e4bf14beb0f06", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/venues/[venue]/page.tsx:141", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/venues/[venue]/page.tsx:141"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-037dc25de88a9836", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/watch-live/page.tsx:302", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/watch-live/page.tsx:302"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8da0b00b7b436afd", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/winner-predictions/page.tsx:211", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/winner-predictions/page.tsx:211"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d706ea0794597c63", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/tv-schedule/page.tsx:111", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/tv-schedule/page.tsx:111"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8b374034defe1519", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/tv-schedule/[country]/page.tsx:130", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/tv-schedule/[country]/page.tsx:130"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bcfa4cd6ed51c875", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/golden-boot-predictions/page.tsx:160", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/golden-boot-predictions/page.tsx:160"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-38147c1e2b0d7837", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/matches-tomorrow/page.tsx:344", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/matches-tomorrow/page.tsx:344"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fa482e84fec7fa33", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/host-cities/page.tsx:184", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/host-cities/page.tsx:184"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2f95e06a4cf2ad46", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/streaming-guide/page.tsx:142", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/streaming-guide/page.tsx:142"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6d8e2c4505f4da21", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/predict/[id]/page.tsx:112", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/predict/[id]/page.tsx:112"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d24ae5467633c1ec", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026-bracket/page.tsx:166", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026-bracket/page.tsx:166"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6e78e3907c6c5b6d", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/teams/[slug]/page.tsx:203", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/teams/[slug]/page.tsx:203"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f4896b2f1b918422", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026-groups/page.tsx:99", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026-groups/page.tsx:99"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e651c66dccf0c6ea", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026-predictions/page.tsx:125", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026-predictions/page.tsx:125"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-60ac4f33688dcc91", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/competition/[code]/page.tsx:103", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/competition/[code]/page.tsx:103"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d1bfaf6e59d0dc7f", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026-schedule/page.tsx:193", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026-schedule/page.tsx:193"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2c811d95ded3f50b", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026-live-stream/page.tsx:133", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026-live-stream/page.tsx:133"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-badc445a015a5847", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026-tv-guide/page.tsx:145", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026-tv-guide/page.tsx:145"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4eb7d223c56302c0", "name": "Very large file: src/app/match/[id]/page.tsx (2312 lines)", "shortDescription": {"text": "Very large file: src/app/match/[id]/page.tsx (2312 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-6f58e5e22290fdce", "name": "Very large file: src/lib/wc-tv-countries.ts (1418 lines)", "shortDescription": {"text": "Very large file: src/lib/wc-tv-countries.ts (1418 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-1044ed6968fb0f5f", "name": "Very large file: src/lib/wc-venues.ts (1037 lines)", "shortDescription": {"text": "Very large file: src/lib/wc-venues.ts (1037 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "1 test file(s) for 199 source file(s) (ratio 0.01). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-faccb9061e9b52a0", "name": "No README detected", "shortDescription": {"text": "No README detected"}, "fullDescription": {"text": "No README file was found. Generated repos without README context are hard to operate, validate, or safely hand off."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 98 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 13 placeholder/mock markers across 7 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, operator-readme. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, operator-readme. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-505bc666a82f9849", "name": "Agent instruction/config may expose a secret: .claude/settings.local.json", "shortDescription": {"text": "Agent instruction/config may expose a secret: .claude/settings.local.json"}, "fullDescription": {"text": "Agent-facing files are routinely pasted into LLM/tool contexts. Move literal tokens, keys, and passwords into a secret manager or document them as placeholders only."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ecb0d2c55ed6875d", "name": "Agent authority lacks a verifier contract: .claude/settings.local.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/settings.local.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2c5f98b152cddb6d", "name": "Agent authority lacks a verifier contract: .claude/launch.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/launch.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-09ff26685a4c6850", "name": "Commented-code block (7 lines) in next.config.ts:198", "shortDescription": {"text": "Commented-code block (7 lines) in next.config.ts:198"}, "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-917983cdf66eefee", "name": "Commented-code block (5 lines) in src/app/sitemap.ts:44", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/sitemap.ts:44"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-df4a2803521835dd", "name": "Commented-code block (5 lines) in src/app/page.tsx:573", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/page.tsx:573"}, "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-d9ff9daeb3c46a58", "name": "Commented-code block (7 lines) in src/app/match/[id]/page.tsx:54", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/match/[id]/page.tsx:54"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6b9794149ab554a6", "name": "Commented-code block (5 lines) in src/app/world-cup-2026/page.tsx:296", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/world-cup-2026/page.tsx:296"}, "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-b2a768263e4fc2f7", "name": "Commented-code block (5 lines) in src/app/api/cron/orchestrator/route.ts:43", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/cron/orchestrator/route.ts:43"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a0993e0766a0d31b", "name": "Commented-code block (5 lines) in src/app/predict/[id]/page.tsx:50", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/predict/[id]/page.tsx:50"}, "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-54ab34d0f00e9b4e", "name": "Commented-code block (5 lines) in src/app/teams/[slug]/page.tsx:47", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/teams/[slug]/page.tsx:47"}, "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-b0e2b51d5d417763", "name": "Commented-code block (5 lines) in src/lib/api.ts:11", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/api.ts: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-8fdca6adab62fbd6", "name": "Commented-code block (5 lines) in src/lib/cache.ts:143", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/cache.ts:143"}, "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-52197f9a7f13bcf7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ga4-reporting.ts:49", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ga4-reporting.ts:49"}, "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-5377d83d823561a1", "name": "Commented-code block (6 lines) in src/lib/match-snapshot.ts:354", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/match-snapshot.ts:354"}, "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-eadf77b071e11a3f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/rate-limiter.ts:23", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/rate-limiter.ts:23"}, "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-65aaf3b3eb6c9dcc", "name": "Commented-code block (8 lines) in src/lib/prewarm/worldcup.ts:301", "shortDescription": {"text": "Commented-code block (8 lines) in src/lib/prewarm/worldcup.ts:301"}, "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/21039"}, "properties": {"repository": "thachnn87/goalradar", "repoUrl": "https://github.com/thachnn87/goalradar", "branch": "main"}, "results": [{"ruleId": "scanner-bead75b0f9233e05", "level": "none", "message": {"text": "No API endpoints detected"}, "properties": {"repobilityId": "0f8bb852027c38f8", "scanner": "scanner-primary", "fingerprint": "bead75b0f9233e05", "layer": "api", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-7fb79096d263b032", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/Breadcrumb.tsx:26"}, "properties": {"repobilityId": "8e156425474ba28a", "scanner": "scanner-primary", "fingerprint": "7fb79096d263b032", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-b8f514c5b2a161a3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/MatchCard.tsx:83"}, "properties": {"repobilityId": "2d768d323f225ce3", "scanner": "scanner-primary", "fingerprint": "b8f514c5b2a161a3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4e67ef4c90186527", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/WCWatchCountryContent.tsx:174"}, "properties": {"repobilityId": "1b848dcdc27e3e62", "scanner": "scanner-primary", "fingerprint": "4e67ef4c90186527", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-765b21ad721df497", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/WCGroupPredictionsTemplate.tsx:184"}, "properties": {"repobilityId": "b1f5cd52e3113373", "scanner": "scanner-primary", "fingerprint": "765b21ad721df497", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-57a3fc6569c01e5c", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/WCGroupPredictionsTemplate.tsx:357"}, "properties": {"repobilityId": "a7a7782ff8bc7bb5", "scanner": "scanner-primary", "fingerprint": "57a3fc6569c01e5c", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-1d4d6e942111236d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/WCGroupTable.tsx:79"}, "properties": {"repobilityId": "e8e88eb10a9d0d98", "scanner": "scanner-primary", "fingerprint": "1d4d6e942111236d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-27ba6565ec6d1275", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/TimezoneBanner.tsx:41"}, "properties": {"repobilityId": "164ac1372772b1d8", "scanner": "scanner-primary", "fingerprint": "27ba6565ec6d1275", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9fdf2f020ad90a69", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/WCTeamPageContent.tsx:253"}, "properties": {"repobilityId": "b701f6ff4e396bc9", "scanner": "scanner-primary", "fingerprint": "9fdf2f020ad90a69", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f0ea6d5fda5f78ee", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/WCTeamPageContent.tsx:652"}, "properties": {"repobilityId": "ee96c3d08f48926e", "scanner": "scanner-primary", "fingerprint": "f0ea6d5fda5f78ee", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-fb7e5d27686c360c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/WCCountdownBanner.tsx:109"}, "properties": {"repobilityId": "1ba7bb21dabe4cc4", "scanner": "scanner-primary", "fingerprint": "fb7e5d27686c360c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8e39e1e6565bd8bd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/WCRoundPage.tsx:129"}, "properties": {"repobilityId": "66316041064c3184", "scanner": "scanner-primary", "fingerprint": "8e39e1e6565bd8bd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f7852638b5a1cbc1", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/WCRoundPage.tsx:114"}, "properties": {"repobilityId": "5b54af1d4615085e", "scanner": "scanner-primary", "fingerprint": "f7852638b5a1cbc1", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-b9af8d4e48d1a26d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/page.tsx:278"}, "properties": {"repobilityId": "e498d41b9221bfd3", "scanner": "scanner-primary", "fingerprint": "b9af8d4e48d1a26d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-07cb234169e74f84", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/page.tsx:417"}, "properties": {"repobilityId": "4d4ab3e03315f684", "scanner": "scanner-primary", "fingerprint": "07cb234169e74f84", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-cfcc16ec092cb752", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/match/[id]/page.tsx:1010"}, "properties": {"repobilityId": "d3b992a7be88cb0b", "scanner": "scanner-primary", "fingerprint": "cfcc16ec092cb752", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-987c5f07e2ffb832", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/match/[id]/page.tsx:2076"}, "properties": {"repobilityId": "314d48baf8bbc5ef", "scanner": "scanner-primary", "fingerprint": "987c5f07e2ffb832", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9ea7562d63d011b7", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/match/[id]/page.tsx:688"}, "properties": {"repobilityId": "e677262333f924b5", "scanner": "scanner-primary", "fingerprint": "9ea7562d63d011b7", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-df7f340761359150", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026-standings/page.tsx:149"}, "properties": {"repobilityId": "8f7c5b095f06e637", "scanner": "scanner-primary", "fingerprint": "df7f340761359150", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-3bffdea6eb6e15ef", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/world-cup-2026-results/page.tsx:221"}, "properties": {"repobilityId": "0b3bf5720d3e9d2d", "scanner": "scanner-primary", "fingerprint": "3bffdea6eb6e15ef", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d179ebbae9090a09", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026-results/page.tsx:132"}, "properties": {"repobilityId": "7f255af06f293e30", "scanner": "scanner-primary", "fingerprint": "d179ebbae9090a09", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-9f4aabbe4a7b5db6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/world-cup-2026/page.tsx:231"}, "properties": {"repobilityId": "7371f7db67fb0bc2", "scanner": "scanner-primary", "fingerprint": "9f4aabbe4a7b5db6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c443256e3d7f13c6", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/page.tsx:109"}, "properties": {"repobilityId": "025a270d855352cd", "scanner": "scanner-primary", "fingerprint": "c443256e3d7f13c6", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-ff63309e621eed54", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/world-cup-2026/bracket/page.tsx:171"}, "properties": {"repobilityId": "9349c1c3e176ac10", "scanner": "scanner-primary", "fingerprint": "ff63309e621eed54", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-75217f664df983ee", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/bracket/page.tsx:129"}, "properties": {"repobilityId": "c87a83dd6f27cf4f", "scanner": "scanner-primary", "fingerprint": "75217f664df983ee", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-bf8db3234ae669c4", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/matches/page.tsx:82"}, "properties": {"repobilityId": "465786e1350ec948", "scanner": "scanner-primary", "fingerprint": "bf8db3234ae669c4", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-3f67058c494084d4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/world-cup-2026/predictions/page.tsx:321"}, "properties": {"repobilityId": "72d89b0388357518", "scanner": "scanner-primary", "fingerprint": "3f67058c494084d4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9b68f7a8e4a0f505", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/predictions/page.tsx:126"}, "properties": {"repobilityId": "b18522bccd398794", "scanner": "scanner-primary", "fingerprint": "9b68f7a8e4a0f505", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-4c1df6a7e3acbc27", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/world-cup-2026/fixtures/page.tsx:241"}, "properties": {"repobilityId": "3626f8a8ecb8b123", "scanner": "scanner-primary", "fingerprint": "4c1df6a7e3acbc27", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-eec220caa0bedcb3", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/fixtures/page.tsx:135"}, "properties": {"repobilityId": "3675a151f9508dc3", "scanner": "scanner-primary", "fingerprint": "eec220caa0bedcb3", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-084df446eb0aaf07", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/groups/page.tsx:65"}, "properties": {"repobilityId": "c3b0f5ad339ce1f5", "scanner": "scanner-primary", "fingerprint": "084df446eb0aaf07", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-ac57810c398a5f8d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/world-cup-2026/teams/page.tsx:237"}, "properties": {"repobilityId": "7d690481a11a9ca5", "scanner": "scanner-primary", "fingerprint": "ac57810c398a5f8d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-506e363ed824b9b9", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/teams/page.tsx:89"}, "properties": {"repobilityId": "7b22ec46de5cfc5b", "scanner": "scanner-primary", "fingerprint": "506e363ed824b9b9", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-34357f9d999b0e7b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/world-cup-2026/teams/[slug]/page.tsx:528"}, "properties": {"repobilityId": "d1f22e5ec993f0cf", "scanner": "scanner-primary", "fingerprint": "34357f9d999b0e7b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1f7cd3910f5a8f81", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/teams/[slug]/page.tsx:415"}, "properties": {"repobilityId": "cd161fe4b1553a4d", "scanner": "scanner-primary", "fingerprint": "1f7cd3910f5a8f81", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-71a1befa00f7d25b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/world-cup-2026/matches-today/page.tsx:95"}, "properties": {"repobilityId": "59f76182921cfeac", "scanner": "scanner-primary", "fingerprint": "71a1befa00f7d25b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-36505d82e838493b", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/matches-today/page.tsx:387"}, "properties": {"repobilityId": "49a88dd282cc8e3b", "scanner": "scanner-primary", "fingerprint": "36505d82e838493b", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-02451e8127eed2cc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/world-cup-2026/[group]/page.tsx:207"}, "properties": {"repobilityId": "658a7a95d395ad12", "scanner": "scanner-primary", "fingerprint": "02451e8127eed2cc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-325471a66138119e", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/[group]/page.tsx:166"}, "properties": {"repobilityId": "a1cda97d06f3b803", "scanner": "scanner-primary", "fingerprint": "325471a66138119e", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-d22fe352cea88dd4", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/venues/page.tsx:95"}, "properties": {"repobilityId": "1f8cad1bd26cd909", "scanner": "scanner-primary", "fingerprint": "d22fe352cea88dd4", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-6dbee4b21f55d17f", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/venues/[venue]/page.tsx:141"}, "properties": {"repobilityId": "50dfd49594b88d7e", "scanner": "scanner-primary", "fingerprint": "6dbee4b21f55d17f", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-208de3d51271b94e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/world-cup-2026/watch-live/page.tsx:216"}, "properties": {"repobilityId": "a2187dad7befe5b5", "scanner": "scanner-primary", "fingerprint": "208de3d51271b94e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3cfc1f2aad0a4eb1", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/watch-live/page.tsx:302"}, "properties": {"repobilityId": "6f6b6fa77128b9a5", "scanner": "scanner-primary", "fingerprint": "3cfc1f2aad0a4eb1", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-54516a06c57c65e9", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/winner-predictions/page.tsx:211"}, "properties": {"repobilityId": "eadc053bb2ebb11c", "scanner": "scanner-primary", "fingerprint": "54516a06c57c65e9", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-3a0de53515925219", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/tv-schedule/page.tsx:111"}, "properties": {"repobilityId": "72036aa22152a56c", "scanner": "scanner-primary", "fingerprint": "3a0de53515925219", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-4fcbd25fea5aa562", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/tv-schedule/[country]/page.tsx:130"}, "properties": {"repobilityId": "d4a4e5ed6bfddcd4", "scanner": "scanner-primary", "fingerprint": "4fcbd25fea5aa562", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-68fe427659aa7ee2", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/golden-boot-predictions/page.tsx:160"}, "properties": {"repobilityId": "94e585b1a6cbbfde", "scanner": "scanner-primary", "fingerprint": "68fe427659aa7ee2", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-e7593440369e7ff7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/world-cup-2026/matches-tomorrow/page.tsx:124"}, "properties": {"repobilityId": "d6f861100060f1a9", "scanner": "scanner-primary", "fingerprint": "e7593440369e7ff7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0182f2c0e383834f", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/matches-tomorrow/page.tsx:344"}, "properties": {"repobilityId": "91451e6efae91de5", "scanner": "scanner-primary", "fingerprint": "0182f2c0e383834f", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-0bb62daa3b11aa74", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/host-cities/page.tsx:184"}, "properties": {"repobilityId": "8a72aeeb145d3104", "scanner": "scanner-primary", "fingerprint": "0bb62daa3b11aa74", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-de4c0b487bb54081", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026/streaming-guide/page.tsx:142"}, "properties": {"repobilityId": "6bc8acad997f43fb", "scanner": "scanner-primary", "fingerprint": "de4c0b487bb54081", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-065e7945e68615eb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/push/opt-in/route.ts:41"}, "properties": {"repobilityId": "a791d0ed68ff0bcd", "scanner": "scanner-primary", "fingerprint": "065e7945e68615eb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0f5c273cfc862fb2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/orchestrator/route.ts:162"}, "properties": {"repobilityId": "5f34e77f0286d4e7", "scanner": "scanner-primary", "fingerprint": "0f5c273cfc862fb2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4c9b517e63ab76fa", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/debug/provider-smoke/route.ts:119"}, "properties": {"repobilityId": "249a8352c7cb58ae", "scanner": "scanner-primary", "fingerprint": "4c9b517e63ab76fa", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-edeb7ebceb857fcd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/debug/provider-health/route.ts:113"}, "properties": {"repobilityId": "e726aff1c4f45860", "scanner": "scanner-primary", "fingerprint": "edeb7ebceb857fcd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0f54bf3e52a489e0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/telemetry/navigation/route.ts:19"}, "properties": {"repobilityId": "a6aa7f047738caeb", "scanner": "scanner-primary", "fingerprint": "0f54bf3e52a489e0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6d3aac3523a254ea", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/predict/[id]/page.tsx:378"}, "properties": {"repobilityId": "2d66e47b30312ab3", "scanner": "scanner-primary", "fingerprint": "6d3aac3523a254ea", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b85bd079885f8908", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/predict/[id]/page.tsx:112"}, "properties": {"repobilityId": "773b554c7533c4f8", "scanner": "scanner-primary", "fingerprint": "b85bd079885f8908", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-2802695ed3bad3c1", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026-bracket/page.tsx:166"}, "properties": {"repobilityId": "3acf545602923a6f", "scanner": "scanner-primary", "fingerprint": "2802695ed3bad3c1", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-cf2e03a7fa61ee0a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/teams/[slug]/page.tsx:363"}, "properties": {"repobilityId": "e2814dd4e068e7af", "scanner": "scanner-primary", "fingerprint": "cf2e03a7fa61ee0a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ae1d444e21fd8981", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/teams/[slug]/page.tsx:203"}, "properties": {"repobilityId": "296730b9355eb92b", "scanner": "scanner-primary", "fingerprint": "ae1d444e21fd8981", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-9965108a2213558e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/[alias]/page.tsx:110"}, "properties": {"repobilityId": "819563739660e440", "scanner": "scanner-primary", "fingerprint": "9965108a2213558e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d1cb6274fe2f9394", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/world-cup-2026-groups/page.tsx:153"}, "properties": {"repobilityId": "b1a4cf02a6c044a4", "scanner": "scanner-primary", "fingerprint": "d1cb6274fe2f9394", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3b41790b137190d0", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026-groups/page.tsx:99"}, "properties": {"repobilityId": "2d988bc30d0169ee", "scanner": "scanner-primary", "fingerprint": "3b41790b137190d0", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-f52fa7db1dd8de86", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/performance/page.tsx:308"}, "properties": {"repobilityId": "d124f20216a98f4c", "scanner": "scanner-primary", "fingerprint": "f52fa7db1dd8de86", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-af11cae20195691a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/world-cup-2026-predictions/page.tsx:192"}, "properties": {"repobilityId": "88d3a07b3e1f41bd", "scanner": "scanner-primary", "fingerprint": "af11cae20195691a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-42adac8b2053020e", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026-predictions/page.tsx:125"}, "properties": {"repobilityId": "9b5cedf03320a5cb", "scanner": "scanner-primary", "fingerprint": "42adac8b2053020e", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-a9c0f62fc787a47a", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/competition/[code]/page.tsx:103"}, "properties": {"repobilityId": "5d6ad2a5d7cddda3", "scanner": "scanner-primary", "fingerprint": "a9c0f62fc787a47a", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-ba166cf158717fdd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/world-cup-2026-schedule/page.tsx:285"}, "properties": {"repobilityId": "917232c7c547ef56", "scanner": "scanner-primary", "fingerprint": "ba166cf158717fdd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0cbc8ee51ea8504b", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026-schedule/page.tsx:193"}, "properties": {"repobilityId": "6f90fb27f6d8c496", "scanner": "scanner-primary", "fingerprint": "0cbc8ee51ea8504b", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-1ed685cb5cf14027", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026-live-stream/page.tsx:133"}, "properties": {"repobilityId": "00adc8619b86f4e0", "scanner": "scanner-primary", "fingerprint": "1ed685cb5cf14027", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-251f4ca30eaaba4a", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/world-cup-2026-tv-guide/page.tsx:145"}, "properties": {"repobilityId": "d7b3fc3f685c9499", "scanner": "scanner-primary", "fingerprint": "251f4ca30eaaba4a", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-465234adca5151e2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/cache.ts:108"}, "properties": {"repobilityId": "dfa144e3e7990e88", "scanner": "scanner-primary", "fingerprint": "465234adca5151e2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2eb1a7b8817cc178", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/api-audit.ts:103"}, "properties": {"repobilityId": "889a0a997c01941c", "scanner": "scanner-primary", "fingerprint": "2eb1a7b8817cc178", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d98176eac98b4097", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/match-state-overlay.ts:92"}, "properties": {"repobilityId": "3f91f78dbb89907a", "scanner": "scanner-primary", "fingerprint": "d98176eac98b4097", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c8b6d18875109ef4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/rate-safe.ts:145"}, "properties": {"repobilityId": "1daf0af79c5fb2cd", "scanner": "scanner-primary", "fingerprint": "c8b6d18875109ef4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6481a4f3551e678a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/live-cache.ts:143"}, "properties": {"repobilityId": "c299faeff403cbf3", "scanner": "scanner-primary", "fingerprint": "6481a4f3551e678a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6fa86b9d8f330d16", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/kv-cache.ts:121"}, "properties": {"repobilityId": "094141cff42e4bbb", "scanner": "scanner-primary", "fingerprint": "6fa86b9d8f330d16", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8cdbd7885ff0c3fd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/refresh.ts:197"}, "properties": {"repobilityId": "a3ff71d507001eed", "scanner": "scanner-primary", "fingerprint": "8cdbd7885ff0c3fd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-aab551367e6c18e8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/revalidation.ts:116"}, "properties": {"repobilityId": "b0340e4c3df5e838", "scanner": "scanner-primary", "fingerprint": "aab551367e6c18e8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-22716566c7792fb7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/data-source-tracker.ts:54"}, "properties": {"repobilityId": "fa06b88a1757735f", "scanner": "scanner-primary", "fingerprint": "22716566c7792fb7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-829a22b4ef2fbcec", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/match-snapshot.ts:204"}, "properties": {"repobilityId": "44cf909962b34ad9", "scanner": "scanner-primary", "fingerprint": "829a22b4ef2fbcec", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b4b3e1532f88ec6d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/rate-limiter.ts:73"}, "properties": {"repobilityId": "6d8ba4eb81022a15", "scanner": "scanner-primary", "fingerprint": "b4b3e1532f88ec6d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d2b8834596d34dc3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/providers/football-data.ts:79"}, "properties": {"repobilityId": "5eb6c9e394671d91", "scanner": "scanner-primary", "fingerprint": "d2b8834596d34dc3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d5044820f46a3448", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/providers/manager.ts:70"}, "properties": {"repobilityId": "cde1666fe4c93232", "scanner": "scanner-primary", "fingerprint": "d5044820f46a3448", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b8b43887dc4fad51", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/prewarm/worldcup.ts:313"}, "properties": {"repobilityId": "b0df6786bdbca207", "scanner": "scanner-primary", "fingerprint": "b8b43887dc4fad51", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e3e313cbbec913f6", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/crawl-links.mjs:33"}, "properties": {"repobilityId": "796611329d554100", "scanner": "scanner-primary", "fingerprint": "e3e313cbbec913f6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/crawl-links.mjs"}, "region": {"startLine": 33}}}]}, {"ruleId": "scanner-31eaf96fdf38a362", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/Breadcrumb.tsx:26"}, "properties": {"repobilityId": "4bf882d361c01e58", "scanner": "scanner-primary", "fingerprint": "31eaf96fdf38a362", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/Breadcrumb.tsx"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-f05525d59c912a91", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/WCWatchCountryContent.tsx:174"}, "properties": {"repobilityId": "69469ebb9636e8a7", "scanner": "scanner-primary", "fingerprint": "f05525d59c912a91", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/WCWatchCountryContent.tsx"}, "region": {"startLine": 174}}}]}, {"ruleId": "scanner-cc488d6257dfcfea", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/WCTeamPageContent.tsx:652"}, "properties": {"repobilityId": "059645e74cd0b3cc", "scanner": "scanner-primary", "fingerprint": "cc488d6257dfcfea", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/WCTeamPageContent.tsx"}, "region": {"startLine": 652}}}]}, {"ruleId": "scanner-2d2e4ad488b0aada", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/WCRoundPage.tsx:114"}, "properties": {"repobilityId": "d32d362caf113055", "scanner": "scanner-primary", "fingerprint": "2d2e4ad488b0aada", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/WCRoundPage.tsx"}, "region": {"startLine": 114}}}]}, {"ruleId": "scanner-87b9ca09954873bb", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/page.tsx:417"}, "properties": {"repobilityId": "88fd235b712bda65", "scanner": "scanner-primary", "fingerprint": "87b9ca09954873bb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/page.tsx"}, "region": {"startLine": 417}}}]}, {"ruleId": "scanner-f5f1c3fa384da6d9", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/match/[id]/page.tsx:688"}, "properties": {"repobilityId": "8577beb8ac663f9a", "scanner": "scanner-primary", "fingerprint": "f5f1c3fa384da6d9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/match/[id]/page.tsx"}, "region": {"startLine": 688}}}]}, {"ruleId": "scanner-1d02cb5a2f538f4b", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026-standings/page.tsx:149"}, "properties": {"repobilityId": "9091614f0b147d15", "scanner": "scanner-primary", "fingerprint": "1d02cb5a2f538f4b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/world-cup-2026-standings/page.tsx"}, "region": {"startLine": 149}}}]}, {"ruleId": "scanner-6e3df0f5c201b709", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026-results/page.tsx:132"}, "properties": {"repobilityId": "3cb5fe64d2dfc80d", "scanner": "scanner-primary", "fingerprint": "6e3df0f5c201b709", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/world-cup-2026-results/page.tsx"}, "region": {"startLine": 132}}}]}, {"ruleId": "scanner-4ed64d54a9c63f7d", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/page.tsx:109"}, "properties": {"repobilityId": "b4a5410f0544a76a", "scanner": "scanner-primary", "fingerprint": "4ed64d54a9c63f7d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/world-cup-2026/page.tsx"}, "region": {"startLine": 109}}}]}, {"ruleId": "scanner-2bc25ef7129e9e3a", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/bracket/page.tsx:129"}, "properties": {"repobilityId": "bfdcdd6fc25555d8", "scanner": "scanner-primary", "fingerprint": "2bc25ef7129e9e3a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/world-cup-2026/bracket/page.tsx"}, "region": {"startLine": 129}}}]}, {"ruleId": "scanner-9e373c68d5e7be5c", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/matches/page.tsx:82"}, "properties": {"repobilityId": "5d55372dc51fd0a5", "scanner": "scanner-primary", "fingerprint": "9e373c68d5e7be5c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/world-cup-2026/matches/page.tsx"}, "region": {"startLine": 82}}}]}, {"ruleId": "scanner-181fc5a715c2edb5", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/predictions/page.tsx:126"}, "properties": {"repobilityId": "11784816017c3f44", "scanner": "scanner-primary", "fingerprint": "181fc5a715c2edb5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/world-cup-2026/predictions/page.tsx"}, "region": {"startLine": 126}}}]}, {"ruleId": "scanner-eb42e24bb74c5c61", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/groups/page.tsx:65"}, "properties": {"repobilityId": "f80aa4e4b265a764", "scanner": "scanner-primary", "fingerprint": "eb42e24bb74c5c61", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/world-cup-2026/groups/page.tsx"}, "region": {"startLine": 65}}}]}, {"ruleId": "scanner-5869d3606cc55193", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/teams/page.tsx:89"}, "properties": {"repobilityId": "9b9c122db7440b54", "scanner": "scanner-primary", "fingerprint": "5869d3606cc55193", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/world-cup-2026/teams/page.tsx"}, "region": {"startLine": 89}}}]}, {"ruleId": "scanner-64bcfaddbe43360a", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/teams/[slug]/page.tsx:415"}, "properties": {"repobilityId": "3f4e49d6820552cd", "scanner": "scanner-primary", "fingerprint": "64bcfaddbe43360a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/world-cup-2026/teams/[slug]/page.tsx"}, "region": {"startLine": 415}}}]}, {"ruleId": "scanner-a1cba44c2363fa22", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/matches-today/page.tsx:387"}, "properties": {"repobilityId": "0cb6efa113458f81", "scanner": "scanner-primary", "fingerprint": "a1cba44c2363fa22", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/world-cup-2026/matches-today/page.tsx"}, "region": {"startLine": 387}}}]}, {"ruleId": "scanner-0c98fa73a12c0a3f", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/[group]/page.tsx:166"}, "properties": {"repobilityId": "176e0ce7d831b7b8", "scanner": "scanner-primary", "fingerprint": "0c98fa73a12c0a3f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/world-cup-2026/[group]/page.tsx"}, "region": {"startLine": 166}}}]}, {"ruleId": "scanner-812fe0057c430960", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/venues/page.tsx:95"}, "properties": {"repobilityId": "d76aaddcee3e0aee", "scanner": "scanner-primary", "fingerprint": "812fe0057c430960", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/world-cup-2026/venues/page.tsx"}, "region": {"startLine": 95}}}]}, {"ruleId": "scanner-0a0e4bf14beb0f06", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/venues/[venue]/page.tsx:141"}, "properties": {"repobilityId": "d2c6734b80dc3a97", "scanner": "scanner-primary", "fingerprint": "0a0e4bf14beb0f06", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/world-cup-2026/venues/[venue]/page.tsx"}, "region": {"startLine": 141}}}]}, {"ruleId": "scanner-037dc25de88a9836", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/watch-live/page.tsx:302"}, "properties": {"repobilityId": "2d074b01dd0173c9", "scanner": "scanner-primary", "fingerprint": "037dc25de88a9836", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/world-cup-2026/watch-live/page.tsx"}, "region": {"startLine": 302}}}]}, {"ruleId": "scanner-8da0b00b7b436afd", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/winner-predictions/page.tsx:211"}, "properties": {"repobilityId": "be85f559268c9fbb", "scanner": "scanner-primary", "fingerprint": "8da0b00b7b436afd", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/world-cup-2026/winner-predictions/page.tsx"}, "region": {"startLine": 211}}}]}, {"ruleId": "scanner-d706ea0794597c63", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/tv-schedule/page.tsx:111"}, "properties": {"repobilityId": "3f6dba0747e27539", "scanner": "scanner-primary", "fingerprint": "d706ea0794597c63", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/world-cup-2026/tv-schedule/page.tsx"}, "region": {"startLine": 111}}}]}, {"ruleId": "scanner-8b374034defe1519", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/tv-schedule/[country]/page.tsx:130"}, "properties": {"repobilityId": "edda787250893c9c", "scanner": "scanner-primary", "fingerprint": "8b374034defe1519", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/world-cup-2026/tv-schedule/[country]/page.tsx"}, "region": {"startLine": 130}}}]}, {"ruleId": "scanner-bcfa4cd6ed51c875", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/golden-boot-predictions/page.tsx:160"}, "properties": {"repobilityId": "526ddd0ad6f6316e", "scanner": "scanner-primary", "fingerprint": "bcfa4cd6ed51c875", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/world-cup-2026/golden-boot-predictions/page.tsx"}, "region": {"startLine": 160}}}]}, {"ruleId": "scanner-38147c1e2b0d7837", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/matches-tomorrow/page.tsx:344"}, "properties": {"repobilityId": "864d67a6f7dfed77", "scanner": "scanner-primary", "fingerprint": "38147c1e2b0d7837", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/world-cup-2026/matches-tomorrow/page.tsx"}, "region": {"startLine": 344}}}]}, {"ruleId": "scanner-fa482e84fec7fa33", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/host-cities/page.tsx:184"}, "properties": {"repobilityId": "ab38e8ad6f44ab62", "scanner": "scanner-primary", "fingerprint": "fa482e84fec7fa33", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/world-cup-2026/host-cities/page.tsx"}, "region": {"startLine": 184}}}]}, {"ruleId": "scanner-2f95e06a4cf2ad46", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026/streaming-guide/page.tsx:142"}, "properties": {"repobilityId": "2e18edbed3aaf0ba", "scanner": "scanner-primary", "fingerprint": "2f95e06a4cf2ad46", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/world-cup-2026/streaming-guide/page.tsx"}, "region": {"startLine": 142}}}]}, {"ruleId": "scanner-6d8e2c4505f4da21", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/predict/[id]/page.tsx:112"}, "properties": {"repobilityId": "259965403585e0f3", "scanner": "scanner-primary", "fingerprint": "6d8e2c4505f4da21", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/predict/[id]/page.tsx"}, "region": {"startLine": 112}}}]}, {"ruleId": "scanner-d24ae5467633c1ec", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026-bracket/page.tsx:166"}, "properties": {"repobilityId": "6bff03e78fb1109d", "scanner": "scanner-primary", "fingerprint": "d24ae5467633c1ec", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/world-cup-2026-bracket/page.tsx"}, "region": {"startLine": 166}}}]}, {"ruleId": "scanner-6e78e3907c6c5b6d", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/teams/[slug]/page.tsx:203"}, "properties": {"repobilityId": "07ee875067d7adc3", "scanner": "scanner-primary", "fingerprint": "6e78e3907c6c5b6d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/teams/[slug]/page.tsx"}, "region": {"startLine": 203}}}]}, {"ruleId": "scanner-f4896b2f1b918422", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026-groups/page.tsx:99"}, "properties": {"repobilityId": "1b2e434ba4970f58", "scanner": "scanner-primary", "fingerprint": "f4896b2f1b918422", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/world-cup-2026-groups/page.tsx"}, "region": {"startLine": 99}}}]}, {"ruleId": "scanner-e651c66dccf0c6ea", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026-predictions/page.tsx:125"}, "properties": {"repobilityId": "63a042ad2735ed06", "scanner": "scanner-primary", "fingerprint": "e651c66dccf0c6ea", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/world-cup-2026-predictions/page.tsx"}, "region": {"startLine": 125}}}]}, {"ruleId": "scanner-60ac4f33688dcc91", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/competition/[code]/page.tsx:103"}, "properties": {"repobilityId": "15170f484c8ee0c6", "scanner": "scanner-primary", "fingerprint": "60ac4f33688dcc91", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/competition/[code]/page.tsx"}, "region": {"startLine": 103}}}]}, {"ruleId": "scanner-d1bfaf6e59d0dc7f", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026-schedule/page.tsx:193"}, "properties": {"repobilityId": "bc359e7e6ac8cbff", "scanner": "scanner-primary", "fingerprint": "d1bfaf6e59d0dc7f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/world-cup-2026-schedule/page.tsx"}, "region": {"startLine": 193}}}]}, {"ruleId": "scanner-2c811d95ded3f50b", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026-live-stream/page.tsx:133"}, "properties": {"repobilityId": "019be35c3753d339", "scanner": "scanner-primary", "fingerprint": "2c811d95ded3f50b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/world-cup-2026-live-stream/page.tsx"}, "region": {"startLine": 133}}}]}, {"ruleId": "scanner-badc445a015a5847", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/world-cup-2026-tv-guide/page.tsx:145"}, "properties": {"repobilityId": "3e9283d8ecda546c", "scanner": "scanner-primary", "fingerprint": "badc445a015a5847", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/world-cup-2026-tv-guide/page.tsx"}, "region": {"startLine": 145}}}]}, {"ruleId": "scanner-4eb7d223c56302c0", "level": "note", "message": {"text": "Very large file: src/app/match/[id]/page.tsx (2312 lines)"}, "properties": {"repobilityId": "b2f0cd0d3eb62d51", "scanner": "scanner-primary", "fingerprint": "4eb7d223c56302c0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6f58e5e22290fdce", "level": "note", "message": {"text": "Very large file: src/lib/wc-tv-countries.ts (1418 lines)"}, "properties": {"repobilityId": "3dd7a2465797cd53", "scanner": "scanner-primary", "fingerprint": "6f58e5e22290fdce", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1044ed6968fb0f5f", "level": "note", "message": {"text": "Very large file: src/lib/wc-venues.ts (1037 lines)"}, "properties": {"repobilityId": "41c108b92a982410", "scanner": "scanner-primary", "fingerprint": "1044ed6968fb0f5f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "38d86679c458b4a3", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-faccb9061e9b52a0", "level": "note", "message": {"text": "No README detected"}, "properties": {"repobilityId": "8515553872107981", "scanner": "scanner-primary", "fingerprint": "faccb9061e9b52a0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["docs", "readme", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "c3ec75a90e49fdf6", "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": "49fe2e0da4e2fce6", "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": "4a2d620193f11951", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "0052713d4befb550", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "1dc2f2ff4e93f1e8", "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": "c819e8b5286a2c80", "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": "e071fd2e8eb839ae", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-505bc666a82f9849", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: .claude/settings.local.json"}, "properties": {"repobilityId": "777970b0fce0a93b", "scanner": "scanner-primary", "fingerprint": "505bc666a82f9849", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/settings.local.json"}, "region": {"startLine": 6}}}]}, {"ruleId": "scanner-ecb0d2c55ed6875d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/settings.local.json"}, "properties": {"repobilityId": "d8bae33a6d517bf0", "scanner": "scanner-primary", "fingerprint": "ecb0d2c55ed6875d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/settings.local.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2c5f98b152cddb6d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/launch.json"}, "properties": {"repobilityId": "0de48c0f4ab303d8", "scanner": "scanner-primary", "fingerprint": "2c5f98b152cddb6d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/launch.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-09ff26685a4c6850", "level": "none", "message": {"text": "Commented-code block (7 lines) in next.config.ts:198"}, "properties": {"repobilityId": "878ad3f5fcb3ef22", "scanner": "scanner-primary", "fingerprint": "09ff26685a4c6850", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-917983cdf66eefee", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/sitemap.ts:44"}, "properties": {"repobilityId": "ff188858c4a95e63", "scanner": "scanner-primary", "fingerprint": "917983cdf66eefee", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-df4a2803521835dd", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/page.tsx:573"}, "properties": {"repobilityId": "15c8eb0bcd09c098", "scanner": "scanner-primary", "fingerprint": "df4a2803521835dd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d9ff9daeb3c46a58", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/match/[id]/page.tsx:54"}, "properties": {"repobilityId": "ce4e601ad83a9566", "scanner": "scanner-primary", "fingerprint": "d9ff9daeb3c46a58", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6b9794149ab554a6", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/world-cup-2026/page.tsx:296"}, "properties": {"repobilityId": "35a1d452898e5a9f", "scanner": "scanner-primary", "fingerprint": "6b9794149ab554a6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b2a768263e4fc2f7", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/cron/orchestrator/route.ts:43"}, "properties": {"repobilityId": "7edd03974af75109", "scanner": "scanner-primary", "fingerprint": "b2a768263e4fc2f7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a0993e0766a0d31b", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/predict/[id]/page.tsx:50"}, "properties": {"repobilityId": "4575299f1b80a961", "scanner": "scanner-primary", "fingerprint": "a0993e0766a0d31b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-54ab34d0f00e9b4e", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/teams/[slug]/page.tsx:47"}, "properties": {"repobilityId": "a7c5681714ce5ed4", "scanner": "scanner-primary", "fingerprint": "54ab34d0f00e9b4e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b0e2b51d5d417763", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/api.ts:11"}, "properties": {"repobilityId": "4f41c151768438c8", "scanner": "scanner-primary", "fingerprint": "b0e2b51d5d417763", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8fdca6adab62fbd6", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/cache.ts:143"}, "properties": {"repobilityId": "93aba87ea3da6506", "scanner": "scanner-primary", "fingerprint": "8fdca6adab62fbd6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-52197f9a7f13bcf7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ga4-reporting.ts:49"}, "properties": {"repobilityId": "9529202e459ad547", "scanner": "scanner-primary", "fingerprint": "52197f9a7f13bcf7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5377d83d823561a1", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/match-snapshot.ts:354"}, "properties": {"repobilityId": "b0713aedcf4195c6", "scanner": "scanner-primary", "fingerprint": "5377d83d823561a1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-eadf77b071e11a3f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/rate-limiter.ts:23"}, "properties": {"repobilityId": "3c7b9460f90b603c", "scanner": "scanner-primary", "fingerprint": "eadf77b071e11a3f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-65aaf3b3eb6c9dcc", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/lib/prewarm/worldcup.ts:301"}, "properties": {"repobilityId": "0d3ed9ac78237a7b", "scanner": "scanner-primary", "fingerprint": "65aaf3b3eb6c9dcc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}]}]}