{"version": "2.1.0", "$schema": "https://json.schemastore.org/sarif-2.1.0.json", "runs": [{"tool": {"driver": {"name": "Repobility", "informationUri": "https://repobility.com", "rules": [{"id": "scanner-bead75b0f9233e05", "name": "No API endpoints detected", "shortDescription": {"text": "No API endpoints detected"}, "fullDescription": {"text": "The scanner did not find FastAPI/Flask/Express/NestJS/GraphQL/gRPC routes. If this repo exposes APIs, the framework may be unsupported."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "info", "confidence": 1.0}}, {"id": "scanner-233ae595813c0471", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/sync/[provider]/route.ts:80", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/sync/[provider]/route.ts:80"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1e36a4211f86ef98", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/coach-stream/route.ts:181", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/coach-stream/route.ts:181"}, "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-b6b78350dd92e326", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/stripe/checkout/route.ts:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/stripe/checkout/route.ts:20"}, "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-63a4d7e2b7109f97", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/stripe/webhook/route.ts:97", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/stripe/webhook/route.ts:97"}, "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-8782df758baf53c4", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/training-plan/route.ts:210", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/training-plan/route.ts:210"}, "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-6cc427399e99a65a", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/oauth/connect/route.ts:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/oauth/connect/route.ts:32"}, "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-7091bda96bdd6b6b", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/oauth/callback/route.ts:41", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/oauth/callback/route.ts:41"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-141b8011fcd29159", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/marketing/daily-brief/route.ts:41", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/marketing/daily-brief/route.ts:41"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b20f6092e7546c6f", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/marketing/analyze-performance/route.ts:119", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/marketing/analyze-performance/route.ts:119"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-04d2b087014291c2", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/marketing/insta-upload/route.ts:50", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/marketing/insta-upload/route.ts:50"}, "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-5dc3b328607d98e1", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/marketing/insta-sync/route.ts:54", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/marketing/insta-sync/route.ts:54"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-05429e08ec62e975", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/strava/sync-maps/route.ts:92", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/strava/sync-maps/route.ts:92"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-876961626ec6610f", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/strava/activity-laps/route.ts:99", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/strava/activity-laps/route.ts:99"}, "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-d4784790d3b84332", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/strava/webhook-subscribe/route.ts:26", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/strava/webhook-subscribe/route.ts:26"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8a7d1c4dd18ba296", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/strava/webhook/route.ts:99", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/strava/webhook/route.ts:99"}, "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-16a73b7768abdbe9", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/briefing/route.ts:46", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/briefing/route.ts:46"}, "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-beaf22d6f136a801", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/briefing/generate/route.ts:303", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/briefing/generate/route.ts:303"}, "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-b671f44684350a72", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/activities/backfill-records/route.ts:17", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/activities/backfill-records/route.ts:17"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-696ea898c88ed8fd", "name": "Icon-only button without accessible name \u2014 src/app/profile/page.tsx:130", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/app/profile/page.tsx:130"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a31be6b9ac7a3e3d", "name": "Icon-only button without accessible name \u2014 src/app/performance/TriathlonDrawer.tsx:90", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/app/performance/TriathlonDrawer.tsx:90"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2229a4fcf5592704", "name": "Icon-only button without accessible name \u2014 src/app/performance/LinkActivitySheet.tsx:39", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/app/performance/LinkActivitySheet.tsx:39"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-48dd1c321f160bcb", "name": "Icon-only button without accessible name \u2014 src/app/performance/HyroxRaceSheet.tsx:56", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/app/performance/HyroxRaceSheet.tsx:56"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d4827b4db1631f88", "name": "Icon-only button without accessible name \u2014 src/app/performance/AddExerciseSheet.tsx:37", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/app/performance/AddExerciseSheet.tsx:37"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-60c0bf65fc478043", "name": "Icon-only button without accessible name \u2014 src/app/performance/RadarChart.tsx:832", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/app/performance/RadarChart.tsx:832"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-37aef9a6b49b30e8", "name": "Icon-only button without accessible name \u2014 src/app/performance/RacesSection.tsx:677", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/app/performance/RacesSection.tsx:677"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b9eebc99d175e31e", "name": "Icon-only button without accessible name \u2014 src/app/performance/GymEditSheet.tsx:58", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/app/performance/GymEditSheet.tsx:58"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-89a85deff1e65e2a", "name": "Icon-only button without accessible name \u2014 src/app/performance/DatasTab.tsx:673", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/app/performance/DatasTab.tsx:673"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b6ecaf607b05d0aa", "name": "Icon-only button without accessible name \u2014 src/app/performance/page.tsx:166", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/app/performance/page.tsx:166"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0dde2eb883821fef", "name": "Icon-only button without accessible name \u2014 src/app/performance/ClimbsSection.tsx:525", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/app/performance/ClimbsSection.tsx:525"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-37920f05b214e0dd", "name": "Icon-only button without accessible name \u2014 src/app/session/page.tsx:2141", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/app/session/page.tsx:2141"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0821c02b4e12966a", "name": "Icon-only button without accessible name \u2014 src/app/connections/page.tsx:767", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/app/connections/page.tsx:767"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-61b1168421f8f61a", "name": "Stray `console.log` in TS/JS \u2014 src/app/connections/page.tsx:635", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/connections/page.tsx:635"}, "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-e6cf5816c9713c3b", "name": "Icon-only button without accessible name \u2014 src/app/calendar/page.tsx:434", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/app/calendar/page.tsx:434"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-282ff80408521de2", "name": "Stray `console.log` in TS/JS \u2014 src/app/calendar/page.tsx:229", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/calendar/page.tsx:229"}, "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-5f967428ce993024", "name": "Icon-only button without accessible name \u2014 src/app/calendar/components/MonthlyView.tsx:144", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/app/calendar/components/MonthlyView.tsx:144"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b307e568d6f57a4a", "name": "Icon-only button without accessible name \u2014 src/app/calendar/components/EventModal.tsx:137", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/app/calendar/components/EventModal.tsx:137"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-369771cf0d213f02", "name": "Icon-only button without accessible name \u2014 src/app/calendar/components/RaceModal.tsx:109", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/app/calendar/components/RaceModal.tsx:109"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-87b1f6585f84ae7b", "name": "Icon-only button without accessible name \u2014 src/app/calendar/components/DayModal.tsx:266", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/app/calendar/components/DayModal.tsx:266"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-009429b10a96ebc5", "name": "Stray `console.log` in TS/JS \u2014 src/app/calendar/components/DayModal.tsx:50", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/calendar/components/DayModal.tsx:50"}, "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-6f0b3d59721db601", "name": "Stray `console.log` in TS/JS \u2014 src/app/briefing/page.tsx:535", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/briefing/page.tsx:535"}, "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-994936cb2d10c844", "name": "Icon-only button without accessible name \u2014 src/app/activities/page.backup.tsx:816", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/app/activities/page.backup.tsx:816"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2d01ea8bc26eb3cd", "name": "Icon-only button without accessible name \u2014 src/app/activities/page.v2.backup.tsx:384", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/app/activities/page.v2.backup.tsx:384"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ff06732dd9f6372f", "name": "Icon-only button without accessible name \u2014 src/app/activities/page.tsx:5079", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/app/activities/page.tsx:5079"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b27cfda6dfdb3355", "name": "Stray `console.log` in TS/JS \u2014 src/app/activities/page.tsx:2286", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/activities/page.tsx:2286"}, "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-3869e3419cbf6790", "name": "Icon-only button without accessible name \u2014 src/app/nutrition/page.tsx:614", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/app/nutrition/page.tsx:614"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a0e98445d35abac1", "name": "Icon-only button without accessible name \u2014 src/app/nutrition/components/MealModal.tsx:98", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/app/nutrition/components/MealModal.tsx:98"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f9a822fcba6b445d", "name": "Icon-only button without accessible name \u2014 src/app/nutrition/components/MealCreateModal.tsx:153", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/app/nutrition/components/MealCreateModal.tsx:153"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8e741c45bef6b88f", "name": "Icon-only button without accessible name \u2014 src/app/nutrition/components/tabs/IngredientRow.tsx:34", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/app/nutrition/components/tabs/IngredientRow.tsx:34"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b1f73f526e1a837d", "name": "Stray `console.log` in TS/JS \u2014 src/app/recovery/components/SleepHypnogram.tsx:222", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/recovery/components/SleepHypnogram.tsx:222"}, "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-8bc3a7c57d1f8058", "name": "Stray `console.log` in TS/JS \u2014 src/app/recovery/components/PhysioSection.tsx:102", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/recovery/components/PhysioSection.tsx:102"}, "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-1205fae1822f4262", "name": "Stray `console.log` in TS/JS \u2014 src/app/recovery/components/DailyStepsCard.tsx:39", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/recovery/components/DailyStepsCard.tsx:39"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-33db5550d2bf00e8", "name": "Icon-only button without accessible name \u2014 src/app/recovery/components/RecoveryBanner.tsx:55", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/app/recovery/components/RecoveryBanner.tsx:55"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-02735c37cce7d402", "name": "Icon-only button without accessible name \u2014 src/app/planning/page.tsx:853", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/app/planning/page.tsx:853"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-864ac4ddb40d82c5", "name": "Stray `console.log` in TS/JS \u2014 src/app/planning/page.tsx:325", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/planning/page.tsx:325"}, "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-3b9ed4be098ed2f7", "name": "Stray `console.log` in TS/JS \u2014 src/app/planning/trainingBlocks.ts:34", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/planning/trainingBlocks.ts:34"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-83470f955fea8a23", "name": "Stray `console.log` in TS/JS \u2014 src/scripts/test-coach-stream.ts:29", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/scripts/test-coach-stream.ts:29"}, "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-1086643106bf068a", "name": "Stray `console.log` in TS/JS \u2014 src/hooks/useAIAnalysis.ts:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/hooks/useAIAnalysis.ts:14"}, "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-b6e592252a9391ca", "name": "Stray `console.log` in TS/JS \u2014 src/hooks/useMealLogRange.ts:48", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/hooks/useMealLogRange.ts:48"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-54b8b3da33da2b67", "name": "Icon-only button without accessible name \u2014 src/components/summary/PhotoViewer.tsx:37", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/summary/PhotoViewer.tsx:37"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b817863268e965bd", "name": "Icon-only button without accessible name \u2014 src/components/record/CyclingSettingsTraining.tsx:88", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/record/CyclingSettingsTraining.tsx:88"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9819e658729949e4", "name": "Icon-only button without accessible name \u2014 src/components/record/RowingSettings.tsx:35", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/record/RowingSettings.tsx:35"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-663a96d679e5db58", "name": "Icon-only button without accessible name \u2014 src/components/record/WorkoutLauncher.tsx:98", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/record/WorkoutLauncher.tsx:98"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-eb3c2faa0ffa7032", "name": "Icon-only button without accessible name \u2014 src/components/record/YogaExercisePicker.tsx:86", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/record/YogaExercisePicker.tsx:86"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4a7dbaca1d17fc85", "name": "Icon-only button without accessible name \u2014 src/components/record/MTBSettings.tsx:219", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/record/MTBSettings.tsx:219"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-40b65e0e39395fbb", "name": "Icon-only button without accessible name \u2014 src/components/record/FieldPicker.tsx:139", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/record/FieldPicker.tsx:139"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-35adbf3a88275870", "name": "Stray `console.log` in TS/JS \u2014 src/components/record/RouteCreator.tsx:94", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/record/RouteCreator.tsx:94"}, "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-e5c61ace3658c93a", "name": "Icon-only button without accessible name \u2014 src/components/record/YogaSettings.tsx:44", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/record/YogaSettings.tsx:44"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3d37076ca15ccc30", "name": "Icon-only button without accessible name \u2014 src/components/record/RowingSummary.tsx:40", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/record/RowingSummary.tsx:40"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b457bf3a1336dba5", "name": "Icon-only button without accessible name \u2014 src/components/record/SwimmingSettings.tsx:47", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/record/SwimmingSettings.tsx:47"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-dd3028dff63e76e5", "name": "Icon-only button without accessible name \u2014 src/components/record/WorkoutSettings.tsx:35", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/record/WorkoutSettings.tsx:35"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d6462d74eee413a1", "name": "Icon-only button without accessible name \u2014 src/components/record/PadelForm.tsx:107", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/record/PadelForm.tsx:107"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-49c2c56c5fd73036", "name": "Icon-only button without accessible name \u2014 src/components/record/YogaLauncher.tsx:60", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/record/YogaLauncher.tsx:60"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-63206659fc60071c", "name": "Icon-only button without accessible name \u2014 src/components/record/HikingSettings.tsx:207", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/record/HikingSettings.tsx:207"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-237f5c513cd32d51", "name": "Icon-only button without accessible name \u2014 src/components/record/SkiSettings.tsx:249", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/record/SkiSettings.tsx:249"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b630c89de5fca70b", "name": "Icon-only button without accessible name \u2014 src/components/record/SwimmingForm.tsx:110", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/record/SwimmingForm.tsx:110"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-651daa0429a81f56", "name": "Icon-only button without accessible name \u2014 src/components/record/workout/ExerciseSearch.tsx:32", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/record/workout/ExerciseSearch.tsx:32"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-beb626338e2e4534", "name": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 src/components/activity/RecordsBeaten.tsx:85", "shortDescription": {"text": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 src/components/activity/RecordsBeaten.tsx:85"}, "fullDescription": {"text": "React Flow edge labels render with a white rectangle behind the text by default, which scatters bright boxes across a dark canvas. Either drop the label, or override `.react-flow__edge-textbg` and `.react-flow__edge-text` in your stylesheet.\n\nWhy: P-H in CHECKLIST.md \u2014 vendor edge labels bleed white through a dark canvas.\nRule id: fq.edge-label.no-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c69fce0126d1c70b", "name": "Stray `console.log` in TS/JS \u2014 src/components/activity/LapsBikeChart.tsx:205", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/activity/LapsBikeChart.tsx:205"}, "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-e3f918f9f5138d23", "name": "Stray `console.log` in TS/JS \u2014 src/components/activity/LapsDetailView.tsx:547", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/activity/LapsDetailView.tsx:547"}, "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-31f1dc7c15892cac", "name": "Icon-only button without accessible name \u2014 src/components/recovery/CheckInModal.tsx:68", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/recovery/CheckInModal.tsx:68"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ebc41648d86a369c", "name": "Icon-only button without accessible name \u2014 src/components/planning/FocusPicker.tsx:36", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/planning/FocusPicker.tsx:36"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8db1b436c34b90ea", "name": "Icon-only button without accessible name \u2014 src/components/planning/GanttOverlay.tsx:27", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/planning/GanttOverlay.tsx:27"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9de51b9f596c4a4d", "name": "Icon-only button without accessible name \u2014 src/components/planning/SessionEditor.tsx:1014", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/planning/SessionEditor.tsx:1014"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4a0a68ce32c9e431", "name": "Stray `console.log` in TS/JS \u2014 src/components/planning/SessionEditor.tsx:2148", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/planning/SessionEditor.tsx:2148"}, "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-ebfa8ee6a1061dd6", "name": "Icon-only button without accessible name \u2014 src/components/planning/BlocDetailOverlay.tsx:70", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/planning/BlocDetailOverlay.tsx:70"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-51334891508c4216", "name": "Stray `console.log` in TS/JS \u2014 src/lib/polar.ts:36", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/polar.ts:36"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0eaedce8d00e5056", "name": "Stray `console.log` in TS/JS \u2014 src/lib/sync/strava.ts:177", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/sync/strava.ts:177"}, "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-4bd752d203342eb8", "name": "Stray `console.log` in TS/JS \u2014 src/lib/sync/polar.ts:33", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/sync/polar.ts:33"}, "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-6f0f65b5e9626dde", "name": "Stray `console.log` in TS/JS \u2014 src/lib/marketing/insta-api.ts:63", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/marketing/insta-api.ts:63"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-304d8ff0eeeeb6c4", "name": "Stray `console.log` in TS/JS \u2014 src/lib/marketing/auth.ts:59", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/marketing/auth.ts:59"}, "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-48dab6cdbd2be36f", "name": "Stray `console.log` in TS/JS \u2014 src/lib/records/triggerRecordsProcessing.ts:25", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/records/triggerRecordsProcessing.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-ea68b79170b69048", "name": "Insecure pattern 'cors_wildcard' in src/app/api/questionnaire/route.ts:5", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in src/app/api/questionnaire/route.ts:5"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f3787a21bb5af843", "name": "Insecure pattern 'local_storage_auth_token' in src/app/auth/page.tsx:107", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in src/app/auth/page.tsx:107"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3e2beeef37acda8c", "name": "Insecure pattern 'local_storage_auth_token' in src/app/auth/reset-password/page.tsx:51", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in src/app/auth/reset-password/page.tsx:51"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-85a53b77f4c19401", "name": "Insecure pattern 'document_write' in src/app/planning/page.tsx:1611", "shortDescription": {"text": "Insecure pattern 'document_write' in src/app/planning/page.tsx:1611"}, "fullDescription": {"text": "Found a known-risky pattern (document_write). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0e075704d2d95f30", "name": "Insecure pattern 'document_write' in src/components/planning/SessionEditor.tsx:4164", "shortDescription": {"text": "Insecure pattern 'document_write' in src/components/planning/SessionEditor.tsx:4164"}, "fullDescription": {"text": "Found a known-risky pattern (document_write). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8458414a3b1f575e", "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-0a89a2fd5f2c84aa", "name": "Very large file: src/app/profile/page.tsx (1986 lines)", "shortDescription": {"text": "Very large file: src/app/profile/page.tsx (1986 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-6764f4dfcc8e99a8", "name": "Very large file: src/app/performance/RadarChart.tsx (1470 lines)", "shortDescription": {"text": "Very large file: src/app/performance/RadarChart.tsx (1470 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-eb2e4feb893830c2", "name": "Very large file: src/app/performance/RacesSection.tsx (1900 lines)", "shortDescription": {"text": "Very large file: src/app/performance/RacesSection.tsx (1900 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-199d646ba34aa7f7", "name": "Very large file: src/app/performance/DatasTab.tsx (4889 lines)", "shortDescription": {"text": "Very large file: src/app/performance/DatasTab.tsx (4889 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-5a27f3ea72fd0582", "name": "Very large file: src/app/performance/page.tsx (2102 lines)", "shortDescription": {"text": "Very large file: src/app/performance/page.tsx (2102 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-d335b924bf76dafe", "name": "Very large file: src/app/performance/ClimbsSection.tsx (1257 lines)", "shortDescription": {"text": "Very large file: src/app/performance/ClimbsSection.tsx (1257 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-da34d9c03d8312ab", "name": "Very large file: src/app/session/page.tsx (2179 lines)", "shortDescription": {"text": "Very large file: src/app/session/page.tsx (2179 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-878073698a4d65a4", "name": "Very large file: src/app/connections/page.tsx (971 lines)", "shortDescription": {"text": "Very large file: src/app/connections/page.tsx (971 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-339a849bd9d0ccd2", "name": "Very large file: src/app/calendar/page.tsx (1491 lines)", "shortDescription": {"text": "Very large file: src/app/calendar/page.tsx (1491 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-8a904e45d73a6793", "name": "Very large file: src/app/briefing/page.tsx (1624 lines)", "shortDescription": {"text": "Very large file: src/app/briefing/page.tsx (1624 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-383e5dcee8b44968", "name": "Very large file: src/app/activities/page.backup.tsx (2251 lines)", "shortDescription": {"text": "Very large file: src/app/activities/page.backup.tsx (2251 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-5c3b128cfae73f93", "name": "Very large file: src/app/activities/page.tsx (9744 lines)", "shortDescription": {"text": "Very large file: src/app/activities/page.tsx (9744 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-99a183dd4ba07364", "name": "Very large file: src/app/nutrition/page.tsx (1616 lines)", "shortDescription": {"text": "Very large file: src/app/nutrition/page.tsx (1616 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-8dfc105133f27d68", "name": "Very large file: src/app/planning/page.tsx (4496 lines)", "shortDescription": {"text": "Very large file: src/app/planning/page.tsx (4496 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-46250240a95efdb9", "name": "Very large file: src/components/planning/SessionEditor.tsx (7181 lines)", "shortDescription": {"text": "Very large file: src/components/planning/SessionEditor.tsx (7181 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "5 test file(s) for 683 source file(s) (ratio 0.01). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 200 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 439 placeholder/mock markers across 82 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-17d866d91a7c451e", "name": "Agent instruction/config may expose a secret: CLAUDE.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: CLAUDE.md"}, "fullDescription": {"text": "Agent-facing files are routinely pasted into LLM/tool contexts. Move literal tokens, keys, and passwords into a secret manager or document them as placeholders only."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2c5f98b152cddb6d", "name": "Agent authority lacks a verifier contract: .claude/launch.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/launch.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-122f91b7f2906dc4", "name": "Agent authority lacks a verifier contract: .claude/settings.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/settings.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7861e282b99b4cb2", "name": "Agent authority lacks a verifier contract: .claude/skills/ui-ux-pro-max.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/ui-ux-pro-max.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9d51d4bb691bee78", "name": "Commented-code block (5 lines) in scripts/check-colors.mjs:7", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/check-colors.mjs: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-5d1208bad1f33d46", "name": "Legacy-named symbol `splash_v1` in src/app/ClientShell.tsx:15", "shortDescription": {"text": "Legacy-named symbol `splash_v1` in src/app/ClientShell.tsx:15"}, "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-0a92b3fbf1702e74", "name": "Commented-code block (6 lines) in src/app/page.tsx:4", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/page.tsx:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-aa69d437f71b5ace", "name": "Commented-code block (6 lines) in src/app/api/coach-stream/route.ts:6", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/coach-stream/route.ts:6"}, "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-e7d253486edebca1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/coach-stream/route.ts:237", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/coach-stream/route.ts:237"}, "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-90ac6de3a7cf4cc9", "name": "Commented-code block (6 lines) in src/app/api/stripe/checkout/route.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/stripe/checkout/route.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d3bd78b9a72092be", "name": "Commented-code block (5 lines) in src/app/api/stripe/portal/route.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/stripe/portal/route.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a65b90d264395393", "name": "Commented-code block (6 lines) in src/app/api/stripe/webhook/route.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/stripe/webhook/route.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-daed044e30cb0210", "name": "Commented-code block (5 lines) in src/app/api/training-plan/route.ts:236", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/training-plan/route.ts:236"}, "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-4652aa6bc63b44e6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/oauth/callback/route.ts:88", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/oauth/callback/route.ts:88"}, "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-ce3cdec0e012d04e", "name": "Commented-code block (6 lines) in src/app/api/admin/seed-dishes/route.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/admin/seed-dishes/route.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ecf6462b8ea699d0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/competences-ai/route.ts:48", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/competences-ai/route.ts:48"}, "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-b64d5507cc529792", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/strava/import-history/route.ts:29", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/strava/import-history/route.ts:29"}, "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-3242f94a12d1297c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/strava/activity-laps/route.ts:121", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/strava/activity-laps/route.ts:121"}, "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-311c08a75aa12000", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/strava/webhook-subscribe/route.ts:14", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/strava/webhook-subscribe/route.ts:14"}, "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-50052b20d221eb29", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/strava/upload-activity/route.ts:63", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/strava/upload-activity/route.ts:63"}, "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-28f55f7a9a6c6032", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/strava/webhook/route.ts:135", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/strava/webhook/route.ts:135"}, "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-b1605299cf94c368", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/strava/stats/route.ts:49", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/strava/stats/route.ts:49"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2616c0e6432f69e1", "name": "Commented-code block (5 lines) in src/app/api/briefing/route.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/briefing/route.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-960cbf37fc9bd5bc", "name": "Commented-code block (7 lines) in src/app/api/briefing/generate/route.ts:1", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/api/briefing/generate/route.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8f263e79653d30a8", "name": "Commented-code block (8 lines) in src/app/api/analyze-meal-photo/route.ts:5", "shortDescription": {"text": "Commented-code block (8 lines) in src/app/api/analyze-meal-photo/route.ts:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3b1c47e20e6a04b0", "name": "Commented-code block (5 lines) in src/app/api/activities/process-records/route.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/activities/process-records/route.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0699315e86566db9", "name": "Commented-code block (6 lines) in src/app/api/activities/backfill-records/route.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/activities/backfill-records/route.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8aa7057f4c9e9199", "name": "Commented-code block (5 lines) in src/app/api/coach-engine/route.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/coach-engine/route.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-98200d0d853b1716", "name": "Commented-code block (5 lines) in src/app/api/suggest-next-meal/route.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/suggest-next-meal/route.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-eb6762b793d9e35d", "name": "Commented-code block (5 lines) in src/app/admin/dishes/page.tsx:2", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/admin/dishes/page.tsx: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-7b2fc40e0d085efb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/marketing/page.tsx:92", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/marketing/page.tsx:92"}, "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-cd1873b393934f43", "name": "Commented-code block (6 lines) in src/app/performance/DistanceRecords.tsx:2", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/performance/DistanceRecords.tsx: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-4486392c8696245d", "name": "Legacy-named symbol `thw_zones_v1` in src/app/performance/DatasTab.tsx:1185", "shortDescription": {"text": "Legacy-named symbol `thw_zones_v1` in src/app/performance/DatasTab.tsx:1185"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9d32649236c11383", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/performance/DatasTab.tsx:3430", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/performance/DatasTab.tsx:3430"}, "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-74888631497bd500", "name": "Legacy-named symbol `thw_gym_custom_v1` in src/app/performance/gymShared.ts:36", "shortDescription": {"text": "Legacy-named symbol `thw_gym_custom_v1` in src/app/performance/gymShared.ts:36"}, "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-7741f0e8d321562e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/briefing/page.tsx:388", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/briefing/page.tsx:388"}, "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-7e6c5678aad82682", "name": "Commented-code block (6 lines) in src/app/progression/page.tsx:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/progression/page.tsx: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-0c0f28f1a9987c08", "name": "Commented-code block (6 lines) in src/app/progression/components/ProgressionSportView.tsx:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/progression/components/ProgressionSportView.tsx: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-6b514af914271c4c", "name": "Commented-code block (5 lines) in src/app/progression/components/ShurikenAnimated.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/progression/components/ShurikenAnimated.tsx: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-7a17e9536f63da0b", "name": "Commented-code block (5 lines) in src/app/progression/components/GeneralView.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/progression/components/GeneralView.tsx: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-2e673d332fe4e325", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/activities/page.backup.tsx:1317", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/activities/page.backup.tsx:1317"}, "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-797017556c3af38a", "name": "Commented-code block (6 lines) in src/app/activities/page.tsx:1449", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/activities/page.tsx:1449"}, "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-6515c00c400241b6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/nutrition/page.tsx:1051", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/nutrition/page.tsx:1051"}, "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-911304162e2a09c3", "name": "Commented-code block (10 lines) in src/app/nutrition/components/DayFoodJournal.tsx:3", "shortDescription": {"text": "Commented-code block (10 lines) in src/app/nutrition/components/DayFoodJournal.tsx: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-4fe521a5ae308d9c", "name": "Commented-code block (7 lines) in src/app/nutrition/components/NutritionRail.tsx:3", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/nutrition/components/NutritionRail.tsx: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-d9f9ab6ae3ef8179", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/nutrition/components/tabs/FoodSearch.tsx:61", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/nutrition/components/tabs/FoodSearch.tsx:61"}, "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-6c60a1db1265eee3", "name": "Commented-code block (7 lines) in src/app/nutrition/components/plan/PlanShoppingList.tsx:3", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/nutrition/components/plan/PlanShoppingList.tsx: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-13dfcd46af955e18", "name": "Commented-code block (6 lines) in src/app/nutrition/components/suivi/SuiviSection.tsx:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/nutrition/components/suivi/SuiviSection.tsx: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-8042e92dca60c006", "name": "Commented-code block (5 lines) in src/app/nutrition/components/suivi/suiviData.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/nutrition/components/suivi/suiviData.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-98a1d8234b60a432", "name": "Commented-code block (5 lines) in src/app/nutrition/components/suivi/SuiviCharts.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/nutrition/components/suivi/SuiviCharts.tsx: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-9209534bcd31ef71", "name": "Commented-code block (5 lines) in src/app/nutrition/components/today/PhotoMealEditor.tsx:2", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/nutrition/components/today/PhotoMealEditor.tsx: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-134cdcb481486869", "name": "Legacy-named symbol `coachIaPos_v2` in src/app/planning/page.tsx:1324", "shortDescription": {"text": "Legacy-named symbol `coachIaPos_v2` in src/app/planning/page.tsx:1324"}, "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-0db911ed82d69ded", "name": "Commented-code block (7 lines) in src/app/planning/page.tsx:193", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/planning/page.tsx:193"}, "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-456ee7565d4f4266", "name": "Legacy-named symbol `thw_training_blocs_v2` in src/app/planning/trainingBlocks.ts:13", "shortDescription": {"text": "Legacy-named symbol `thw_training_blocs_v2` in src/app/planning/trainingBlocks.ts:13"}, "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-93523d858302b9c7", "name": "Commented-code block (5 lines) in src/app/planning/trainingBlocks.ts:28", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/planning/trainingBlocks.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-ec445d3f2d19a697", "name": "Commented-code block (5 lines) in src/app/planning/components/training/TrainingSummary.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/planning/components/training/TrainingSummary.tsx: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-a3022211696cf49b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useStrava.ts:76", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useStrava.ts:76"}, "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-e6b21185ec4213c3", "name": "Commented-code block (5 lines) in src/hooks/useSpeechToText.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/hooks/useSpeechToText.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-6be1ef9aa20dfca0", "name": "Commented-code block (5 lines) in src/components/dashboard/useDashboardModel.ts:2", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/dashboard/useDashboardModel.ts: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-46dc8c938667bdb2", "name": "Commented-code block (5 lines) in src/components/dashboard/RecentRecords.tsx:2", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/dashboard/RecentRecords.tsx: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-3dd32cfd92829f3a", "name": "Commented-code block (6 lines) in src/components/dashboard/SleepCard.tsx:2", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/dashboard/SleepCard.tsx: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-5b9fa3f3f0149f7c", "name": "Commented-code block (6 lines) in src/components/dashboard/CoachAICard.tsx:2", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/dashboard/CoachAICard.tsx: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-b223366d3cfcc330", "name": "Commented-code block (5 lines) in src/components/dashboard/useDashboardActivities.ts:2", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/dashboard/useDashboardActivities.ts: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-b5b95bd84e7a64d9", "name": "Commented-code block (6 lines) in src/components/dashboard/DataGrid.tsx:2", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/dashboard/DataGrid.tsx: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-3181309008afadb1", "name": "Commented-code block (6 lines) in src/components/dashboard/NextSessionsCard.tsx:2", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/dashboard/NextSessionsCard.tsx: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-92f3cbdf404d2fce", "name": "Commented-code block (5 lines) in src/components/dashboard/DashboardContent.tsx:2", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/dashboard/DashboardContent.tsx: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-3c0c4e9f6383c615", "name": "Commented-code block (7 lines) in src/components/dashboard/NutritionCard.tsx:2", "shortDescription": {"text": "Commented-code block (7 lines) in src/components/dashboard/NutritionCard.tsx: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-85273b8b5d751f69", "name": "Commented-code block (5 lines) in src/components/dashboard/PmcChart.tsx:2", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/dashboard/PmcChart.tsx: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-0826a91a2a441b1c", "name": "Commented-code block (5 lines) in src/components/dashboard/TodayCard.tsx:2", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/dashboard/TodayCard.tsx: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-46f33a45de692cd6", "name": "Commented-code block (5 lines) in src/components/dashboard/primitives.tsx:2", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/dashboard/primitives.tsx: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-09108f4a67cc84f0", "name": "Commented-code block (6 lines) in src/components/dashboard/FormeArc.tsx:2", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/dashboard/FormeArc.tsx: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-7b14e22b1bb25e05", "name": "Commented-code block (5 lines) in src/components/dashboard/WeekSummary.tsx:2", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/dashboard/WeekSummary.tsx: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-66104625df0aad95", "name": "Commented-code block (7 lines) in src/components/activity/WorkoutTypeBadges.tsx:3", "shortDescription": {"text": "Commented-code block (7 lines) in src/components/activity/WorkoutTypeBadges.tsx: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-cbd696c685cda8d1", "name": "Commented-code block (5 lines) in src/components/activity/MuscuActivityView.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/activity/MuscuActivityView.tsx: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-fac9a1ab6b89a78e", "name": "Commented-code block (5 lines) in src/components/activity/ActivityMapCard.tsx:98", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/activity/ActivityMapCard.tsx:98"}, "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-bb28cc92cb83114f", "name": "Commented-code block (7 lines) in src/components/activity/ClimbDescentSection.tsx:3", "shortDescription": {"text": "Commented-code block (7 lines) in src/components/activity/ClimbDescentSection.tsx: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-263958dd1b54dd4c", "name": "Commented-code block (5 lines) in src/components/activity/ActivityCard.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/activity/ActivityCard.tsx: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-7c4afeab1c4c2f3c", "name": "Commented-code block (7 lines) in src/components/activity/RunningLapsSection.tsx:3", "shortDescription": {"text": "Commented-code block (7 lines) in src/components/activity/RunningLapsSection.tsx: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-54dd25c695f1a068", "name": "Commented-code block (8 lines) in src/components/activity/LapsRunChart.tsx:3", "shortDescription": {"text": "Commented-code block (8 lines) in src/components/activity/LapsRunChart.tsx: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-3e732ea07e07558c", "name": "Commented-code block (5 lines) in src/components/shared/Sidebar.tsx:36", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/shared/Sidebar.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-0f72421a6ec180a7", "name": "Commented-code block (5 lines) in src/components/navigation/SectionLayout.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/navigation/SectionLayout.tsx: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-ffad57052951145a", "name": "Commented-code block (5 lines) in src/components/nutrition/DishPickerSheet.tsx:2", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/nutrition/DishPickerSheet.tsx: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-1d575463b1b93fda", "name": "Commented-code block (6 lines) in src/components/recovery/RecoveryTrendChart.tsx:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/recovery/RecoveryTrendChart.tsx: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-12ed55e7dd60a53a", "name": "Commented-code block (6 lines) in src/components/recovery/overviewData.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/recovery/overviewData.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c2821c95ca7081cb", "name": "Commented-code block (5 lines) in src/components/ai/PlanProposalCard.tsx:6", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/ai/PlanProposalCard.tsx:6"}, "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-9a27e4ca4ccfe237", "name": "Commented-code block (5 lines) in src/components/ai/GlobalAIButton.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/ai/GlobalAIButton.tsx: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-f49a7c71b0530f8b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/ai/HybridNetworksPanel.tsx:307", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/ai/HybridNetworksPanel.tsx:307"}, "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-a6570194c6b89bd5", "name": "Commented-code block (7 lines) in src/components/ai/MethodPicker.tsx:3", "shortDescription": {"text": "Commented-code block (7 lines) in src/components/ai/MethodPicker.tsx: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-5b1255753f6c552e", "name": "Commented-code block (5 lines) in src/components/ai/CoachQuestionCard.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/ai/CoachQuestionCard.tsx: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-b2add793c06e77cd", "name": "Commented-code block (6 lines) in src/components/ai/MobileSheet.tsx:6", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/ai/MobileSheet.tsx:6"}, "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-34cee7abca0b7b4c", "name": "Commented-code block (8 lines) in src/components/ai/VoiceOverlay.tsx:6", "shortDescription": {"text": "Commented-code block (8 lines) in src/components/ai/VoiceOverlay.tsx:6"}, "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-4f340f22b3c79778", "name": "Commented-code block (5 lines) in src/components/planning/FriseV1.tsx:2", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/planning/FriseV1.tsx: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-4c8304fcfbdec8a4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/planning/SessionEditor.tsx:4516", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/planning/SessionEditor.tsx:4516"}, "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-d2e64354cdacf291", "name": "Commented-code block (5 lines) in src/components/ui/TabbedPageLayout.tsx:2", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/ui/TabbedPageLayout.tsx: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-99b78137e2490bae", "name": "Commented-code block (5 lines) in src/components/ui/MacroDonut.tsx:6", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/ui/MacroDonut.tsx:6"}, "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-fae90886421e59c4", "name": "Commented-code block (5 lines) in src/lib/dish-catalogue.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/dish-catalogue.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3d5053edd7122a84", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/openrouteservice.ts:47", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/openrouteservice.ts:47"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-93a62b8cfe955628", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/polar.ts:38", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/polar.ts:38"}, "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-887c2d6da2e8c983", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/agents/performanceAgents.ts:50", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/agents/performanceAgents.ts:50"}, "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-c3e5ace1d4ad4ca5", "name": "Commented-code block (5 lines) in src/lib/agents/base.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/agents/base.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2bd6a7f4e6a4417d", "name": "Commented-code block (8 lines) in src/lib/training/pmc.ts:1", "shortDescription": {"text": "Commented-code block (8 lines) in src/lib/training/pmc.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f26f7e337c8b7204", "name": "Commented-code block (6 lines) in src/lib/gear/stats.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/gear/stats.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f5158198393a69f0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sync/wahoo.ts:26", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sync/wahoo.ts:26"}, "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-38fbe9469efa01c0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sync/withings.ts:17", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sync/withings.ts:17"}, "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-53aff86e8cb95547", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sync/strava.ts:69", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sync/strava.ts:69"}, "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-7f4b09696d0f28d3", "name": "Commented-code block (5 lines) in src/lib/utils/vap.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/utils/vap.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0e5f85140625ef7f", "name": "Commented-code block (5 lines) in src/lib/utils/pace.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/utils/pace.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e1b8a5d9a57ddb6c", "name": "Commented-code block (5 lines) in src/lib/tokens/limits.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/tokens/limits.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-59ba8dfa0b49d2ea", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/oauth/tokens.ts:108", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/oauth/tokens.ts:108"}, "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-2221144135a426ee", "name": "Commented-code block (5 lines) in src/lib/health/sleep.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/health/sleep.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d818d7ee849dafb5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/marketing/insta-api.ts:92", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/marketing/insta-api.ts:92"}, "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-32ff2089fd95cff6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/strava/activities.ts:50", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/strava/activities.ts:50"}, "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-82a1275ca15bc98d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/strava/tokens.ts:35", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/strava/tokens.ts:35"}, "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-9c8c468426c8ab30", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/strava/streams.ts:68", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/strava/streams.ts:68"}, "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-854a8197423bda67", "name": "Commented-code block (5 lines) in src/lib/quick-actions/models.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/quick-actions/models.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2486165b6d11c0f5", "name": "Commented-code block (5 lines) in src/lib/progression/helpers.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/progression/helpers.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d550e4a032c463b2", "name": "Commented-code block (5 lines) in src/lib/progression/sportConfig.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/progression/sportConfig.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-753fce3d1f468922", "name": "Commented-code block (6 lines) in src/lib/records/processBikeActivity.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/records/processBikeActivity.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1e71532a387c8e69", "name": "Commented-code block (5 lines) in src/lib/coach-engine/mapping.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/coach-engine/mapping.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6abe97c26efee1f0", "name": "Commented-code block (5 lines) in src/lib/coach-engine/client.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/coach-engine/client.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-42a1fdea822ec5ce", "name": "Commented-code block (5 lines) in src/lib/ai/competences.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/ai/competences.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e53c24215fd4cf9d", "name": "Commented-code block (6 lines) in src/lib/coach/tools-definition.ts:8", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/coach/tools-definition.ts:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ba613a95d1b481ef", "name": "Commented-code block (5 lines) in src/lib/coach/doctrine/registry.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/coach/doctrine/registry.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a4e3a1ff9dbd9e35", "name": "Commented-code block (10 lines) in docs/CHART_EXAMPLES.tsx:9", "shortDescription": {"text": "Commented-code block (10 lines) in docs/CHART_EXAMPLES.tsx:9"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/24058"}, "properties": {"repository": "alexandreet92-lang/thw-appli", "repoUrl": "https://github.com/alexandreet92-lang/thw-appli", "branch": "main"}, "results": [{"ruleId": "scanner-bead75b0f9233e05", "level": "none", "message": {"text": "No API endpoints detected"}, "properties": {"repobilityId": "0f8bb852027c38f8", "scanner": "scanner-primary", "fingerprint": "bead75b0f9233e05", "layer": "api", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-233ae595813c0471", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/sync/[provider]/route.ts:80"}, "properties": {"repobilityId": "4cec4c9e3f9f767e", "scanner": "scanner-primary", "fingerprint": "233ae595813c0471", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1e36a4211f86ef98", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/coach-stream/route.ts:181"}, "properties": {"repobilityId": "9e707a5fd0e9e685", "scanner": "scanner-primary", "fingerprint": "1e36a4211f86ef98", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b6b78350dd92e326", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/stripe/checkout/route.ts:20"}, "properties": {"repobilityId": "24b063fb7eb1f305", "scanner": "scanner-primary", "fingerprint": "b6b78350dd92e326", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-63a4d7e2b7109f97", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/stripe/webhook/route.ts:97"}, "properties": {"repobilityId": "e3501193b3efa3b7", "scanner": "scanner-primary", "fingerprint": "63a4d7e2b7109f97", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8782df758baf53c4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/training-plan/route.ts:210"}, "properties": {"repobilityId": "ea6010d26d651b8b", "scanner": "scanner-primary", "fingerprint": "8782df758baf53c4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6cc427399e99a65a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/oauth/connect/route.ts:32"}, "properties": {"repobilityId": "9354b5445c3fef2d", "scanner": "scanner-primary", "fingerprint": "6cc427399e99a65a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7091bda96bdd6b6b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/oauth/callback/route.ts:41"}, "properties": {"repobilityId": "28f87fa30339518d", "scanner": "scanner-primary", "fingerprint": "7091bda96bdd6b6b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-141b8011fcd29159", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/marketing/daily-brief/route.ts:41"}, "properties": {"repobilityId": "4b1e6cccea8d8bac", "scanner": "scanner-primary", "fingerprint": "141b8011fcd29159", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b20f6092e7546c6f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/marketing/analyze-performance/route.ts:119"}, "properties": {"repobilityId": "8c8a55424e93527d", "scanner": "scanner-primary", "fingerprint": "b20f6092e7546c6f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-04d2b087014291c2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/marketing/insta-upload/route.ts:50"}, "properties": {"repobilityId": "452f675db60f9797", "scanner": "scanner-primary", "fingerprint": "04d2b087014291c2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5dc3b328607d98e1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/marketing/insta-sync/route.ts:54"}, "properties": {"repobilityId": "76af4585169b3a6a", "scanner": "scanner-primary", "fingerprint": "5dc3b328607d98e1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-05429e08ec62e975", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/strava/sync-maps/route.ts:92"}, "properties": {"repobilityId": "004c21dfbab2aeb0", "scanner": "scanner-primary", "fingerprint": "05429e08ec62e975", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-876961626ec6610f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/strava/activity-laps/route.ts:99"}, "properties": {"repobilityId": "6b04878059abdfcf", "scanner": "scanner-primary", "fingerprint": "876961626ec6610f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d4784790d3b84332", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/strava/webhook-subscribe/route.ts:26"}, "properties": {"repobilityId": "0c69b0faea14700b", "scanner": "scanner-primary", "fingerprint": "d4784790d3b84332", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8a7d1c4dd18ba296", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/strava/webhook/route.ts:99"}, "properties": {"repobilityId": "cedea3e14a0ff471", "scanner": "scanner-primary", "fingerprint": "8a7d1c4dd18ba296", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-16a73b7768abdbe9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/briefing/route.ts:46"}, "properties": {"repobilityId": "fe6bfa17d2dd8226", "scanner": "scanner-primary", "fingerprint": "16a73b7768abdbe9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-beaf22d6f136a801", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/briefing/generate/route.ts:303"}, "properties": {"repobilityId": "5585ff758e0f489c", "scanner": "scanner-primary", "fingerprint": "beaf22d6f136a801", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b671f44684350a72", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/activities/backfill-records/route.ts:17"}, "properties": {"repobilityId": "7434387f1abbda75", "scanner": "scanner-primary", "fingerprint": "b671f44684350a72", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-696ea898c88ed8fd", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/app/profile/page.tsx:130"}, "properties": {"repobilityId": "ad5f28372362b5f1", "scanner": "scanner-primary", "fingerprint": "696ea898c88ed8fd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-a31be6b9ac7a3e3d", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/app/performance/TriathlonDrawer.tsx:90"}, "properties": {"repobilityId": "513a3b3d3263c90e", "scanner": "scanner-primary", "fingerprint": "a31be6b9ac7a3e3d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-2229a4fcf5592704", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/app/performance/LinkActivitySheet.tsx:39"}, "properties": {"repobilityId": "82121b082293336b", "scanner": "scanner-primary", "fingerprint": "2229a4fcf5592704", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-48dd1c321f160bcb", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/app/performance/HyroxRaceSheet.tsx:56"}, "properties": {"repobilityId": "0fda95f2bc652e30", "scanner": "scanner-primary", "fingerprint": "48dd1c321f160bcb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-d4827b4db1631f88", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/app/performance/AddExerciseSheet.tsx:37"}, "properties": {"repobilityId": "ce23f7848832ed52", "scanner": "scanner-primary", "fingerprint": "d4827b4db1631f88", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-60c0bf65fc478043", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/app/performance/RadarChart.tsx:832"}, "properties": {"repobilityId": "306d6528afd232c6", "scanner": "scanner-primary", "fingerprint": "60c0bf65fc478043", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-37aef9a6b49b30e8", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/app/performance/RacesSection.tsx:677"}, "properties": {"repobilityId": "bc45efc0f1cd0641", "scanner": "scanner-primary", "fingerprint": "37aef9a6b49b30e8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-b9eebc99d175e31e", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/app/performance/GymEditSheet.tsx:58"}, "properties": {"repobilityId": "d3969f5e7d1b64c5", "scanner": "scanner-primary", "fingerprint": "b9eebc99d175e31e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-89a85deff1e65e2a", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/app/performance/DatasTab.tsx:673"}, "properties": {"repobilityId": "dd33a24c974780b6", "scanner": "scanner-primary", "fingerprint": "89a85deff1e65e2a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-b6ecaf607b05d0aa", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/app/performance/page.tsx:166"}, "properties": {"repobilityId": "4951bb5958df068e", "scanner": "scanner-primary", "fingerprint": "b6ecaf607b05d0aa", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-0dde2eb883821fef", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/app/performance/ClimbsSection.tsx:525"}, "properties": {"repobilityId": "cdb3a87c5d1191fc", "scanner": "scanner-primary", "fingerprint": "0dde2eb883821fef", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-37920f05b214e0dd", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/app/session/page.tsx:2141"}, "properties": {"repobilityId": "d253ebba8076deee", "scanner": "scanner-primary", "fingerprint": "37920f05b214e0dd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-0821c02b4e12966a", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/app/connections/page.tsx:767"}, "properties": {"repobilityId": "05ced50ddc1115eb", "scanner": "scanner-primary", "fingerprint": "0821c02b4e12966a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-61b1168421f8f61a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/connections/page.tsx:635"}, "properties": {"repobilityId": "fa59b443db635e30", "scanner": "scanner-primary", "fingerprint": "61b1168421f8f61a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e6cf5816c9713c3b", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/app/calendar/page.tsx:434"}, "properties": {"repobilityId": "66ed5f2b33239d42", "scanner": "scanner-primary", "fingerprint": "e6cf5816c9713c3b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-282ff80408521de2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/calendar/page.tsx:229"}, "properties": {"repobilityId": "0a6d7f50089c623a", "scanner": "scanner-primary", "fingerprint": "282ff80408521de2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5f967428ce993024", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/app/calendar/components/MonthlyView.tsx:144"}, "properties": {"repobilityId": "bd5bbcf9791b1792", "scanner": "scanner-primary", "fingerprint": "5f967428ce993024", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-b307e568d6f57a4a", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/app/calendar/components/EventModal.tsx:137"}, "properties": {"repobilityId": "f6fa5310ed67824d", "scanner": "scanner-primary", "fingerprint": "b307e568d6f57a4a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-369771cf0d213f02", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/app/calendar/components/RaceModal.tsx:109"}, "properties": {"repobilityId": "f7990b9d3f92ec50", "scanner": "scanner-primary", "fingerprint": "369771cf0d213f02", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-87b1f6585f84ae7b", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/app/calendar/components/DayModal.tsx:266"}, "properties": {"repobilityId": "e769ad6d30794388", "scanner": "scanner-primary", "fingerprint": "87b1f6585f84ae7b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-009429b10a96ebc5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/calendar/components/DayModal.tsx:50"}, "properties": {"repobilityId": "fbb703795b9379de", "scanner": "scanner-primary", "fingerprint": "009429b10a96ebc5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6f0b3d59721db601", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/briefing/page.tsx:535"}, "properties": {"repobilityId": "2f36959fc7c26d74", "scanner": "scanner-primary", "fingerprint": "6f0b3d59721db601", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-994936cb2d10c844", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/app/activities/page.backup.tsx:816"}, "properties": {"repobilityId": "2535af0dc2a11cda", "scanner": "scanner-primary", "fingerprint": "994936cb2d10c844", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-2d01ea8bc26eb3cd", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/app/activities/page.v2.backup.tsx:384"}, "properties": {"repobilityId": "171cd76d0b93e049", "scanner": "scanner-primary", "fingerprint": "2d01ea8bc26eb3cd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-ff06732dd9f6372f", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/app/activities/page.tsx:5079"}, "properties": {"repobilityId": "71609b800c4014b5", "scanner": "scanner-primary", "fingerprint": "ff06732dd9f6372f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-b27cfda6dfdb3355", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/activities/page.tsx:2286"}, "properties": {"repobilityId": "bc828477cd17b432", "scanner": "scanner-primary", "fingerprint": "b27cfda6dfdb3355", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3869e3419cbf6790", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/app/nutrition/page.tsx:614"}, "properties": {"repobilityId": "e3170dd40b5e13f3", "scanner": "scanner-primary", "fingerprint": "3869e3419cbf6790", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-a0e98445d35abac1", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/app/nutrition/components/MealModal.tsx:98"}, "properties": {"repobilityId": "e2c6059171ac209e", "scanner": "scanner-primary", "fingerprint": "a0e98445d35abac1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-f9a822fcba6b445d", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/app/nutrition/components/MealCreateModal.tsx:153"}, "properties": {"repobilityId": "4c4d317c494897af", "scanner": "scanner-primary", "fingerprint": "f9a822fcba6b445d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-8e741c45bef6b88f", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/app/nutrition/components/tabs/IngredientRow.tsx:34"}, "properties": {"repobilityId": "f34d82eb84538f5a", "scanner": "scanner-primary", "fingerprint": "8e741c45bef6b88f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-b1f73f526e1a837d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/recovery/components/SleepHypnogram.tsx:222"}, "properties": {"repobilityId": "60acf8b77885f87e", "scanner": "scanner-primary", "fingerprint": "b1f73f526e1a837d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8bc3a7c57d1f8058", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/recovery/components/PhysioSection.tsx:102"}, "properties": {"repobilityId": "b509d289c402895b", "scanner": "scanner-primary", "fingerprint": "8bc3a7c57d1f8058", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1205fae1822f4262", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/recovery/components/DailyStepsCard.tsx:39"}, "properties": {"repobilityId": "7d1920a9db369ffb", "scanner": "scanner-primary", "fingerprint": "1205fae1822f4262", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-33db5550d2bf00e8", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/app/recovery/components/RecoveryBanner.tsx:55"}, "properties": {"repobilityId": "36f7f457721ca68d", "scanner": "scanner-primary", "fingerprint": "33db5550d2bf00e8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-02735c37cce7d402", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/app/planning/page.tsx:853"}, "properties": {"repobilityId": "ed585d4072075087", "scanner": "scanner-primary", "fingerprint": "02735c37cce7d402", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-864ac4ddb40d82c5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/planning/page.tsx:325"}, "properties": {"repobilityId": "c42339d6a47c378d", "scanner": "scanner-primary", "fingerprint": "864ac4ddb40d82c5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3b9ed4be098ed2f7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/planning/trainingBlocks.ts:34"}, "properties": {"repobilityId": "b2b66a1f3fd1c0bd", "scanner": "scanner-primary", "fingerprint": "3b9ed4be098ed2f7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-83470f955fea8a23", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/scripts/test-coach-stream.ts:29"}, "properties": {"repobilityId": "365f8d9ebf056d91", "scanner": "scanner-primary", "fingerprint": "83470f955fea8a23", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1086643106bf068a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/hooks/useAIAnalysis.ts:14"}, "properties": {"repobilityId": "3b5ee8fcdab3f6d7", "scanner": "scanner-primary", "fingerprint": "1086643106bf068a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b6e592252a9391ca", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/hooks/useMealLogRange.ts:48"}, "properties": {"repobilityId": "5f10b6c8e94f9990", "scanner": "scanner-primary", "fingerprint": "b6e592252a9391ca", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-54b8b3da33da2b67", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/summary/PhotoViewer.tsx:37"}, "properties": {"repobilityId": "4b7d0b61a9254387", "scanner": "scanner-primary", "fingerprint": "54b8b3da33da2b67", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-b817863268e965bd", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/record/CyclingSettingsTraining.tsx:88"}, "properties": {"repobilityId": "29cc06051b1604af", "scanner": "scanner-primary", "fingerprint": "b817863268e965bd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-9819e658729949e4", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/record/RowingSettings.tsx:35"}, "properties": {"repobilityId": "fa835a87864700a3", "scanner": "scanner-primary", "fingerprint": "9819e658729949e4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-663a96d679e5db58", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/record/WorkoutLauncher.tsx:98"}, "properties": {"repobilityId": "75fb44f1eedfd13e", "scanner": "scanner-primary", "fingerprint": "663a96d679e5db58", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-eb3c2faa0ffa7032", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/record/YogaExercisePicker.tsx:86"}, "properties": {"repobilityId": "d0f54e45c9649a94", "scanner": "scanner-primary", "fingerprint": "eb3c2faa0ffa7032", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-4a7dbaca1d17fc85", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/record/MTBSettings.tsx:219"}, "properties": {"repobilityId": "8d2aaeb150c49d08", "scanner": "scanner-primary", "fingerprint": "4a7dbaca1d17fc85", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-40b65e0e39395fbb", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/record/FieldPicker.tsx:139"}, "properties": {"repobilityId": "7de0fc6f5b279567", "scanner": "scanner-primary", "fingerprint": "40b65e0e39395fbb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-35adbf3a88275870", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/record/RouteCreator.tsx:94"}, "properties": {"repobilityId": "4f5164d848d052b3", "scanner": "scanner-primary", "fingerprint": "35adbf3a88275870", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e5c61ace3658c93a", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/record/YogaSettings.tsx:44"}, "properties": {"repobilityId": "8a78ca4ef8657992", "scanner": "scanner-primary", "fingerprint": "e5c61ace3658c93a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-3d37076ca15ccc30", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/record/RowingSummary.tsx:40"}, "properties": {"repobilityId": "80d9c89f47f931d2", "scanner": "scanner-primary", "fingerprint": "3d37076ca15ccc30", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-b457bf3a1336dba5", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/record/SwimmingSettings.tsx:47"}, "properties": {"repobilityId": "9e4d6e03daa1be91", "scanner": "scanner-primary", "fingerprint": "b457bf3a1336dba5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-dd3028dff63e76e5", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/record/WorkoutSettings.tsx:35"}, "properties": {"repobilityId": "e8994c41883a0b60", "scanner": "scanner-primary", "fingerprint": "dd3028dff63e76e5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-d6462d74eee413a1", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/record/PadelForm.tsx:107"}, "properties": {"repobilityId": "714708456d623f70", "scanner": "scanner-primary", "fingerprint": "d6462d74eee413a1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-49c2c56c5fd73036", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/record/YogaLauncher.tsx:60"}, "properties": {"repobilityId": "5db5390561006974", "scanner": "scanner-primary", "fingerprint": "49c2c56c5fd73036", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-63206659fc60071c", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/record/HikingSettings.tsx:207"}, "properties": {"repobilityId": "d98ee872bb8d0f72", "scanner": "scanner-primary", "fingerprint": "63206659fc60071c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-237f5c513cd32d51", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/record/SkiSettings.tsx:249"}, "properties": {"repobilityId": "d12cf80320bdd88b", "scanner": "scanner-primary", "fingerprint": "237f5c513cd32d51", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-b630c89de5fca70b", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/record/SwimmingForm.tsx:110"}, "properties": {"repobilityId": "0675e7d509f83b83", "scanner": "scanner-primary", "fingerprint": "b630c89de5fca70b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-651daa0429a81f56", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/record/workout/ExerciseSearch.tsx:32"}, "properties": {"repobilityId": "0119fca15eac62dd", "scanner": "scanner-primary", "fingerprint": "651daa0429a81f56", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-beb626338e2e4534", "level": "note", "message": {"text": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 src/components/activity/RecordsBeaten.tsx:85"}, "properties": {"repobilityId": "3ecc74f67d910a65", "scanner": "scanner-primary", "fingerprint": "beb626338e2e4534", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.edge-label.no-bg"]}}, {"ruleId": "scanner-c69fce0126d1c70b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/activity/LapsBikeChart.tsx:205"}, "properties": {"repobilityId": "4df9f7ec280d277f", "scanner": "scanner-primary", "fingerprint": "c69fce0126d1c70b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e3f918f9f5138d23", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/activity/LapsDetailView.tsx:547"}, "properties": {"repobilityId": "4bf57119fbe8e7e0", "scanner": "scanner-primary", "fingerprint": "e3f918f9f5138d23", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-31f1dc7c15892cac", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/recovery/CheckInModal.tsx:68"}, "properties": {"repobilityId": "a2d41d5cfc2e42b0", "scanner": "scanner-primary", "fingerprint": "31f1dc7c15892cac", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-ebc41648d86a369c", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/planning/FocusPicker.tsx:36"}, "properties": {"repobilityId": "69cd2056bfd2660a", "scanner": "scanner-primary", "fingerprint": "ebc41648d86a369c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-8db1b436c34b90ea", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/planning/GanttOverlay.tsx:27"}, "properties": {"repobilityId": "13440f74cd317aa4", "scanner": "scanner-primary", "fingerprint": "8db1b436c34b90ea", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-9de51b9f596c4a4d", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/planning/SessionEditor.tsx:1014"}, "properties": {"repobilityId": "a3156c3ab5bd56f3", "scanner": "scanner-primary", "fingerprint": "9de51b9f596c4a4d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-4a0a68ce32c9e431", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/planning/SessionEditor.tsx:2148"}, "properties": {"repobilityId": "ad0fffaac1c20e16", "scanner": "scanner-primary", "fingerprint": "4a0a68ce32c9e431", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ebfa8ee6a1061dd6", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/planning/BlocDetailOverlay.tsx:70"}, "properties": {"repobilityId": "6b82934dbdedcdbd", "scanner": "scanner-primary", "fingerprint": "ebfa8ee6a1061dd6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-51334891508c4216", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/polar.ts:36"}, "properties": {"repobilityId": "7c8780197bdf19e8", "scanner": "scanner-primary", "fingerprint": "51334891508c4216", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0eaedce8d00e5056", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/sync/strava.ts:177"}, "properties": {"repobilityId": "22b39f58118b71a2", "scanner": "scanner-primary", "fingerprint": "0eaedce8d00e5056", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4bd752d203342eb8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/sync/polar.ts:33"}, "properties": {"repobilityId": "b071556ec3da550f", "scanner": "scanner-primary", "fingerprint": "4bd752d203342eb8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6f0f65b5e9626dde", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/marketing/insta-api.ts:63"}, "properties": {"repobilityId": "fbd4095bedc552af", "scanner": "scanner-primary", "fingerprint": "6f0f65b5e9626dde", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-304d8ff0eeeeb6c4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/marketing/auth.ts:59"}, "properties": {"repobilityId": "69817ee564180f17", "scanner": "scanner-primary", "fingerprint": "304d8ff0eeeeb6c4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-48dab6cdbd2be36f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/records/triggerRecordsProcessing.ts:25"}, "properties": {"repobilityId": "5b094e48d4e3fb8e", "scanner": "scanner-primary", "fingerprint": "48dab6cdbd2be36f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ea68b79170b69048", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in src/app/api/questionnaire/route.ts:5"}, "properties": {"repobilityId": "faf1921e2fc5b7e3", "scanner": "scanner-primary", "fingerprint": "ea68b79170b69048", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/api/questionnaire/route.ts"}, "region": {"startLine": 5}}}]}, {"ruleId": "scanner-f3787a21bb5af843", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in src/app/auth/page.tsx:107"}, "properties": {"repobilityId": "5539d1d2160cbeb8", "scanner": "scanner-primary", "fingerprint": "f3787a21bb5af843", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/auth/page.tsx"}, "region": {"startLine": 107}}}]}, {"ruleId": "scanner-3e2beeef37acda8c", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in src/app/auth/reset-password/page.tsx:51"}, "properties": {"repobilityId": "7b5f38a16ff2d297", "scanner": "scanner-primary", "fingerprint": "3e2beeef37acda8c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/auth/reset-password/page.tsx"}, "region": {"startLine": 51}}}]}, {"ruleId": "scanner-85a53b77f4c19401", "level": "note", "message": {"text": "Insecure pattern 'document_write' in src/app/planning/page.tsx:1611"}, "properties": {"repobilityId": "0774d8a799c90b93", "scanner": "scanner-primary", "fingerprint": "85a53b77f4c19401", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/planning/page.tsx"}, "region": {"startLine": 1611}}}]}, {"ruleId": "scanner-0e075704d2d95f30", "level": "note", "message": {"text": "Insecure pattern 'document_write' in src/components/planning/SessionEditor.tsx:4164"}, "properties": {"repobilityId": "dc7e8ba5e85cc478", "scanner": "scanner-primary", "fingerprint": "0e075704d2d95f30", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/planning/SessionEditor.tsx"}, "region": {"startLine": 4164}}}]}, {"ruleId": "scanner-8458414a3b1f575e", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "42d0d7a68c79f5ef", "scanner": "scanner-primary", "fingerprint": "8458414a3b1f575e", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/notion-sync.yml"}, "region": {"startLine": 13}}}]}, {"ruleId": "scanner-8458414a3b1f575e", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "d1fadca1569e6959", "scanner": "scanner-primary", "fingerprint": "8458414a3b1f575e", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/notion-sync.yml"}, "region": {"startLine": 16}}}]}, {"ruleId": "scanner-0a89a2fd5f2c84aa", "level": "note", "message": {"text": "Very large file: src/app/profile/page.tsx (1986 lines)"}, "properties": {"repobilityId": "4b20e8dbb666e1f4", "scanner": "scanner-primary", "fingerprint": "0a89a2fd5f2c84aa", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6764f4dfcc8e99a8", "level": "note", "message": {"text": "Very large file: src/app/performance/RadarChart.tsx (1470 lines)"}, "properties": {"repobilityId": "928d667d7e0ea113", "scanner": "scanner-primary", "fingerprint": "6764f4dfcc8e99a8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-eb2e4feb893830c2", "level": "note", "message": {"text": "Very large file: src/app/performance/RacesSection.tsx (1900 lines)"}, "properties": {"repobilityId": "60a3db5e332d3a1d", "scanner": "scanner-primary", "fingerprint": "eb2e4feb893830c2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-199d646ba34aa7f7", "level": "note", "message": {"text": "Very large file: src/app/performance/DatasTab.tsx (4889 lines)"}, "properties": {"repobilityId": "67d0c0b4ed715065", "scanner": "scanner-primary", "fingerprint": "199d646ba34aa7f7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-5a27f3ea72fd0582", "level": "note", "message": {"text": "Very large file: src/app/performance/page.tsx (2102 lines)"}, "properties": {"repobilityId": "fa2be2e5f5af7ca0", "scanner": "scanner-primary", "fingerprint": "5a27f3ea72fd0582", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d335b924bf76dafe", "level": "note", "message": {"text": "Very large file: src/app/performance/ClimbsSection.tsx (1257 lines)"}, "properties": {"repobilityId": "2cb94da9baa91b8c", "scanner": "scanner-primary", "fingerprint": "d335b924bf76dafe", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-da34d9c03d8312ab", "level": "note", "message": {"text": "Very large file: src/app/session/page.tsx (2179 lines)"}, "properties": {"repobilityId": "8727cbec99227579", "scanner": "scanner-primary", "fingerprint": "da34d9c03d8312ab", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-878073698a4d65a4", "level": "note", "message": {"text": "Very large file: src/app/connections/page.tsx (971 lines)"}, "properties": {"repobilityId": "3a7bfb0907d4358b", "scanner": "scanner-primary", "fingerprint": "878073698a4d65a4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-339a849bd9d0ccd2", "level": "note", "message": {"text": "Very large file: src/app/calendar/page.tsx (1491 lines)"}, "properties": {"repobilityId": "4ad53758fac797c8", "scanner": "scanner-primary", "fingerprint": "339a849bd9d0ccd2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-8a904e45d73a6793", "level": "note", "message": {"text": "Very large file: src/app/briefing/page.tsx (1624 lines)"}, "properties": {"repobilityId": "43dde6f96093ef98", "scanner": "scanner-primary", "fingerprint": "8a904e45d73a6793", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-383e5dcee8b44968", "level": "note", "message": {"text": "Very large file: src/app/activities/page.backup.tsx (2251 lines)"}, "properties": {"repobilityId": "0b478fd9e8a901ab", "scanner": "scanner-primary", "fingerprint": "383e5dcee8b44968", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-5c3b128cfae73f93", "level": "note", "message": {"text": "Very large file: src/app/activities/page.tsx (9744 lines)"}, "properties": {"repobilityId": "cceb2fdc433c498d", "scanner": "scanner-primary", "fingerprint": "5c3b128cfae73f93", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-99a183dd4ba07364", "level": "note", "message": {"text": "Very large file: src/app/nutrition/page.tsx (1616 lines)"}, "properties": {"repobilityId": "4a1e89cd4f4bcd2d", "scanner": "scanner-primary", "fingerprint": "99a183dd4ba07364", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-8dfc105133f27d68", "level": "note", "message": {"text": "Very large file: src/app/planning/page.tsx (4496 lines)"}, "properties": {"repobilityId": "bcef70d3b6f8c706", "scanner": "scanner-primary", "fingerprint": "8dfc105133f27d68", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-46250240a95efdb9", "level": "note", "message": {"text": "Very large file: src/components/planning/SessionEditor.tsx (7181 lines)"}, "properties": {"repobilityId": "0dac30e38b3073b3", "scanner": "scanner-primary", "fingerprint": "46250240a95efdb9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "40183784b5bbdef5", "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": "f4083517e50f44ad", "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": "c807b1f0d30531e0", "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": "27150a2d9ef8d50b", "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": "8c6b9945fe7a3a29", "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": "e83f5a583ae22610", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-17d866d91a7c451e", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: CLAUDE.md"}, "properties": {"repobilityId": "ccce5984e58a48f0", "scanner": "scanner-primary", "fingerprint": "17d866d91a7c451e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "CLAUDE.md"}, "region": {"startLine": 81}}}]}, {"ruleId": "scanner-2c5f98b152cddb6d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/launch.json"}, "properties": {"repobilityId": "0de48c0f4ab303d8", "scanner": "scanner-primary", "fingerprint": "2c5f98b152cddb6d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/launch.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-122f91b7f2906dc4", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/settings.json"}, "properties": {"repobilityId": "a2967269048b6a9d", "scanner": "scanner-primary", "fingerprint": "122f91b7f2906dc4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/settings.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7861e282b99b4cb2", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/ui-ux-pro-max.md"}, "properties": {"repobilityId": "12dc48849fdb0a1c", "scanner": "scanner-primary", "fingerprint": "7861e282b99b4cb2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/ui-ux-pro-max.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9d51d4bb691bee78", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/check-colors.mjs:7"}, "properties": {"repobilityId": "b617e1244c9e560a", "scanner": "scanner-primary", "fingerprint": "9d51d4bb691bee78", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5d1208bad1f33d46", "level": "note", "message": {"text": "Legacy-named symbol `splash_v1` in src/app/ClientShell.tsx:15"}, "properties": {"repobilityId": "15234fd34f94d43d", "scanner": "scanner-primary", "fingerprint": "5d1208bad1f33d46", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-0a92b3fbf1702e74", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/page.tsx:4"}, "properties": {"repobilityId": "c702ed5715658006", "scanner": "scanner-primary", "fingerprint": "0a92b3fbf1702e74", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-aa69d437f71b5ace", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/coach-stream/route.ts:6"}, "properties": {"repobilityId": "1f23eeba5a29c94c", "scanner": "scanner-primary", "fingerprint": "aa69d437f71b5ace", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e7d253486edebca1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/coach-stream/route.ts:237"}, "properties": {"repobilityId": "4f2a709486ae393c", "scanner": "scanner-primary", "fingerprint": "e7d253486edebca1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-90ac6de3a7cf4cc9", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/stripe/checkout/route.ts:1"}, "properties": {"repobilityId": "9da51ddd1a6caf66", "scanner": "scanner-primary", "fingerprint": "90ac6de3a7cf4cc9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d3bd78b9a72092be", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/stripe/portal/route.ts:1"}, "properties": {"repobilityId": "8e315dd288b77d3d", "scanner": "scanner-primary", "fingerprint": "d3bd78b9a72092be", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a65b90d264395393", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/stripe/webhook/route.ts:1"}, "properties": {"repobilityId": "76f861e40f44ced2", "scanner": "scanner-primary", "fingerprint": "a65b90d264395393", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-daed044e30cb0210", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/training-plan/route.ts:236"}, "properties": {"repobilityId": "77e3786565058add", "scanner": "scanner-primary", "fingerprint": "daed044e30cb0210", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4652aa6bc63b44e6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/oauth/callback/route.ts:88"}, "properties": {"repobilityId": "cbd23c33717962d0", "scanner": "scanner-primary", "fingerprint": "4652aa6bc63b44e6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ce3cdec0e012d04e", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/admin/seed-dishes/route.ts:1"}, "properties": {"repobilityId": "edc5c4a2f18a365e", "scanner": "scanner-primary", "fingerprint": "ce3cdec0e012d04e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ecf6462b8ea699d0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/competences-ai/route.ts:48"}, "properties": {"repobilityId": "d90335c5d2e01c40", "scanner": "scanner-primary", "fingerprint": "ecf6462b8ea699d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b64d5507cc529792", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/strava/import-history/route.ts:29"}, "properties": {"repobilityId": "e9bfd14af7780f98", "scanner": "scanner-primary", "fingerprint": "b64d5507cc529792", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3242f94a12d1297c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/strava/activity-laps/route.ts:121"}, "properties": {"repobilityId": "91b9ee20954ff465", "scanner": "scanner-primary", "fingerprint": "3242f94a12d1297c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-311c08a75aa12000", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/strava/webhook-subscribe/route.ts:14"}, "properties": {"repobilityId": "401effc03443451b", "scanner": "scanner-primary", "fingerprint": "311c08a75aa12000", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-50052b20d221eb29", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/strava/upload-activity/route.ts:63"}, "properties": {"repobilityId": "12c4546ef6b5ce7b", "scanner": "scanner-primary", "fingerprint": "50052b20d221eb29", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-28f55f7a9a6c6032", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/strava/webhook/route.ts:135"}, "properties": {"repobilityId": "2cc85133a7052295", "scanner": "scanner-primary", "fingerprint": "28f55f7a9a6c6032", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b1605299cf94c368", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/strava/stats/route.ts:49"}, "properties": {"repobilityId": "6039205c983681dc", "scanner": "scanner-primary", "fingerprint": "b1605299cf94c368", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2616c0e6432f69e1", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/briefing/route.ts:1"}, "properties": {"repobilityId": "4557f0c524512e6e", "scanner": "scanner-primary", "fingerprint": "2616c0e6432f69e1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-960cbf37fc9bd5bc", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/api/briefing/generate/route.ts:1"}, "properties": {"repobilityId": "53c8c1ac395caa3f", "scanner": "scanner-primary", "fingerprint": "960cbf37fc9bd5bc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8f263e79653d30a8", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/app/api/analyze-meal-photo/route.ts:5"}, "properties": {"repobilityId": "bb487cd8501c2517", "scanner": "scanner-primary", "fingerprint": "8f263e79653d30a8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3b1c47e20e6a04b0", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/activities/process-records/route.ts:1"}, "properties": {"repobilityId": "54a99720a5cd37e5", "scanner": "scanner-primary", "fingerprint": "3b1c47e20e6a04b0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0699315e86566db9", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/activities/backfill-records/route.ts:1"}, "properties": {"repobilityId": "2f1c582e8a69a070", "scanner": "scanner-primary", "fingerprint": "0699315e86566db9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8aa7057f4c9e9199", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/coach-engine/route.ts:1"}, "properties": {"repobilityId": "3c40585881b430f2", "scanner": "scanner-primary", "fingerprint": "8aa7057f4c9e9199", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-98200d0d853b1716", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/suggest-next-meal/route.ts:4"}, "properties": {"repobilityId": "271770913581ecd4", "scanner": "scanner-primary", "fingerprint": "98200d0d853b1716", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-eb6762b793d9e35d", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/admin/dishes/page.tsx:2"}, "properties": {"repobilityId": "1fee4dbeaa9e0329", "scanner": "scanner-primary", "fingerprint": "eb6762b793d9e35d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7b2fc40e0d085efb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/marketing/page.tsx:92"}, "properties": {"repobilityId": "af69eb68681e7abb", "scanner": "scanner-primary", "fingerprint": "7b2fc40e0d085efb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cd1873b393934f43", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/performance/DistanceRecords.tsx:2"}, "properties": {"repobilityId": "4c46bf32ff40bb60", "scanner": "scanner-primary", "fingerprint": "cd1873b393934f43", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4486392c8696245d", "level": "note", "message": {"text": "Legacy-named symbol `thw_zones_v1` in src/app/performance/DatasTab.tsx:1185"}, "properties": {"repobilityId": "c8a710268f14434d", "scanner": "scanner-primary", "fingerprint": "4486392c8696245d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-9d32649236c11383", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/performance/DatasTab.tsx:3430"}, "properties": {"repobilityId": "74b7ccaa26aebbe1", "scanner": "scanner-primary", "fingerprint": "9d32649236c11383", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-74888631497bd500", "level": "note", "message": {"text": "Legacy-named symbol `thw_gym_custom_v1` in src/app/performance/gymShared.ts:36"}, "properties": {"repobilityId": "7232c7e2b9e2a57f", "scanner": "scanner-primary", "fingerprint": "74888631497bd500", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-7741f0e8d321562e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/briefing/page.tsx:388"}, "properties": {"repobilityId": "f9ebacddd9316ba9", "scanner": "scanner-primary", "fingerprint": "7741f0e8d321562e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7e6c5678aad82682", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/progression/page.tsx:3"}, "properties": {"repobilityId": "d8a37ec8b9e87948", "scanner": "scanner-primary", "fingerprint": "7e6c5678aad82682", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0c0f28f1a9987c08", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/progression/components/ProgressionSportView.tsx:3"}, "properties": {"repobilityId": "fa3350bc4b7f8af7", "scanner": "scanner-primary", "fingerprint": "0c0f28f1a9987c08", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6b514af914271c4c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/progression/components/ShurikenAnimated.tsx:3"}, "properties": {"repobilityId": "066aff23876b028d", "scanner": "scanner-primary", "fingerprint": "6b514af914271c4c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7a17e9536f63da0b", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/progression/components/GeneralView.tsx:3"}, "properties": {"repobilityId": "6c28e1cc0568aec2", "scanner": "scanner-primary", "fingerprint": "7a17e9536f63da0b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2e673d332fe4e325", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/activities/page.backup.tsx:1317"}, "properties": {"repobilityId": "46886e20069e80a9", "scanner": "scanner-primary", "fingerprint": "2e673d332fe4e325", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-797017556c3af38a", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/activities/page.tsx:1449"}, "properties": {"repobilityId": "4c8e3ca598942305", "scanner": "scanner-primary", "fingerprint": "797017556c3af38a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6515c00c400241b6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/nutrition/page.tsx:1051"}, "properties": {"repobilityId": "a4da3e56fa7530c7", "scanner": "scanner-primary", "fingerprint": "6515c00c400241b6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-911304162e2a09c3", "level": "none", "message": {"text": "Commented-code block (10 lines) in src/app/nutrition/components/DayFoodJournal.tsx:3"}, "properties": {"repobilityId": "e6ff8ab56b2a07d7", "scanner": "scanner-primary", "fingerprint": "911304162e2a09c3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4fe521a5ae308d9c", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/nutrition/components/NutritionRail.tsx:3"}, "properties": {"repobilityId": "ba5ad016da62dbc3", "scanner": "scanner-primary", "fingerprint": "4fe521a5ae308d9c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d9f9ab6ae3ef8179", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/nutrition/components/tabs/FoodSearch.tsx:61"}, "properties": {"repobilityId": "9ff1a827e4e34003", "scanner": "scanner-primary", "fingerprint": "d9f9ab6ae3ef8179", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6c60a1db1265eee3", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/nutrition/components/plan/PlanShoppingList.tsx:3"}, "properties": {"repobilityId": "bdf90f562be5a347", "scanner": "scanner-primary", "fingerprint": "6c60a1db1265eee3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-13dfcd46af955e18", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/nutrition/components/suivi/SuiviSection.tsx:3"}, "properties": {"repobilityId": "34d1327da96100a6", "scanner": "scanner-primary", "fingerprint": "13dfcd46af955e18", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8042e92dca60c006", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/nutrition/components/suivi/suiviData.ts:1"}, "properties": {"repobilityId": "33ddb2ec2529a90d", "scanner": "scanner-primary", "fingerprint": "8042e92dca60c006", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-98a1d8234b60a432", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/nutrition/components/suivi/SuiviCharts.tsx:3"}, "properties": {"repobilityId": "8f4a628ca3d4aa16", "scanner": "scanner-primary", "fingerprint": "98a1d8234b60a432", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9209534bcd31ef71", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/nutrition/components/today/PhotoMealEditor.tsx:2"}, "properties": {"repobilityId": "6818b5b9928c3ca6", "scanner": "scanner-primary", "fingerprint": "9209534bcd31ef71", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-134cdcb481486869", "level": "note", "message": {"text": "Legacy-named symbol `coachIaPos_v2` in src/app/planning/page.tsx:1324"}, "properties": {"repobilityId": "a803451d462d475b", "scanner": "scanner-primary", "fingerprint": "134cdcb481486869", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-0db911ed82d69ded", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/planning/page.tsx:193"}, "properties": {"repobilityId": "a1f4f09d98fc2000", "scanner": "scanner-primary", "fingerprint": "0db911ed82d69ded", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-456ee7565d4f4266", "level": "note", "message": {"text": "Legacy-named symbol `thw_training_blocs_v2` in src/app/planning/trainingBlocks.ts:13"}, "properties": {"repobilityId": "cd2885cdfc1ee68e", "scanner": "scanner-primary", "fingerprint": "456ee7565d4f4266", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-93523d858302b9c7", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/planning/trainingBlocks.ts:28"}, "properties": {"repobilityId": "be713a546ea9f7c9", "scanner": "scanner-primary", "fingerprint": "93523d858302b9c7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ec445d3f2d19a697", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/planning/components/training/TrainingSummary.tsx:3"}, "properties": {"repobilityId": "70a2110ecdcc2e3d", "scanner": "scanner-primary", "fingerprint": "ec445d3f2d19a697", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a3022211696cf49b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useStrava.ts:76"}, "properties": {"repobilityId": "ad63166a46f01396", "scanner": "scanner-primary", "fingerprint": "a3022211696cf49b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e6b21185ec4213c3", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/hooks/useSpeechToText.ts:3"}, "properties": {"repobilityId": "8f02dfede982f241", "scanner": "scanner-primary", "fingerprint": "e6b21185ec4213c3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6be1ef9aa20dfca0", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/dashboard/useDashboardModel.ts:2"}, "properties": {"repobilityId": "bb1a31cd8298876a", "scanner": "scanner-primary", "fingerprint": "6be1ef9aa20dfca0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-46dc8c938667bdb2", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/dashboard/RecentRecords.tsx:2"}, "properties": {"repobilityId": "403846f10dfb6ea5", "scanner": "scanner-primary", "fingerprint": "46dc8c938667bdb2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3dd32cfd92829f3a", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/dashboard/SleepCard.tsx:2"}, "properties": {"repobilityId": "3ff0069c4a20ff72", "scanner": "scanner-primary", "fingerprint": "3dd32cfd92829f3a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5b9fa3f3f0149f7c", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/dashboard/CoachAICard.tsx:2"}, "properties": {"repobilityId": "49883e23c1ec2e5a", "scanner": "scanner-primary", "fingerprint": "5b9fa3f3f0149f7c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b223366d3cfcc330", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/dashboard/useDashboardActivities.ts:2"}, "properties": {"repobilityId": "a300c62bc8852180", "scanner": "scanner-primary", "fingerprint": "b223366d3cfcc330", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b5b95bd84e7a64d9", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/dashboard/DataGrid.tsx:2"}, "properties": {"repobilityId": "d71f4e4fb543ef45", "scanner": "scanner-primary", "fingerprint": "b5b95bd84e7a64d9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3181309008afadb1", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/dashboard/NextSessionsCard.tsx:2"}, "properties": {"repobilityId": "d620775a44e902b5", "scanner": "scanner-primary", "fingerprint": "3181309008afadb1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-92f3cbdf404d2fce", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/dashboard/DashboardContent.tsx:2"}, "properties": {"repobilityId": "2262fd462d6aba18", "scanner": "scanner-primary", "fingerprint": "92f3cbdf404d2fce", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3c0c4e9f6383c615", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/components/dashboard/NutritionCard.tsx:2"}, "properties": {"repobilityId": "e89b40b16980939a", "scanner": "scanner-primary", "fingerprint": "3c0c4e9f6383c615", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-85273b8b5d751f69", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/dashboard/PmcChart.tsx:2"}, "properties": {"repobilityId": "ffe79b3966a3f3ad", "scanner": "scanner-primary", "fingerprint": "85273b8b5d751f69", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0826a91a2a441b1c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/dashboard/TodayCard.tsx:2"}, "properties": {"repobilityId": "048a08c525eea71b", "scanner": "scanner-primary", "fingerprint": "0826a91a2a441b1c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-46f33a45de692cd6", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/dashboard/primitives.tsx:2"}, "properties": {"repobilityId": "bf05c6a6dcda484e", "scanner": "scanner-primary", "fingerprint": "46f33a45de692cd6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-09108f4a67cc84f0", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/dashboard/FormeArc.tsx:2"}, "properties": {"repobilityId": "a4a6594b4e66a6cb", "scanner": "scanner-primary", "fingerprint": "09108f4a67cc84f0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7b14e22b1bb25e05", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/dashboard/WeekSummary.tsx:2"}, "properties": {"repobilityId": "431d60aba7865120", "scanner": "scanner-primary", "fingerprint": "7b14e22b1bb25e05", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-66104625df0aad95", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/components/activity/WorkoutTypeBadges.tsx:3"}, "properties": {"repobilityId": "5dae4896432ede86", "scanner": "scanner-primary", "fingerprint": "66104625df0aad95", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cbd696c685cda8d1", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/activity/MuscuActivityView.tsx:3"}, "properties": {"repobilityId": "721a42d925ccc0e7", "scanner": "scanner-primary", "fingerprint": "cbd696c685cda8d1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fac9a1ab6b89a78e", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/activity/ActivityMapCard.tsx:98"}, "properties": {"repobilityId": "64045100d74b8a6e", "scanner": "scanner-primary", "fingerprint": "fac9a1ab6b89a78e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bb28cc92cb83114f", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/components/activity/ClimbDescentSection.tsx:3"}, "properties": {"repobilityId": "1be330eb8093d668", "scanner": "scanner-primary", "fingerprint": "bb28cc92cb83114f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-263958dd1b54dd4c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/activity/ActivityCard.tsx:3"}, "properties": {"repobilityId": "830d275d4379653a", "scanner": "scanner-primary", "fingerprint": "263958dd1b54dd4c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7c4afeab1c4c2f3c", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/components/activity/RunningLapsSection.tsx:3"}, "properties": {"repobilityId": "89e9a3ce9e40526e", "scanner": "scanner-primary", "fingerprint": "7c4afeab1c4c2f3c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-54dd25c695f1a068", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/components/activity/LapsRunChart.tsx:3"}, "properties": {"repobilityId": "b79c71d1bd2fb2bd", "scanner": "scanner-primary", "fingerprint": "54dd25c695f1a068", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3e732ea07e07558c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/shared/Sidebar.tsx:36"}, "properties": {"repobilityId": "1c9d7b25d716a0b1", "scanner": "scanner-primary", "fingerprint": "3e732ea07e07558c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0f72421a6ec180a7", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/navigation/SectionLayout.tsx:3"}, "properties": {"repobilityId": "05d39871b5fa8ed8", "scanner": "scanner-primary", "fingerprint": "0f72421a6ec180a7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ffad57052951145a", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/nutrition/DishPickerSheet.tsx:2"}, "properties": {"repobilityId": "21ec5cecc2ed34fc", "scanner": "scanner-primary", "fingerprint": "ffad57052951145a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1d575463b1b93fda", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/recovery/RecoveryTrendChart.tsx:3"}, "properties": {"repobilityId": "3ff99d14dcd3baf2", "scanner": "scanner-primary", "fingerprint": "1d575463b1b93fda", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-12ed55e7dd60a53a", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/recovery/overviewData.ts:1"}, "properties": {"repobilityId": "6b6d7a45eba7d269", "scanner": "scanner-primary", "fingerprint": "12ed55e7dd60a53a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c2821c95ca7081cb", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/ai/PlanProposalCard.tsx:6"}, "properties": {"repobilityId": "2734f8243c0ef86d", "scanner": "scanner-primary", "fingerprint": "c2821c95ca7081cb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9a27e4ca4ccfe237", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/ai/GlobalAIButton.tsx:3"}, "properties": {"repobilityId": "6a3c0110995ed537", "scanner": "scanner-primary", "fingerprint": "9a27e4ca4ccfe237", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f49a7c71b0530f8b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/ai/HybridNetworksPanel.tsx:307"}, "properties": {"repobilityId": "d5e06abb3f4a88e7", "scanner": "scanner-primary", "fingerprint": "f49a7c71b0530f8b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a6570194c6b89bd5", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/components/ai/MethodPicker.tsx:3"}, "properties": {"repobilityId": "b3f345c3b86349a1", "scanner": "scanner-primary", "fingerprint": "a6570194c6b89bd5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5b1255753f6c552e", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/ai/CoachQuestionCard.tsx:3"}, "properties": {"repobilityId": "d0ab765572c8ec73", "scanner": "scanner-primary", "fingerprint": "5b1255753f6c552e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b2add793c06e77cd", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/ai/MobileSheet.tsx:6"}, "properties": {"repobilityId": "25c1d47428dc911e", "scanner": "scanner-primary", "fingerprint": "b2add793c06e77cd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-34cee7abca0b7b4c", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/components/ai/VoiceOverlay.tsx:6"}, "properties": {"repobilityId": "e56a4ea666ad3a36", "scanner": "scanner-primary", "fingerprint": "34cee7abca0b7b4c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4f340f22b3c79778", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/planning/FriseV1.tsx:2"}, "properties": {"repobilityId": "563d378c155cd2f7", "scanner": "scanner-primary", "fingerprint": "4f340f22b3c79778", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4c8304fcfbdec8a4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/planning/SessionEditor.tsx:4516"}, "properties": {"repobilityId": "9596dd4a5f3d16b7", "scanner": "scanner-primary", "fingerprint": "4c8304fcfbdec8a4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d2e64354cdacf291", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/ui/TabbedPageLayout.tsx:2"}, "properties": {"repobilityId": "631999bd3e9095ad", "scanner": "scanner-primary", "fingerprint": "d2e64354cdacf291", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-99b78137e2490bae", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/ui/MacroDonut.tsx:6"}, "properties": {"repobilityId": "f89b2b83a74d6673", "scanner": "scanner-primary", "fingerprint": "99b78137e2490bae", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fae90886421e59c4", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/dish-catalogue.ts:1"}, "properties": {"repobilityId": "6d8d2200cd08918d", "scanner": "scanner-primary", "fingerprint": "fae90886421e59c4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3d5053edd7122a84", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/openrouteservice.ts:47"}, "properties": {"repobilityId": "d1296f0f19409fa6", "scanner": "scanner-primary", "fingerprint": "3d5053edd7122a84", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-93a62b8cfe955628", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/polar.ts:38"}, "properties": {"repobilityId": "638689c6e04881d5", "scanner": "scanner-primary", "fingerprint": "93a62b8cfe955628", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-887c2d6da2e8c983", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/agents/performanceAgents.ts:50"}, "properties": {"repobilityId": "ed1f7f249c04a1da", "scanner": "scanner-primary", "fingerprint": "887c2d6da2e8c983", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c3e5ace1d4ad4ca5", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/agents/base.ts:1"}, "properties": {"repobilityId": "36ca5025424e8a6c", "scanner": "scanner-primary", "fingerprint": "c3e5ace1d4ad4ca5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2bd6a7f4e6a4417d", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/lib/training/pmc.ts:1"}, "properties": {"repobilityId": "ad1fd1f6b0c7c413", "scanner": "scanner-primary", "fingerprint": "2bd6a7f4e6a4417d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f26f7e337c8b7204", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/gear/stats.ts:1"}, "properties": {"repobilityId": "d547ff1b166e4f4b", "scanner": "scanner-primary", "fingerprint": "f26f7e337c8b7204", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f5158198393a69f0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sync/wahoo.ts:26"}, "properties": {"repobilityId": "9743707ec729a332", "scanner": "scanner-primary", "fingerprint": "f5158198393a69f0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-38fbe9469efa01c0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sync/withings.ts:17"}, "properties": {"repobilityId": "72ab73b32957c13a", "scanner": "scanner-primary", "fingerprint": "38fbe9469efa01c0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-53aff86e8cb95547", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sync/strava.ts:69"}, "properties": {"repobilityId": "7f5ece9a08657123", "scanner": "scanner-primary", "fingerprint": "53aff86e8cb95547", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7f4b09696d0f28d3", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/utils/vap.ts:1"}, "properties": {"repobilityId": "ec675507e7a007ed", "scanner": "scanner-primary", "fingerprint": "7f4b09696d0f28d3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0e5f85140625ef7f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/utils/pace.ts:1"}, "properties": {"repobilityId": "66c493d1d2d62ee7", "scanner": "scanner-primary", "fingerprint": "0e5f85140625ef7f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e1b8a5d9a57ddb6c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/tokens/limits.ts:1"}, "properties": {"repobilityId": "5f6aa9b36ff94433", "scanner": "scanner-primary", "fingerprint": "e1b8a5d9a57ddb6c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-59ba8dfa0b49d2ea", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/oauth/tokens.ts:108"}, "properties": {"repobilityId": "268f5f74d15a24fc", "scanner": "scanner-primary", "fingerprint": "59ba8dfa0b49d2ea", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2221144135a426ee", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/health/sleep.ts:1"}, "properties": {"repobilityId": "5059a57190723e77", "scanner": "scanner-primary", "fingerprint": "2221144135a426ee", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d818d7ee849dafb5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/marketing/insta-api.ts:92"}, "properties": {"repobilityId": "a3a747630a37bc60", "scanner": "scanner-primary", "fingerprint": "d818d7ee849dafb5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-32ff2089fd95cff6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/strava/activities.ts:50"}, "properties": {"repobilityId": "5d1700f8856eed56", "scanner": "scanner-primary", "fingerprint": "32ff2089fd95cff6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-82a1275ca15bc98d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/strava/tokens.ts:35"}, "properties": {"repobilityId": "1b98e75c6165d805", "scanner": "scanner-primary", "fingerprint": "82a1275ca15bc98d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9c8c468426c8ab30", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/strava/streams.ts:68"}, "properties": {"repobilityId": "9da2fe1b7527b97f", "scanner": "scanner-primary", "fingerprint": "9c8c468426c8ab30", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-854a8197423bda67", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/quick-actions/models.ts:1"}, "properties": {"repobilityId": "34bc8f29e9ccf7f2", "scanner": "scanner-primary", "fingerprint": "854a8197423bda67", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2486165b6d11c0f5", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/progression/helpers.ts:1"}, "properties": {"repobilityId": "84600d96514cd45c", "scanner": "scanner-primary", "fingerprint": "2486165b6d11c0f5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d550e4a032c463b2", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/progression/sportConfig.ts:1"}, "properties": {"repobilityId": "7eb93f3f243d1433", "scanner": "scanner-primary", "fingerprint": "d550e4a032c463b2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-753fce3d1f468922", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/records/processBikeActivity.ts:1"}, "properties": {"repobilityId": "9a730fc1c42b3b48", "scanner": "scanner-primary", "fingerprint": "753fce3d1f468922", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1e71532a387c8e69", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/coach-engine/mapping.ts:1"}, "properties": {"repobilityId": "dcb6b25b9455a55f", "scanner": "scanner-primary", "fingerprint": "1e71532a387c8e69", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6abe97c26efee1f0", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/coach-engine/client.ts:1"}, "properties": {"repobilityId": "a94591c10d3deb69", "scanner": "scanner-primary", "fingerprint": "6abe97c26efee1f0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-42a1fdea822ec5ce", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/ai/competences.ts:1"}, "properties": {"repobilityId": "f65a155cc80e78cf", "scanner": "scanner-primary", "fingerprint": "42a1fdea822ec5ce", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e53c24215fd4cf9d", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/coach/tools-definition.ts:8"}, "properties": {"repobilityId": "46eb5f5afa5c31aa", "scanner": "scanner-primary", "fingerprint": "e53c24215fd4cf9d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ba613a95d1b481ef", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/coach/doctrine/registry.ts:4"}, "properties": {"repobilityId": "5757af42a650fec1", "scanner": "scanner-primary", "fingerprint": "ba613a95d1b481ef", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a4e3a1ff9dbd9e35", "level": "none", "message": {"text": "Commented-code block (10 lines) in docs/CHART_EXAMPLES.tsx:9"}, "properties": {"repobilityId": "640d130472953e8f", "scanner": "scanner-primary", "fingerprint": "a4e3a1ff9dbd9e35", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}]}]}