{"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-644c71b33a04db49", "name": "Possibly dead Python function: rpc", "shortDescription": {"text": "Possibly dead Python function: rpc"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ac15e767140b9ff", "name": "Possibly dead Python function: repl", "shortDescription": {"text": "Possibly dead Python function: repl"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-20f7e1f93303ef45", "name": "Possibly dead Python function: insert_club", "shortDescription": {"text": "Possibly dead Python function: insert_club"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ed8d48c44895b014", "name": "Possibly dead Python function: link_venues_to_club", "shortDescription": {"text": "Possibly dead Python function: link_venues_to_club"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-41c8323dee7b559f", "name": "Possibly dead Python function: fake_fetch", "shortDescription": {"text": "Possibly dead Python function: fake_fetch"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c948e1403bb28b26", "name": "Possibly dead Python function: always_timeout", "shortDescription": {"text": "Possibly dead Python function: always_timeout"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-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-36ead0b17a4bb767", "name": "`truncate` class without `title=` for hover reveal \u2014 components/layout/MobileNav.tsx:92", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/layout/MobileNav.tsx:92"}, "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-c673de143d0bc3db", "name": "`truncate` class without `title=` for hover reveal \u2014 components/layout/Nav.tsx:144", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/layout/Nav.tsx:144"}, "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-696441a5369093fc", "name": "`truncate` class without `title=` for hover reveal \u2014 components/venue/VenueInfoCard.tsx:109", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/venue/VenueInfoCard.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-eb557a439306f95b", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 components/home/HomeFAQ.tsx:89", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/home/HomeFAQ.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-29748eacf7381975", "name": "`truncate` class without `title=` for hover reveal \u2014 components/home/HomeTopSpots.tsx:129", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/home/HomeTopSpots.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-0694f96580cc5c06", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/[locale]/[sport]/[country]/[city]/CityPageView.tsx:497", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/[locale]/[sport]/[country]/[city]/CityPageView.tsx:497"}, "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-722b687cc0ba0470", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/[locale]/famille/retraites/page.tsx:172", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/[locale]/famille/retraites/page.tsx:172"}, "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-2025f4e563ded3b8", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/[locale]/sports/[sport]/page.tsx:352", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/[locale]/sports/[sport]/page.tsx:352"}, "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-0c352cdfb3857116", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/[locale]/venue/[slug]/page.tsx:152", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/[locale]/venue/[slug]/page.tsx:152"}, "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-5df60562959419ec", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/[locale]/villes/page.tsx:163", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/[locale]/villes/page.tsx:163"}, "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-e2c115efae2ee320", "name": "`truncate` class without `title=` for hover reveal \u2014 app/[locale]/disciplines/[sport]/page.tsx:204", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/[locale]/disciplines/[sport]/page.tsx:204"}, "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-508a780192f32ae9", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/[locale]/disciplines/[sport]/page.tsx:161", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/[locale]/disciplines/[sport]/page.tsx:161"}, "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-d509c53afff5acf4", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/[locale]/club/[slug]/page.tsx:234", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/[locale]/club/[slug]/page.tsx:234"}, "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-b0ac5855967eab19", "name": "`truncate` class without `title=` for hover reveal \u2014 app/[locale]/map/ExplorePicker.tsx:124", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/[locale]/map/ExplorePicker.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-a63a1017c4e717d1", "name": "`truncate` class without `title=` for hover reveal \u2014 app/[locale]/map/SportFilters.tsx:272", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/[locale]/map/SportFilters.tsx:272"}, "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-0dbc1cbd34e2065b", "name": "`truncate` class without `title=` for hover reveal \u2014 app/[locale]/map/VenueListPanel.tsx:84", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/[locale]/map/VenueListPanel.tsx:84"}, "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-ec937ba879b92cc3", "name": "Stray `console.log` in TS/JS \u2014 lib/monitoring.ts:55", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/monitoring.ts:55"}, "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-0ad53199039bed76", "name": "TODO/FIXME marker in shipping code \u2014 lib/email/send-claim-resolution.ts:142", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 lib/email/send-claim-resolution.ts:142"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-596fff93ca749fe5", "name": "Stray `console.log` in TS/JS \u2014 lib/email/send-claim-resolution.ts:145", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/email/send-claim-resolution.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-ecb2482268282984", "name": "Stray `console.log` in TS/JS \u2014 lib/cron/log.ts:25", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/cron/log.ts:25"}, "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-7d9c419c9031a5e7", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 lib/seo/metadata.ts:368", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 lib/seo/metadata.ts:368"}, "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-6ab32c69c87def95", "name": "Insecure pattern 'dangerous_innerhtml' in components/home/HomeFAQ.tsx:89", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in components/home/HomeFAQ.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-372dea3f4529865d", "name": "Insecure pattern 'dangerous_innerhtml' in app/[locale]/[sport]/[country]/[city]/CityPageView.tsx:497", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/[locale]/[sport]/[country]/[city]/CityPageView.tsx:497"}, "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-a674bfc2235eaa8d", "name": "Insecure pattern 'dangerous_innerhtml' in app/[locale]/famille/retraites/page.tsx:172", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/[locale]/famille/retraites/page.tsx:172"}, "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-37b3fba8e277f862", "name": "Insecure pattern 'dangerous_innerhtml' in app/[locale]/sports/[sport]/page.tsx:352", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/[locale]/sports/[sport]/page.tsx:352"}, "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-e2640f95cd1a1b5b", "name": "Insecure pattern 'dangerous_innerhtml' in app/[locale]/venue/[slug]/page.tsx:152", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/[locale]/venue/[slug]/page.tsx:152"}, "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-b7e6cd5c639da619", "name": "Insecure pattern 'dangerous_innerhtml' in app/[locale]/villes/page.tsx:163", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/[locale]/villes/page.tsx:163"}, "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-2940f103e66e3cbd", "name": "Insecure pattern 'dangerous_innerhtml' in app/[locale]/disciplines/[sport]/page.tsx:161", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/[locale]/disciplines/[sport]/page.tsx:161"}, "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-f297b752022286bc", "name": "Insecure pattern 'dangerous_innerhtml' in app/[locale]/club/[slug]/page.tsx:234", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/[locale]/club/[slug]/page.tsx:234"}, "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-ad88519658c1431b", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-be11bd67eb628195", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9cc832136adf6d40", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-576189cc6843b204", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-27924aa79fa4a517", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-80d29923f673ad57", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-757fbfbac76901b9", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-176a661fe4c8d6b8", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-feac4317db0ce079", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ac933409a87b735b", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-abe8b46f42cdc6b9", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-59514880abca4666", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6d33c99489fd8c04", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cf3d6b794c9e40f2", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-01fd54e844eb6d7c", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1ea597004ccd4713", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0e4694c2a6d58e55", "name": "Very large file: app/[locale]/map/MapClient.tsx (1211 lines)", "shortDescription": {"text": "Very large file: app/[locale]/map/MapClient.tsx (1211 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea3b5e389d8c9c0f", "name": "Low test-to-source ratio", "shortDescription": {"text": "Low test-to-source ratio"}, "fullDescription": {"text": "54 tests / 217 src (ratio 0.25)."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 386 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 35 placeholder/mock markers across 15 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-9d79c4077342a7d0", "name": "Runtime service client appears to use placeholder configuration", "shortDescription": {"text": "Runtime service client appears to use placeholder configuration"}, "fullDescription": {"text": "A runtime source file appears to wire Supabase/Firebase/AI/payment-style clients to placeholder URLs, keys, or fallback values. In the Fable corpus this often means the UI/API shape is present while the backend service is not actually configured."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d71afdc0d5edadec", "name": "Commented-code block (6 lines) in next.config.js:28", "shortDescription": {"text": "Commented-code block (6 lines) in next.config.js:28"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c03df8f0074d0ad3", "name": "Commented-code block (12 lines) in middleware.ts:7", "shortDescription": {"text": "Commented-code block (12 lines) in middleware.ts:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-40addefab4afcbbb", "name": "Commented-code block (5 lines) in test/server-only-stub.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in test/server-only-stub.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0962f5e383fb6f0c", "name": "Commented-code block (6 lines) in scripts/check-migrations.test.mjs:73", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/check-migrations.test.mjs:73"}, "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-64e7d371cecb54e3", "name": "Commented-code block (5 lines) in scripts/seo-smoke.mjs:54", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/seo-smoke.mjs: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-90fe5edb7fa520b6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/seo-smoke.mjs:80", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/seo-smoke.mjs:80"}, "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-b81c9daf6f09dcf4", "name": "Commented-code block (8 lines) in scripts/generate_venue_tiles.py:68", "shortDescription": {"text": "Commented-code block (8 lines) in scripts/generate_venue_tiles.py:68"}, "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-c70820e0caea4229", "name": "Network/subprocess call without timeout or try/except \u2014 scripts/generate_venue_tiles.py:194", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/generate_venue_tiles.py:194"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4dd880eca64efc05", "name": "Legacy-named symbol `import_v1` in scripts/backfill_surface_osm.py:9", "shortDescription": {"text": "Legacy-named symbol `import_v1` in scripts/backfill_surface_osm.py:9"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-afff6c6a9922d68a", "name": "Commented-code block (6 lines) in scripts/backfill_surface_osm.py:191", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/backfill_surface_osm.py:191"}, "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-9ba9e81e3b439fa3", "name": "Legacy-named symbol `import_enrichments_v1` in scripts/import_enrichments_v1.py:10", "shortDescription": {"text": "Legacy-named symbol `import_enrichments_v1` in scripts/import_enrichments_v1.py:10"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-05391a89c02f755d", "name": "Commented-code block (7 lines) in scripts/import_enrichments_v1.py:2", "shortDescription": {"text": "Commented-code block (7 lines) in scripts/import_enrichments_v1.py:2"}, "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-b37e7f343f4fff4a", "name": "Legacy-named symbol `import_v1` in scripts/import_overture.py:70", "shortDescription": {"text": "Legacy-named symbol `import_v1` in scripts/import_overture.py:70"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b0c202fd21a76c57", "name": "Commented-code block (5 lines) in scripts/import_overture.py:162", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/import_overture.py:162"}, "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-60f3f9b6741bbeff", "name": "Commented-code block (6 lines) in scripts/backfill_family_null_sport.py:2", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/backfill_family_null_sport.py:2"}, "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-c8227f31881df551", "name": "Legacy-named symbol `import_v1` in scripts/import_v1.py:11", "shortDescription": {"text": "Legacy-named symbol `import_v1` in scripts/import_v1.py:11"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a3813932842510aa", "name": "Commented-code block (8 lines) in scripts/import_v1.py:2", "shortDescription": {"text": "Commented-code block (8 lines) in scripts/import_v1.py:2"}, "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-ca9d04156a403657", "name": "Commented-code block (6 lines) in scripts/backfill_courts_count.py:53", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/backfill_courts_count.py:53"}, "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-be647bf088a5afb4", "name": "Commented-code block (8 lines) in scripts/scrape_playtomic_padel_fr.py:52", "shortDescription": {"text": "Commented-code block (8 lines) in scripts/scrape_playtomic_padel_fr.py:52"}, "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-224c5ad0c48b8ea5", "name": "Commented-code block (5 lines) in scripts/cluster_clubs.py:810", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/cluster_clubs.py:810"}, "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-58f2a5f93180ea59", "name": "Commented-code block (6 lines) in components/SearchBar.tsx:88", "shortDescription": {"text": "Commented-code block (6 lines) in components/SearchBar.tsx:88"}, "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-9b3fa3f63374cc7d", "name": "Commented-code block (5 lines) in components/venue/VenueCard.tsx:73", "shortDescription": {"text": "Commented-code block (5 lines) in components/venue/VenueCard.tsx:73"}, "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-64726b3945bf15a0", "name": "Commented-code block (5 lines) in app/api/admin/cron/run-all/route.ts:28", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/admin/cron/run-all/route.ts:28"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-225efeefbd662cad", "name": "Commented-code block (6 lines) in app/api/venues/route.ts:179", "shortDescription": {"text": "Commented-code block (6 lines) in app/api/venues/route.ts:179"}, "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-74a4dcd6465e47d4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/cron/refresh-paragliding/route.ts:171", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/cron/refresh-paragliding/route.ts:171"}, "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-ecfc45c642aaaf1e", "name": "Legacy-named symbol `import_enrichments_v1` in app/api/cron/refresh-wikidata/route.ts:5", "shortDescription": {"text": "Legacy-named symbol `import_enrichments_v1` in app/api/cron/refresh-wikidata/route.ts:5"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a8be038ff639ff47", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/cron/refresh-wikidata/route.ts:53", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/cron/refresh-wikidata/route.ts:53"}, "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-30d0116898150290", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/cron/refresh-diving/route.ts:82", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/cron/refresh-diving/route.ts:82"}, "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-e3671723fcee2192", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/cron/refresh-hyrox/route.ts:147", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/cron/refresh-hyrox/route.ts:147"}, "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-f494ae255e82d981", "name": "Commented-code block (5 lines) in app/api/go/[id]/route.ts:99", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/go/[id]/route.ts:99"}, "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-1747aa4c160e6e95", "name": "Commented-code block (5 lines) in app/[locale]/[sport]/[country]/[city]/page.tsx:13", "shortDescription": {"text": "Commented-code block (5 lines) in app/[locale]/[sport]/[country]/[city]/page.tsx:13"}, "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-51dfdb3433ad2d54", "name": "Commented-code block (5 lines) in app/[locale]/[sport]/[country]/[city]/CityPageView.tsx:170", "shortDescription": {"text": "Commented-code block (5 lines) in app/[locale]/[sport]/[country]/[city]/CityPageView.tsx:170"}, "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-1b79199572e373ab", "name": "Commented-code block (5 lines) in app/[locale]/favoris/page.tsx:87", "shortDescription": {"text": "Commented-code block (5 lines) in app/[locale]/favoris/page.tsx:87"}, "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-a070cf76f4689bc5", "name": "Commented-code block (9 lines) in app/[locale]/sports/[sport]/page.tsx:148", "shortDescription": {"text": "Commented-code block (9 lines) in app/[locale]/sports/[sport]/page.tsx:148"}, "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-895bebc63990887f", "name": "Commented-code block (6 lines) in app/[locale]/venue/[slug]/page.tsx:36", "shortDescription": {"text": "Commented-code block (6 lines) in app/[locale]/venue/[slug]/page.tsx:36"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d7d8cfe0ea86b96c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/[locale]/venue/[slug]/claim/ClaimForm.tsx:30", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/[locale]/venue/[slug]/claim/ClaimForm.tsx:30"}, "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-f17c634f14098663", "name": "Commented-code block (6 lines) in app/[locale]/disciplines/[sport]/page.tsx:61", "shortDescription": {"text": "Commented-code block (6 lines) in app/[locale]/disciplines/[sport]/page.tsx:61"}, "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-d809588e785a5678", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/[locale]/club/[slug]/page.tsx:75", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/[locale]/club/[slug]/page.tsx:75"}, "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-eefc7c100b510402", "name": "Commented-code block (6 lines) in app/[locale]/map/page.tsx:18", "shortDescription": {"text": "Commented-code block (6 lines) in app/[locale]/map/page.tsx:18"}, "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-8a460380d38d0af2", "name": "Commented-code block (5 lines) in app/[locale]/map/MapClient.tsx:94", "shortDescription": {"text": "Commented-code block (5 lines) in app/[locale]/map/MapClient.tsx:94"}, "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-bc2740809061fb5f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/[locale]/map/MapClient.tsx:392", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/[locale]/map/MapClient.tsx:392"}, "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-01cd68f6be0fca3f", "name": "Commented-code block (6 lines) in app/[locale]/map/MapWithSearch.tsx:103", "shortDescription": {"text": "Commented-code block (6 lines) in app/[locale]/map/MapWithSearch.tsx:103"}, "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-dff3d5621706568c", "name": "Commented-code block (7 lines) in app/[locale]/map/SportFilters.tsx:119", "shortDescription": {"text": "Commented-code block (7 lines) in app/[locale]/map/SportFilters.tsx:119"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-687b920907e9a9dc", "name": "Commented-code block (6 lines) in app/sitemap/[shard]/route.ts:25", "shortDescription": {"text": "Commented-code block (6 lines) in app/sitemap/[shard]/route.ts:25"}, "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-5a9ab1cd73d4a6f3", "name": "Commented-code block (6 lines) in lib/env.ts:17", "shortDescription": {"text": "Commented-code block (6 lines) in lib/env.ts:17"}, "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-7f6aa22c1baafd2b", "name": "Commented-code block (5 lines) in lib/env.test.ts:38", "shortDescription": {"text": "Commented-code block (5 lines) in lib/env.test.ts:38"}, "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-9b5ce5fc9ddb1cbd", "name": "Commented-code block (8 lines) in lib/home-stats.ts:148", "shortDescription": {"text": "Commented-code block (8 lines) in lib/home-stats.ts:148"}, "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-6df651b7ede56364", "name": "Commented-code block (9 lines) in lib/venue/sport-rules.ts:82", "shortDescription": {"text": "Commented-code block (9 lines) in lib/venue/sport-rules.ts:82"}, "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-72871646474675ac", "name": "Commented-code block (7 lines) in lib/venue/group-by-club.ts:37", "shortDescription": {"text": "Commented-code block (7 lines) in lib/venue/group-by-club.ts:37"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-295664809362027a", "name": "Commented-code block (5 lines) in lib/venue/group-courts.ts:133", "shortDescription": {"text": "Commented-code block (5 lines) in lib/venue/group-courts.ts:133"}, "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-d3ebd1ff16f089d7", "name": "Legacy-named symbol `import_v1` in lib/cron/slug.test.ts:4", "shortDescription": {"text": "Legacy-named symbol `import_v1` in lib/cron/slug.test.ts:4"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-703d4a1b4febf54f", "name": "Legacy-named symbol `import_v1` in lib/cron/slug.ts:5", "shortDescription": {"text": "Legacy-named symbol `import_v1` in lib/cron/slug.ts:5"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bf2f6905c328c048", "name": "Commented-code block (5 lines) in lib/supabase/server.ts:76", "shortDescription": {"text": "Commented-code block (5 lines) in lib/supabase/server.ts:76"}, "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-dc1451c8307461ca", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/supabase/server.ts:101", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/supabase/server.ts:101"}, "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-885c3dc90613a972", "name": "Legacy-named symbol `import_enrichments_v1` in lib/supabase/types.ts:896", "shortDescription": {"text": "Legacy-named symbol `import_enrichments_v1` in lib/supabase/types.ts:896"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8c2d01f629303018", "name": "Commented-code block (5 lines) in lib/seo/metadata.ts:16", "shortDescription": {"text": "Commented-code block (5 lines) in lib/seo/metadata.ts:16"}, "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-1e82a8c1cb74c42a", "name": "Commented-code block (5 lines) in lib/seo/sitemap-shards.ts:231", "shortDescription": {"text": "Commented-code block (5 lines) in lib/seo/sitemap-shards.ts:231"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-87acb4066071a15a", "name": "19 env vars used in code but missing from .env.example", "shortDescription": {"text": "19 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ADMIN_EMAIL`, `BASE_URL`, `EMAIL_FROM`, `IP_HASH_SALT`, `NEXT_PUBLIC_SITE_URL`, `NEXT_PUBLIC_X`, `NEXT_RUNTIME`, `NODE_ENV` + 11 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nscripts/backfill_primary_sport.py:load_env, scripts/backfill_venue_city.py:load_env\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-be46ea126aa5d8dc", "name": "Near-duplicate function bodies in 3 places", "shortDescription": {"text": "Near-duplicate function bodies in 3 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nscripts/backfill_primary_sport.py:req, scripts/backfill_family_null_sport.py:req, scripts/backfill_venue_city.py:req\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-49c98f7cedd9c977", "name": "Near-duplicate function bodies in 4 places", "shortDescription": {"text": "Near-duplicate function bodies in 4 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nscripts/etl/import_wikidata_retreats.py:connect, scripts/etl/backfill_combat_sport_from_name.py:connect, scripts/etl/merge_court_records.py:connect, scripts/etl/clean_misclassified.py:connect\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/21238"}, "properties": {"repository": "thsshm/sporthub", "repoUrl": "https://github.com/thsshm/sporthub", "branch": "main"}, "results": [{"ruleId": "scanner-644c71b33a04db49", "level": "note", "message": {"text": "Possibly dead Python function: rpc"}, "properties": {"repobilityId": "b995ad65ed191c05", "scanner": "scanner-primary", "fingerprint": "644c71b33a04db49", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/etl_upsert.py:155"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ac15e767140b9ff", "level": "note", "message": {"text": "Possibly dead Python function: repl"}, "properties": {"repobilityId": "6f5d3779bbb8be8b", "scanner": "scanner-primary", "fingerprint": "3ac15e767140b9ff", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/trim-supabase-types.py:77"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-20f7e1f93303ef45", "level": "note", "message": {"text": "Possibly dead Python function: insert_club"}, "properties": {"repobilityId": "8d5a8ecd5c06be54", "scanner": "scanner-primary", "fingerprint": "20f7e1f93303ef45", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/cluster_clubs.py:585"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ed8d48c44895b014", "level": "note", "message": {"text": "Possibly dead Python function: link_venues_to_club"}, "properties": {"repobilityId": "7f16343a4f17ac2f", "scanner": "scanner-primary", "fingerprint": "ed8d48c44895b014", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/cluster_clubs.py:624"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-41c8323dee7b559f", "level": "note", "message": {"text": "Possibly dead Python function: fake_fetch"}, "properties": {"repobilityId": "8fd063d6c048d809", "scanner": "scanner-primary", "fingerprint": "41c8323dee7b559f", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/etl/osm_import.py:647"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c948e1403bb28b26", "level": "note", "message": {"text": "Possibly dead Python function: always_timeout"}, "properties": {"repobilityId": "1d4c9aedcb3d54b6", "scanner": "scanner-primary", "fingerprint": "c948e1403bb28b26", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/etl/osm_import.py:658"}, "region": {"startLine": 1}}}]}, {"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-36ead0b17a4bb767", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/layout/MobileNav.tsx:92"}, "properties": {"repobilityId": "c0825b5a2e6256c3", "scanner": "scanner-primary", "fingerprint": "36ead0b17a4bb767", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c673de143d0bc3db", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/layout/Nav.tsx:144"}, "properties": {"repobilityId": "e5e8acbbd179254b", "scanner": "scanner-primary", "fingerprint": "c673de143d0bc3db", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-696441a5369093fc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/venue/VenueInfoCard.tsx:109"}, "properties": {"repobilityId": "bf2c7dacc63dbda9", "scanner": "scanner-primary", "fingerprint": "696441a5369093fc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-eb557a439306f95b", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/home/HomeFAQ.tsx:89"}, "properties": {"repobilityId": "bb4bdcfbcf384113", "scanner": "scanner-primary", "fingerprint": "eb557a439306f95b", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-29748eacf7381975", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/home/HomeTopSpots.tsx:129"}, "properties": {"repobilityId": "9d789008c99bc32c", "scanner": "scanner-primary", "fingerprint": "29748eacf7381975", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0694f96580cc5c06", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/[locale]/[sport]/[country]/[city]/CityPageView.tsx:497"}, "properties": {"repobilityId": "839677157a5993c9", "scanner": "scanner-primary", "fingerprint": "0694f96580cc5c06", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-722b687cc0ba0470", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/[locale]/famille/retraites/page.tsx:172"}, "properties": {"repobilityId": "48cf69db99eb29f3", "scanner": "scanner-primary", "fingerprint": "722b687cc0ba0470", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-2025f4e563ded3b8", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/[locale]/sports/[sport]/page.tsx:352"}, "properties": {"repobilityId": "62d7d20d80522a74", "scanner": "scanner-primary", "fingerprint": "2025f4e563ded3b8", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-0c352cdfb3857116", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/[locale]/venue/[slug]/page.tsx:152"}, "properties": {"repobilityId": "06cf38cd3a31dfba", "scanner": "scanner-primary", "fingerprint": "0c352cdfb3857116", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-5df60562959419ec", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/[locale]/villes/page.tsx:163"}, "properties": {"repobilityId": "45cae4f7ad7135c4", "scanner": "scanner-primary", "fingerprint": "5df60562959419ec", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-e2c115efae2ee320", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/[locale]/disciplines/[sport]/page.tsx:204"}, "properties": {"repobilityId": "9fc35b891e252b3b", "scanner": "scanner-primary", "fingerprint": "e2c115efae2ee320", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-508a780192f32ae9", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/[locale]/disciplines/[sport]/page.tsx:161"}, "properties": {"repobilityId": "5d2d59f1e81174b1", "scanner": "scanner-primary", "fingerprint": "508a780192f32ae9", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-d509c53afff5acf4", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/[locale]/club/[slug]/page.tsx:234"}, "properties": {"repobilityId": "cb713d97d5dfcc87", "scanner": "scanner-primary", "fingerprint": "d509c53afff5acf4", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-b0ac5855967eab19", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/[locale]/map/ExplorePicker.tsx:124"}, "properties": {"repobilityId": "d7c8f0645e7272fa", "scanner": "scanner-primary", "fingerprint": "b0ac5855967eab19", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a63a1017c4e717d1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/[locale]/map/SportFilters.tsx:272"}, "properties": {"repobilityId": "20b7ba5ee20f1d6c", "scanner": "scanner-primary", "fingerprint": "a63a1017c4e717d1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0dbc1cbd34e2065b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/[locale]/map/VenueListPanel.tsx:84"}, "properties": {"repobilityId": "89c3758ac7cf4bca", "scanner": "scanner-primary", "fingerprint": "0dbc1cbd34e2065b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ec937ba879b92cc3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/monitoring.ts:55"}, "properties": {"repobilityId": "941c0a50cd51de3c", "scanner": "scanner-primary", "fingerprint": "ec937ba879b92cc3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0ad53199039bed76", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 lib/email/send-claim-resolution.ts:142"}, "properties": {"repobilityId": "99403145e5b74732", "scanner": "scanner-primary", "fingerprint": "0ad53199039bed76", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-596fff93ca749fe5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/email/send-claim-resolution.ts:145"}, "properties": {"repobilityId": "8e5cfd2ced51973a", "scanner": "scanner-primary", "fingerprint": "596fff93ca749fe5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ecb2482268282984", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/cron/log.ts:25"}, "properties": {"repobilityId": "4dfabd03897e0d85", "scanner": "scanner-primary", "fingerprint": "ecb2482268282984", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7d9c419c9031a5e7", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 lib/seo/metadata.ts:368"}, "properties": {"repobilityId": "c8bc6434fe3bc5f7", "scanner": "scanner-primary", "fingerprint": "7d9c419c9031a5e7", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-6ab32c69c87def95", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in components/home/HomeFAQ.tsx:89"}, "properties": {"repobilityId": "b06e5de2617fe21f", "scanner": "scanner-primary", "fingerprint": "6ab32c69c87def95", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "components/home/HomeFAQ.tsx"}, "region": {"startLine": 89}}}]}, {"ruleId": "scanner-372dea3f4529865d", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/[locale]/[sport]/[country]/[city]/CityPageView.tsx:497"}, "properties": {"repobilityId": "0852c6bc94f15e69", "scanner": "scanner-primary", "fingerprint": "372dea3f4529865d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/[locale]/[sport]/[country]/[city]/CityPageView.tsx"}, "region": {"startLine": 497}}}]}, {"ruleId": "scanner-a674bfc2235eaa8d", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/[locale]/famille/retraites/page.tsx:172"}, "properties": {"repobilityId": "6c3990cba30492ba", "scanner": "scanner-primary", "fingerprint": "a674bfc2235eaa8d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/[locale]/famille/retraites/page.tsx"}, "region": {"startLine": 172}}}]}, {"ruleId": "scanner-37b3fba8e277f862", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/[locale]/sports/[sport]/page.tsx:352"}, "properties": {"repobilityId": "226d3e72b22b80d0", "scanner": "scanner-primary", "fingerprint": "37b3fba8e277f862", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/[locale]/sports/[sport]/page.tsx"}, "region": {"startLine": 352}}}]}, {"ruleId": "scanner-e2640f95cd1a1b5b", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/[locale]/venue/[slug]/page.tsx:152"}, "properties": {"repobilityId": "1b5e838791aa37e5", "scanner": "scanner-primary", "fingerprint": "e2640f95cd1a1b5b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/[locale]/venue/[slug]/page.tsx"}, "region": {"startLine": 152}}}]}, {"ruleId": "scanner-b7e6cd5c639da619", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/[locale]/villes/page.tsx:163"}, "properties": {"repobilityId": "0732ccba82b37505", "scanner": "scanner-primary", "fingerprint": "b7e6cd5c639da619", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/[locale]/villes/page.tsx"}, "region": {"startLine": 163}}}]}, {"ruleId": "scanner-2940f103e66e3cbd", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/[locale]/disciplines/[sport]/page.tsx:161"}, "properties": {"repobilityId": "f8d66fb5103bf329", "scanner": "scanner-primary", "fingerprint": "2940f103e66e3cbd", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/[locale]/disciplines/[sport]/page.tsx"}, "region": {"startLine": 161}}}]}, {"ruleId": "scanner-f297b752022286bc", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/[locale]/club/[slug]/page.tsx:234"}, "properties": {"repobilityId": "b34ee0ea8222884e", "scanner": "scanner-primary", "fingerprint": "f297b752022286bc", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/[locale]/club/[slug]/page.tsx"}, "region": {"startLine": 234}}}]}, {"ruleId": "scanner-ad88519658c1431b", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "bde70cf4eaa15483", "scanner": "scanner-primary", "fingerprint": "ad88519658c1431b", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/reload-postgrest.yml"}, "region": {"startLine": 23}}}]}, {"ruleId": "scanner-ad88519658c1431b", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "370fcebb74fe5813", "scanner": "scanner-primary", "fingerprint": "ad88519658c1431b", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/reload-postgrest.yml"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-be11bd67eb628195", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "c83fc2e0c75ead68", "scanner": "scanner-primary", "fingerprint": "be11bd67eb628195", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/regenerate-tiles.yml"}, "region": {"startLine": 38}}}]}, {"ruleId": "scanner-be11bd67eb628195", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "9206af189a618816", "scanner": "scanner-primary", "fingerprint": "be11bd67eb628195", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/regenerate-tiles.yml"}, "region": {"startLine": 41}}}]}, {"ruleId": "scanner-be11bd67eb628195", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "2975b8a56891be8b", "scanner": "scanner-primary", "fingerprint": "be11bd67eb628195", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/regenerate-tiles.yml"}, "region": {"startLine": 47}}}]}, {"ruleId": "scanner-9cc832136adf6d40", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "5df196dae50af5d8", "scanner": "scanner-primary", "fingerprint": "9cc832136adf6d40", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/overture-import.yml"}, "region": {"startLine": 58}}}]}, {"ruleId": "scanner-9cc832136adf6d40", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "a4046ff45fed9fb9", "scanner": "scanner-primary", "fingerprint": "9cc832136adf6d40", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/overture-import.yml"}, "region": {"startLine": 61}}}]}, {"ruleId": "scanner-576189cc6843b204", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "5c565c01032a44f3", "scanner": "scanner-primary", "fingerprint": "576189cc6843b204", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/retreats-import.yml"}, "region": {"startLine": 33}}}]}, {"ruleId": "scanner-576189cc6843b204", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "f072cab6ee63cc61", "scanner": "scanner-primary", "fingerprint": "576189cc6843b204", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/retreats-import.yml"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ae16880318b99912", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 32}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "54597edb7f5bad38", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 35}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "989a74409a402368", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 40}}}]}, {"ruleId": "scanner-80d29923f673ad57", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "d180f4cc3c64f229", "scanner": "scanner-primary", "fingerprint": "80d29923f673ad57", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/apply-migrations.yml"}, "region": {"startLine": 43}}}]}, {"ruleId": "scanner-80d29923f673ad57", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "c6f47a2761edf92e", "scanner": "scanner-primary", "fingerprint": "80d29923f673ad57", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/apply-migrations.yml"}, "region": {"startLine": 46}}}]}, {"ruleId": "scanner-757fbfbac76901b9", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "6bf7d34f5d1f5443", "scanner": "scanner-primary", "fingerprint": "757fbfbac76901b9", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/data-quality-report.yml"}, "region": {"startLine": 33}}}]}, {"ruleId": "scanner-757fbfbac76901b9", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "1d4282114fa08711", "scanner": "scanner-primary", "fingerprint": "757fbfbac76901b9", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/data-quality-report.yml"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-757fbfbac76901b9", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "b9a2c99111185ffb", "scanner": "scanner-primary", "fingerprint": "757fbfbac76901b9", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/data-quality-report.yml"}, "region": {"startLine": 57}}}]}, {"ruleId": "scanner-176a661fe4c8d6b8", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "d06fb1237ee1c83a", "scanner": "scanner-primary", "fingerprint": "176a661fe4c8d6b8", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/restore-soft-deleted.yml"}, "region": {"startLine": 47}}}]}, {"ruleId": "scanner-176a661fe4c8d6b8", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "935a2810acab7126", "scanner": "scanner-primary", "fingerprint": "176a661fe4c8d6b8", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/restore-soft-deleted.yml"}, "region": {"startLine": 50}}}]}, {"ruleId": "scanner-feac4317db0ce079", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "2b1de4cb6d1ac091", "scanner": "scanner-primary", "fingerprint": "feac4317db0ce079", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/osm-import.yml"}, "region": {"startLine": 58}}}]}, {"ruleId": "scanner-feac4317db0ce079", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "bc1fb40815b26d0f", "scanner": "scanner-primary", "fingerprint": "feac4317db0ce079", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/osm-import.yml"}, "region": {"startLine": 61}}}]}, {"ruleId": "scanner-ac933409a87b735b", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "9a2309ffb545bca1", "scanner": "scanner-primary", "fingerprint": "ac933409a87b735b", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/seo-smoke.yml"}, "region": {"startLine": 30}}}]}, {"ruleId": "scanner-ac933409a87b735b", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "483b4c253f0b3af2", "scanner": "scanner-primary", "fingerprint": "ac933409a87b735b", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/seo-smoke.yml"}, "region": {"startLine": 33}}}]}, {"ruleId": "scanner-abe8b46f42cdc6b9", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "96edbf5dbb93c338", "scanner": "scanner-primary", "fingerprint": "abe8b46f42cdc6b9", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/reset-family-clubs.yml"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-abe8b46f42cdc6b9", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "b277a544c4d394a5", "scanner": "scanner-primary", "fingerprint": "abe8b46f42cdc6b9", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/reset-family-clubs.yml"}, "region": {"startLine": 39}}}]}, {"ruleId": "scanner-59514880abca4666", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "79433a7f77148570", "scanner": "scanner-primary", "fingerprint": "59514880abca4666", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/padel-enrich.yml"}, "region": {"startLine": 57}}}]}, {"ruleId": "scanner-59514880abca4666", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "10081d0d8ffa1832", "scanner": "scanner-primary", "fingerprint": "59514880abca4666", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/padel-enrich.yml"}, "region": {"startLine": 60}}}]}, {"ruleId": "scanner-59514880abca4666", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "57ffe86f6f3dfc35", "scanner": "scanner-primary", "fingerprint": "59514880abca4666", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/padel-enrich.yml"}, "region": {"startLine": 86}}}]}, {"ruleId": "scanner-6d33c99489fd8c04", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "f2047b0906c39952", "scanner": "scanner-primary", "fingerprint": "6d33c99489fd8c04", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/cluster-clubs.yml"}, "region": {"startLine": 48}}}]}, {"ruleId": "scanner-6d33c99489fd8c04", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "71ece5548a573396", "scanner": "scanner-primary", "fingerprint": "6d33c99489fd8c04", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/cluster-clubs.yml"}, "region": {"startLine": 51}}}]}, {"ruleId": "scanner-cf3d6b794c9e40f2", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "f03c5c2c43a49d2c", "scanner": "scanner-primary", "fingerprint": "cf3d6b794c9e40f2", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/backfill-venue-city.yml"}, "region": {"startLine": 75}}}]}, {"ruleId": "scanner-cf3d6b794c9e40f2", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "49aca23797219f44", "scanner": "scanner-primary", "fingerprint": "cf3d6b794c9e40f2", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/backfill-venue-city.yml"}, "region": {"startLine": 78}}}]}, {"ruleId": "scanner-01fd54e844eb6d7c", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "521959ad043b3fd1", "scanner": "scanner-primary", "fingerprint": "01fd54e844eb6d7c", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/backfill-primary-sport.yml"}, "region": {"startLine": 47}}}]}, {"ruleId": "scanner-01fd54e844eb6d7c", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "91d9d941627968ae", "scanner": "scanner-primary", "fingerprint": "01fd54e844eb6d7c", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/backfill-primary-sport.yml"}, "region": {"startLine": 50}}}]}, {"ruleId": "scanner-1ea597004ccd4713", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "06e2a742ad6909fd", "scanner": "scanner-primary", "fingerprint": "1ea597004ccd4713", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/seed-countries.yml"}, "region": {"startLine": 29}}}]}, {"ruleId": "scanner-1ea597004ccd4713", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "46217d02c627ea54", "scanner": "scanner-primary", "fingerprint": "1ea597004ccd4713", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/seed-countries.yml"}, "region": {"startLine": 32}}}]}, {"ruleId": "scanner-0e4694c2a6d58e55", "level": "note", "message": {"text": "Very large file: app/[locale]/map/MapClient.tsx (1211 lines)"}, "properties": {"repobilityId": "326c02647af90cbb", "scanner": "scanner-primary", "fingerprint": "0e4694c2a6d58e55", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ea3b5e389d8c9c0f", "level": "note", "message": {"text": "Low test-to-source ratio"}, "properties": {"repobilityId": "ef7b2552cc00a375", "scanner": "scanner-primary", "fingerprint": "ea3b5e389d8c9c0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["tests"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "9a08112db8cd07c6", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "4b0a95e115cedb73", "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": "8d447e836e740184", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-9d79c4077342a7d0", "level": "warning", "message": {"text": "Runtime service client appears to use placeholder configuration"}, "properties": {"repobilityId": "96413c9a8bc4aa74", "scanner": "scanner-primary", "fingerprint": "9d79c4077342a7d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "runtime-config", "service-client", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "07a597b86741bc6a", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "63658b3515f2f8f5", "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": "0d0ba20f08d786eb", "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": "dd201b278f2bd1e3", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-d71afdc0d5edadec", "level": "none", "message": {"text": "Commented-code block (6 lines) in next.config.js:28"}, "properties": {"repobilityId": "060955b0adb6b600", "scanner": "scanner-primary", "fingerprint": "d71afdc0d5edadec", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c03df8f0074d0ad3", "level": "none", "message": {"text": "Commented-code block (12 lines) in middleware.ts:7"}, "properties": {"repobilityId": "e05f48e0f584f336", "scanner": "scanner-primary", "fingerprint": "c03df8f0074d0ad3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-40addefab4afcbbb", "level": "none", "message": {"text": "Commented-code block (5 lines) in test/server-only-stub.ts:3"}, "properties": {"repobilityId": "d7e86d9c72502bd5", "scanner": "scanner-primary", "fingerprint": "40addefab4afcbbb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0962f5e383fb6f0c", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/check-migrations.test.mjs:73"}, "properties": {"repobilityId": "a778f11da59d7dd4", "scanner": "scanner-primary", "fingerprint": "0962f5e383fb6f0c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-64e7d371cecb54e3", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/seo-smoke.mjs:54"}, "properties": {"repobilityId": "ed2a59b69a72c101", "scanner": "scanner-primary", "fingerprint": "64e7d371cecb54e3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-90fe5edb7fa520b6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/seo-smoke.mjs:80"}, "properties": {"repobilityId": "68005a8181a9daf3", "scanner": "scanner-primary", "fingerprint": "90fe5edb7fa520b6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b81c9daf6f09dcf4", "level": "none", "message": {"text": "Commented-code block (8 lines) in scripts/generate_venue_tiles.py:68"}, "properties": {"repobilityId": "492be49130d762e0", "scanner": "scanner-primary", "fingerprint": "b81c9daf6f09dcf4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c70820e0caea4229", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/generate_venue_tiles.py:194"}, "properties": {"repobilityId": "f6ce1537d7abca24", "scanner": "scanner-primary", "fingerprint": "c70820e0caea4229", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4dd880eca64efc05", "level": "note", "message": {"text": "Legacy-named symbol `import_v1` in scripts/backfill_surface_osm.py:9"}, "properties": {"repobilityId": "d61ca01ac1fd370b", "scanner": "scanner-primary", "fingerprint": "4dd880eca64efc05", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-afff6c6a9922d68a", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/backfill_surface_osm.py:191"}, "properties": {"repobilityId": "323237c202bfe969", "scanner": "scanner-primary", "fingerprint": "afff6c6a9922d68a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9ba9e81e3b439fa3", "level": "note", "message": {"text": "Legacy-named symbol `import_enrichments_v1` in scripts/import_enrichments_v1.py:10"}, "properties": {"repobilityId": "87a840bc2d04744c", "scanner": "scanner-primary", "fingerprint": "9ba9e81e3b439fa3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-05391a89c02f755d", "level": "none", "message": {"text": "Commented-code block (7 lines) in scripts/import_enrichments_v1.py:2"}, "properties": {"repobilityId": "a9585658f467645f", "scanner": "scanner-primary", "fingerprint": "05391a89c02f755d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b37e7f343f4fff4a", "level": "note", "message": {"text": "Legacy-named symbol `import_v1` in scripts/import_overture.py:70"}, "properties": {"repobilityId": "b7194e85d0169a53", "scanner": "scanner-primary", "fingerprint": "b37e7f343f4fff4a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b0c202fd21a76c57", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/import_overture.py:162"}, "properties": {"repobilityId": "39e34dd3c048711e", "scanner": "scanner-primary", "fingerprint": "b0c202fd21a76c57", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-60f3f9b6741bbeff", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/backfill_family_null_sport.py:2"}, "properties": {"repobilityId": "29aeab4e25a47b66", "scanner": "scanner-primary", "fingerprint": "60f3f9b6741bbeff", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c8227f31881df551", "level": "note", "message": {"text": "Legacy-named symbol `import_v1` in scripts/import_v1.py:11"}, "properties": {"repobilityId": "58b02f6b0ef29259", "scanner": "scanner-primary", "fingerprint": "c8227f31881df551", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a3813932842510aa", "level": "none", "message": {"text": "Commented-code block (8 lines) in scripts/import_v1.py:2"}, "properties": {"repobilityId": "aa8316989789a2cb", "scanner": "scanner-primary", "fingerprint": "a3813932842510aa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ca9d04156a403657", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/backfill_courts_count.py:53"}, "properties": {"repobilityId": "b24d5be7b08e51a6", "scanner": "scanner-primary", "fingerprint": "ca9d04156a403657", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-be647bf088a5afb4", "level": "none", "message": {"text": "Commented-code block (8 lines) in scripts/scrape_playtomic_padel_fr.py:52"}, "properties": {"repobilityId": "cfbd7a80427ea07c", "scanner": "scanner-primary", "fingerprint": "be647bf088a5afb4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-224c5ad0c48b8ea5", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/cluster_clubs.py:810"}, "properties": {"repobilityId": "fbf4c40c7a013954", "scanner": "scanner-primary", "fingerprint": "224c5ad0c48b8ea5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-58f2a5f93180ea59", "level": "none", "message": {"text": "Commented-code block (6 lines) in components/SearchBar.tsx:88"}, "properties": {"repobilityId": "402411f7e291cd29", "scanner": "scanner-primary", "fingerprint": "58f2a5f93180ea59", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9b3fa3f63374cc7d", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/venue/VenueCard.tsx:73"}, "properties": {"repobilityId": "64ada8e8647e58f5", "scanner": "scanner-primary", "fingerprint": "9b3fa3f63374cc7d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-64726b3945bf15a0", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/admin/cron/run-all/route.ts:28"}, "properties": {"repobilityId": "85a620a334a4d1a7", "scanner": "scanner-primary", "fingerprint": "64726b3945bf15a0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-225efeefbd662cad", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/api/venues/route.ts:179"}, "properties": {"repobilityId": "034b3d3a579ef32e", "scanner": "scanner-primary", "fingerprint": "225efeefbd662cad", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-74a4dcd6465e47d4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/cron/refresh-paragliding/route.ts:171"}, "properties": {"repobilityId": "f644dac6b79a03de", "scanner": "scanner-primary", "fingerprint": "74a4dcd6465e47d4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ecfc45c642aaaf1e", "level": "note", "message": {"text": "Legacy-named symbol `import_enrichments_v1` in app/api/cron/refresh-wikidata/route.ts:5"}, "properties": {"repobilityId": "b60116586a07233b", "scanner": "scanner-primary", "fingerprint": "ecfc45c642aaaf1e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a8be038ff639ff47", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/cron/refresh-wikidata/route.ts:53"}, "properties": {"repobilityId": "a6b804be5198387f", "scanner": "scanner-primary", "fingerprint": "a8be038ff639ff47", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-30d0116898150290", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/cron/refresh-diving/route.ts:82"}, "properties": {"repobilityId": "1fb1591330d9412b", "scanner": "scanner-primary", "fingerprint": "30d0116898150290", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e3671723fcee2192", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/cron/refresh-hyrox/route.ts:147"}, "properties": {"repobilityId": "b762d30f7c783cf7", "scanner": "scanner-primary", "fingerprint": "e3671723fcee2192", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f494ae255e82d981", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/go/[id]/route.ts:99"}, "properties": {"repobilityId": "6298934caa257dec", "scanner": "scanner-primary", "fingerprint": "f494ae255e82d981", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1747aa4c160e6e95", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/[locale]/[sport]/[country]/[city]/page.tsx:13"}, "properties": {"repobilityId": "46563bfc18b9bccf", "scanner": "scanner-primary", "fingerprint": "1747aa4c160e6e95", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-51dfdb3433ad2d54", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/[locale]/[sport]/[country]/[city]/CityPageView.tsx:170"}, "properties": {"repobilityId": "121f8ba641b77b1d", "scanner": "scanner-primary", "fingerprint": "51dfdb3433ad2d54", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1b79199572e373ab", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/[locale]/favoris/page.tsx:87"}, "properties": {"repobilityId": "7d98aded5f2dea3e", "scanner": "scanner-primary", "fingerprint": "1b79199572e373ab", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a070cf76f4689bc5", "level": "none", "message": {"text": "Commented-code block (9 lines) in app/[locale]/sports/[sport]/page.tsx:148"}, "properties": {"repobilityId": "b597be8d80cd2121", "scanner": "scanner-primary", "fingerprint": "a070cf76f4689bc5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-895bebc63990887f", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/[locale]/venue/[slug]/page.tsx:36"}, "properties": {"repobilityId": "562ec3435f94780d", "scanner": "scanner-primary", "fingerprint": "895bebc63990887f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d7d8cfe0ea86b96c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/[locale]/venue/[slug]/claim/ClaimForm.tsx:30"}, "properties": {"repobilityId": "ce954cbc351ae266", "scanner": "scanner-primary", "fingerprint": "d7d8cfe0ea86b96c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f17c634f14098663", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/[locale]/disciplines/[sport]/page.tsx:61"}, "properties": {"repobilityId": "c3c4046b040d96d3", "scanner": "scanner-primary", "fingerprint": "f17c634f14098663", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d809588e785a5678", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/[locale]/club/[slug]/page.tsx:75"}, "properties": {"repobilityId": "5eca99a9214cd1eb", "scanner": "scanner-primary", "fingerprint": "d809588e785a5678", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-eefc7c100b510402", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/[locale]/map/page.tsx:18"}, "properties": {"repobilityId": "937f3baf029fe2d2", "scanner": "scanner-primary", "fingerprint": "eefc7c100b510402", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8a460380d38d0af2", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/[locale]/map/MapClient.tsx:94"}, "properties": {"repobilityId": "3d593fbc94d9eb95", "scanner": "scanner-primary", "fingerprint": "8a460380d38d0af2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bc2740809061fb5f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/[locale]/map/MapClient.tsx:392"}, "properties": {"repobilityId": "1e59ae099c775d08", "scanner": "scanner-primary", "fingerprint": "bc2740809061fb5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-01cd68f6be0fca3f", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/[locale]/map/MapWithSearch.tsx:103"}, "properties": {"repobilityId": "8da8d37998b33b45", "scanner": "scanner-primary", "fingerprint": "01cd68f6be0fca3f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dff3d5621706568c", "level": "none", "message": {"text": "Commented-code block (7 lines) in app/[locale]/map/SportFilters.tsx:119"}, "properties": {"repobilityId": "ccabd67875449593", "scanner": "scanner-primary", "fingerprint": "dff3d5621706568c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-687b920907e9a9dc", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/sitemap/[shard]/route.ts:25"}, "properties": {"repobilityId": "394dd66ee5107f63", "scanner": "scanner-primary", "fingerprint": "687b920907e9a9dc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5a9ab1cd73d4a6f3", "level": "none", "message": {"text": "Commented-code block (6 lines) in lib/env.ts:17"}, "properties": {"repobilityId": "afa651fba2e8deee", "scanner": "scanner-primary", "fingerprint": "5a9ab1cd73d4a6f3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7f6aa22c1baafd2b", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/env.test.ts:38"}, "properties": {"repobilityId": "93330259c975a04e", "scanner": "scanner-primary", "fingerprint": "7f6aa22c1baafd2b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9b5ce5fc9ddb1cbd", "level": "none", "message": {"text": "Commented-code block (8 lines) in lib/home-stats.ts:148"}, "properties": {"repobilityId": "7ae07989482a16df", "scanner": "scanner-primary", "fingerprint": "9b5ce5fc9ddb1cbd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6df651b7ede56364", "level": "none", "message": {"text": "Commented-code block (9 lines) in lib/venue/sport-rules.ts:82"}, "properties": {"repobilityId": "a147507e71f0d7ad", "scanner": "scanner-primary", "fingerprint": "6df651b7ede56364", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-72871646474675ac", "level": "none", "message": {"text": "Commented-code block (7 lines) in lib/venue/group-by-club.ts:37"}, "properties": {"repobilityId": "11d0fa4bcc473207", "scanner": "scanner-primary", "fingerprint": "72871646474675ac", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-295664809362027a", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/venue/group-courts.ts:133"}, "properties": {"repobilityId": "7a8bfb0340eace4c", "scanner": "scanner-primary", "fingerprint": "295664809362027a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d3ebd1ff16f089d7", "level": "note", "message": {"text": "Legacy-named symbol `import_v1` in lib/cron/slug.test.ts:4"}, "properties": {"repobilityId": "fffc8a7e0a57cefb", "scanner": "scanner-primary", "fingerprint": "d3ebd1ff16f089d7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-703d4a1b4febf54f", "level": "note", "message": {"text": "Legacy-named symbol `import_v1` in lib/cron/slug.ts:5"}, "properties": {"repobilityId": "9320db6bb6916e72", "scanner": "scanner-primary", "fingerprint": "703d4a1b4febf54f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-bf2f6905c328c048", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/supabase/server.ts:76"}, "properties": {"repobilityId": "03bf80ee37e1d0fe", "scanner": "scanner-primary", "fingerprint": "bf2f6905c328c048", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dc1451c8307461ca", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/supabase/server.ts:101"}, "properties": {"repobilityId": "c48da8d58eb09f17", "scanner": "scanner-primary", "fingerprint": "dc1451c8307461ca", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-885c3dc90613a972", "level": "note", "message": {"text": "Legacy-named symbol `import_enrichments_v1` in lib/supabase/types.ts:896"}, "properties": {"repobilityId": "32cc201b0abe4f31", "scanner": "scanner-primary", "fingerprint": "885c3dc90613a972", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-8c2d01f629303018", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/seo/metadata.ts:16"}, "properties": {"repobilityId": "dbc692c2cf19caac", "scanner": "scanner-primary", "fingerprint": "8c2d01f629303018", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1e82a8c1cb74c42a", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/seo/sitemap-shards.ts:231"}, "properties": {"repobilityId": "c861a0c75bc1b827", "scanner": "scanner-primary", "fingerprint": "1e82a8c1cb74c42a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-87acb4066071a15a", "level": "note", "message": {"text": "19 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "b1f30c58de7ffb20", "scanner": "scanner-primary", "fingerprint": "87acb4066071a15a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "54be158093b7cff4", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "0b257359f984da5d", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "d3888cf323a5b9aa", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "a4c5028b8179ace4", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "a30568e014077530", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "d36d5b7966aa090a", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "150b3d0c8a3a0c9b", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "24b07dfdcf1f74f2", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}]}]}