{"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-891fac1fbed43721", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-skelleftea-hockey-demo.ts:773", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-skelleftea-hockey-demo.ts:773"}, "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-bf6594422cbcbe45", "name": "Stray `console.log` in TS/JS \u2014 scripts/prepare-ai-billing-smoke.ts:168", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/prepare-ai-billing-smoke.ts:168"}, "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-5f8002352a6dee21", "name": "Stray `console.log` in TS/JS \u2014 scripts/migrate-solo-pros-to-personal-business.ts:46", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate-solo-pros-to-personal-business.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-6484e0b92196736b", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-program-generation.ts:117", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-program-generation.ts:117"}, "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-8fd3dff2100fe485", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-briefing.ts:157", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-briefing.ts:157"}, "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-cd9b807bed4da78d", "name": "Stray `console.log` in TS/JS \u2014 scripts/embed-training-docs.ts:93", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/embed-training-docs.ts:93"}, "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-ca1d75903777b8d5", "name": "Stray `console.log` in TS/JS \u2014 scripts/verify-percent-resolution.ts:23", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/verify-percent-resolution.ts:23"}, "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-88b3feb138fb02f9", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-knowledge-base.ts:77", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-knowledge-base.ts:77"}, "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-51fb9189d93f7944", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-milestone-detection.ts:33", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-milestone-detection.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-5a59efc93223e4f7", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-pattern-detection.ts:273", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-pattern-detection.ts:273"}, "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-8b1cc940ef98fde6", "name": "Stray `console.log` in TS/JS \u2014 scripts/check-exercise-images.ts:25", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-exercise-images.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-2cc8fad89a2083c2", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-ai-models.ts:152", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-ai-models.ts:152"}, "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-6c5dc8e891ef166a", "name": "Stray `console.log` in TS/JS \u2014 scripts/diagnose-program.ts:5", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diagnose-program.ts:5"}, "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-d75ad9407a6cdc5d", "name": "Stray `console.log` in TS/JS \u2014 scripts/check-data.ts:5", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-data.ts:5"}, "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-78d628c246cb3605", "name": "Stray `console.log` in TS/JS \u2014 scripts/setup-star-by-th.ts:91", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/setup-star-by-th.ts:91"}, "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-6c002a633f377ee9", "name": "Stray `console.log` in TS/JS \u2014 scripts/plan-exercise-image-rollout.ts:306", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/plan-exercise-image-rollout.ts:306"}, "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-85929085c8ec37a8", "name": "Stray `console.log` in TS/JS \u2014 scripts/update-emails.ts:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/update-emails.ts:13"}, "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-2c1cf84b34272f08", "name": "Stray `console.log` in TS/JS \u2014 scripts/backfill-segment-duration.ts:128", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-segment-duration.ts:128"}, "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-cac46d27c3a1b420", "name": "Stray `console.log` in TS/JS \u2014 scripts/check-latest-program.ts:5", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-latest-program.ts:5"}, "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-101dc925bea099f5", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-exercises-fast.ts:37", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-exercises-fast.ts:37"}, "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-842d934d2e948b00", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-post-workout-checkin.ts:81", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-post-workout-checkin.ts:81"}, "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-cef52378beafe8bb", "name": "Stray `console.log` in TS/JS \u2014 scripts/cleanup-orphan-workout-calendar-events.ts:34", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/cleanup-orphan-workout-calendar-events.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-f0a53c2968b79f2e", "name": "Stray `console.log` in TS/JS \u2014 scripts/cleanup-strength-studio-exercises.ts:201", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/cleanup-strength-studio-exercises.ts:201"}, "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-70be3cfd4d910cf9", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-e2e-program-generation.ts:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-e2e-program-generation.ts:13"}, "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-38377d06db3f10f5", "name": "Stray `console.log` in TS/JS \u2014 scripts/update-burpee-sequence.ts:24", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/update-burpee-sequence.ts:24"}, "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-14c386cb38caf3b5", "name": "Stray `console.log` in TS/JS \u2014 scripts/audit-solo-pros.ts:51", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/audit-solo-pros.ts:51"}, "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-e8e96b5ca6c60d7e", "name": "Stray `console.log` in TS/JS \u2014 scripts/verify-team-chat.ts:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/verify-team-chat.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-dbea3bff76592b55", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-hockey-movement-library.ts:622", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-hockey-movement-library.ts:622"}, "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-11b9e06fd30aacb9", "name": "Stray `console.log` in TS/JS \u2014 scripts/pilot-openai-exercise-images.ts:178", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/pilot-openai-exercise-images.ts:178"}, "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-569bae1c974fc4f0", "name": "Stray `console.log` in TS/JS \u2014 scripts/check-testers.ts:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-testers.ts:10"}, "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-b8dc8df71e897f48", "name": "Stray `console.log` in TS/JS \u2014 scripts/import-google-billing.ts:25", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/import-google-billing.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-189e86d2fa5f9a8b", "name": "Stray `console.log` in TS/JS \u2014 scripts/audit-legacy-routes.ts:163", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/audit-legacy-routes.ts:163"}, "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-ca95e5fb40310300", "name": "Stray `console.log` in TS/JS \u2014 scripts/backfill-training-load.ts:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-training-load.ts:12"}, "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-9d322d51436b72fa", "name": "Stray `console.log` in TS/JS \u2014 scripts/qa-hockey-cockpit.ts:199", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/qa-hockey-cockpit.ts:199"}, "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-84b9ae61cd6e7f43", "name": "Stray `console.log` in TS/JS \u2014 scripts/simple-test.ts:2", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/simple-test.ts:2"}, "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-a1ce24477299eee5", "name": "Stray `console.log` in TS/JS \u2014 scripts/pilot-openai-exercise-images-v2.ts:193", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/pilot-openai-exercise-images-v2.ts:193"}, "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-c74f99c186b87980", "name": "Stray `console.log` in TS/JS \u2014 scripts/cleanup-skelleftea-ateam-mock-tests.ts:111", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/cleanup-skelleftea-ateam-mock-tests.ts:111"}, "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-46abc2e2ceb286ab", "name": "Stray `console.log` in TS/JS \u2014 scripts/debug-upcoming.ts:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/debug-upcoming.ts:8"}, "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-aa4786d18d458a77", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-coach-alerts.ts:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-coach-alerts.ts:16"}, "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-47ae0a338a13b7dc", "name": "Stray `console.log` in TS/JS \u2014 scripts/create-athlete-for-client.ts:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/create-athlete-for-client.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-c7322451b18e02b8", "name": "Stray `console.log` in TS/JS \u2014 scripts/build-exercise-image-frame-prompts.ts:1229", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/build-exercise-image-frame-prompts.ts:1229"}, "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-1d906e7fb34a98b6", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-multi-sport-generator.ts:485", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-multi-sport-generator.ts:485"}, "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-393aac0e23a31a5c", "name": "Stray `console.log` in TS/JS \u2014 scripts/repair-star-auth-links-safe.ts:537", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/repair-star-auth-links-safe.ts:537"}, "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-686262519e9ab9a0", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-comprehensive-program-generation.ts:63", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-comprehensive-program-generation.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-775f5bb499130f8a", "name": "Stray `console.log` in TS/JS \u2014 scripts/setup-skelleftea-pilot.ts:148", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/setup-skelleftea-pilot.ts:148"}, "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-e77d2c097630931f", "name": "Stray `console.log` in TS/JS \u2014 scripts/upload-exercise-images.ts:315", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/upload-exercise-images.ts:315"}, "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-239b733e5a8e0f59", "name": "Stray `console.log` in TS/JS \u2014 scripts/enable-business-feature.ts:38", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/enable-business-feature.ts:38"}, "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-5780a27b51f52ff9", "name": "Stray `console.log` in TS/JS \u2014 scripts/add-all-members.ts:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/add-all-members.ts:13"}, "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-d8fabd8965d5fd8b", "name": "Stray `console.log` in TS/JS \u2014 scripts/qa-ai-billing.ts:234", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/qa-ai-billing.ts:234"}, "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-310214ac83a61b4b", "name": "Stray `console.log` in TS/JS \u2014 scripts/audit-orphan-tokens.ts:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/audit-orphan-tokens.ts:22"}, "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-ad709a48fb607171", "name": "Stray `console.log` in TS/JS \u2014 scripts/generate-barbell-sequences.ts:113", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generate-barbell-sequences.ts:113"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-897eb8c3eb300be0", "name": "Stray `console.log` in TS/JS \u2014 scripts/create-mock-briefing.ts:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/create-mock-briefing.ts:9"}, "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-04d51d0bb48b8361", "name": "Stray `console.log` in TS/JS \u2014 scripts/check-exercises.ts:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-exercises.ts:8"}, "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-deb38d150a340f02", "name": "Stray `console.log` in TS/JS \u2014 scripts/cleanup-duplicate-clients.ts:17", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/cleanup-duplicate-clients.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-1b94846d551a589f", "name": "Stray `console.log` in TS/JS \u2014 scripts/setup-star-thomson-correct.ts:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/setup-star-thomson-correct.ts:13"}, "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-f86fb3596b22b39b", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-hockey-knowledge-skill.ts:145", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-hockey-knowledge-skill.ts:145"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bc771c4959a60128", "name": "Stray `console.log` in TS/JS \u2014 scripts/backfill-assignment-progression.ts:38", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-assignment-progression.ts:38"}, "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-071d1bb50be97f52", "name": "Stray `console.log` in TS/JS \u2014 scripts/sync-user-ids-with-supabase.ts:57", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/sync-user-ids-with-supabase.ts:57"}, "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-4ffad5f09d45ce1d", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-star-thomson.ts:6", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-star-thomson.ts:6"}, "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-e8f0e772770cee5f", "name": "Stray `console.log` in TS/JS \u2014 scripts/create-athlete-account.ts:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/create-athlete-account.ts:10"}, "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-121e8fa2187e0399", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-zone-calculations.ts:7", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-zone-calculations.ts:7"}, "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-6db42a66b29ea905", "name": "Stray `console.log` in TS/JS \u2014 scripts/share-exercises-across-businesses.ts:24", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/share-exercises-across-businesses.ts:24"}, "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-c283308870e188f7", "name": "Stray `console.log` in TS/JS \u2014 scripts/validate-calculations.ts:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/validate-calculations.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-37fcba8b62694f72", "name": "Stray `console.log` in TS/JS \u2014 scripts/audit-athlete-integrity.ts:67", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/audit-athlete-integrity.ts:67"}, "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-9c723b5ecc6eb829", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-performance-analysis.ts:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-performance-analysis.ts:12"}, "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-cd1331c9ae1c9aa6", "name": "Stray `console.log` in TS/JS \u2014 scripts/migrate-embeddings-v2.ts:78", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate-embeddings-v2.ts:78"}, "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-f4023f466c04ba5e", "name": "Stray `console.log` in TS/JS \u2014 scripts/import-livsmedelsverket.ts:122", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/import-livsmedelsverket.ts:122"}, "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-d2a1c4d7b8a77cd0", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-training-engine.ts:15", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-training-engine.ts:15"}, "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-18700e3d02a77ddd", "name": "Stray `console.log` in TS/JS \u2014 scripts/sync-exercise-images.ts:396", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/sync-exercise-images.ts:396"}, "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-97bf8042f2a11d1f", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-preworkout-nudge.ts:104", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-preworkout-nudge.ts:104"}, "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-e78b3f4a16389f67", "name": "Stray `console.log` in TS/JS \u2014 scripts/audit-rls-coverage.ts:170", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/audit-rls-coverage.ts:170"}, "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-91ea20c2221ad1c1", "name": "Stray `console.log` in TS/JS \u2014 scripts/qa-launch-config.ts:111", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/qa-launch-config.ts:111"}, "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-4bc731c173d224e2", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-platform-help.ts:314", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-platform-help.ts:314"}, "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-b300c5df61770701", "name": "Stray `console.log` in TS/JS \u2014 scripts/configure-hockey-beta.ts:65", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/configure-hockey-beta.ts:65"}, "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-2900e8adc985d771", "name": "Stray `console.log` in TS/JS \u2014 scripts/fix-star-thomson-auth.ts:66", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/fix-star-thomson-auth.ts:66"}, "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-11e176757cabdb06", "name": "Stray `console.log` in TS/JS \u2014 scripts/archive/test-cycling.js:91", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/archive/test-cycling.js:91"}, "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-30930ff20e69e9b5", "name": "Stray `console.log` in TS/JS \u2014 scripts/dev/get-bearer-token.ts:65", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/dev/get-bearer-token.ts:65"}, "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-8b3a83b00e2a06d3", "name": "Stray `console.log` in TS/JS \u2014 prisma/seed-ergometer-benchmarks.ts:649", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed-ergometer-benchmarks.ts:649"}, "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-8b0a08e2835da7d2", "name": "Stray `console.log` in TS/JS \u2014 prisma/seed-exercises.ts:1998", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed-exercises.ts:1998"}, "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-582f635447c2a7cf", "name": "Stray `console.log` in TS/JS \u2014 prisma/seed-equipment.ts:507", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed-equipment.ts:507"}, "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-4b7fed8a6e2c4f74", "name": "Stray `console.log` in TS/JS \u2014 prisma/seed-rehab-exercises.ts:1072", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed-rehab-exercises.ts:1072"}, "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-4bca291ac92644b8", "name": "Stray `console.log` in TS/JS \u2014 prisma/seed-hybrid-movements.ts:1989", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed-hybrid-movements.ts:1989"}, "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-e0bbd182f3d05907", "name": "Stray `console.log` in TS/JS \u2014 prisma/seed-workout-templates.ts:1493", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed-workout-templates.ts:1493"}, "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-c50c834bf793edbb", "name": "Stray `console.log` in TS/JS \u2014 prisma/seed-unified-exercises.ts:1380", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed-unified-exercises.ts:1380"}, "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-ebd1013369f24cb6", "name": "Stray `console.log` in TS/JS \u2014 prisma/check-exercises.ts:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 prisma/check-exercises.ts:10"}, "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-734634950805bac3", "name": "Stray `console.log` in TS/JS \u2014 prisma/seed-cardio-templates.ts:574", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed-cardio-templates.ts:574"}, "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-3103f7ef0f6ef1da", "name": "Stray `console.log` in TS/JS \u2014 prisma/check-hybrid.ts:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 prisma/check-hybrid.ts:9"}, "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-784ba531e3ad2732", "name": "Stray `console.log` in TS/JS \u2014 prisma/seed-pricing.ts:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed-pricing.ts:12"}, "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-464088f76b35fbcc", "name": "Stray `console.log` in TS/JS \u2014 prisma/seed-benchmark-workouts.ts:446", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed-benchmark-workouts.ts:446"}, "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-f397036962b7b7bc", "name": "Stray `console.log` in TS/JS \u2014 prisma/seed-agility-drills.ts:1777", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed-agility-drills.ts:1777"}, "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-68badcf7a86e3ee6", "name": "`truncate` class without `title=` for hover reveal \u2014 components/ai-canvas/AICanvasClient.tsx:1270", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ai-canvas/AICanvasClient.tsx:1270"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c83cd1e380f05a46", "name": "`truncate` class without `title=` for hover reveal \u2014 components/ai-canvas/CanvasBlockView.tsx:319", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ai-canvas/CanvasBlockView.tsx:319"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-af3d897c5a5edfbf", "name": "`truncate` class without `title=` for hover reveal \u2014 components/client/ClientDetailTabs.tsx:90", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/client/ClientDetailTabs.tsx:90"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1d2bc3f18692ad57", "name": "`truncate` class without `title=` for hover reveal \u2014 components/ai/AISkillPicker.tsx:340", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ai/AISkillPicker.tsx:340"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7d94d829d5d06c83", "name": "\"active\" state uses light bg in a dark theme \u2014 components/navigation/MobileNav.tsx:411", "shortDescription": {"text": "\"active\" state uses light bg in a dark theme \u2014 components/navigation/MobileNav.tsx:411"}, "fullDescription": {"text": "A ternary like `active ? 'bg-white' : '...'` (or bg-gray-100/200) on a dark theme produces jarring white pills. Use a dark-emphasized active state instead \u2014 border + ring or slightly brighter dark bg. Example: `active ? 'bg-gray-800 border-gray-500 ring-1 ring-blue-500/30' : '\u2026'`.\n\nWhy: P-E in CHECKLIST.md \u2014 light bg in a dark theme is a class of regression.\nRule id: fq.active-light-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8c55517bfd12dc55", "name": "`truncate` class without `title=` for hover reveal \u2014 components/navigation/UserNav.tsx:80", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/navigation/UserNav.tsx:80"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c0da60652c5d065f", "name": "`truncate` class without `title=` for hover reveal \u2014 components/athlete-plans/AthletePlanSummaryCard.tsx:157", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete-plans/AthletePlanSummaryCard.tsx:157"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9dbed9c835f9c66b", "name": "`truncate` class without `title=` for hover reveal \u2014 components/ai-studio/FloatingAIChat.tsx:1817", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ai-studio/FloatingAIChat.tsx:1817"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e494a4ed3ab437ad", "name": "`truncate` class without `title=` for hover reveal \u2014 components/ai-studio/ChatActionCard.tsx:162", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ai-studio/ChatActionCard.tsx:162"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ce620fa765cc7704", "name": "`truncate` class without `title=` for hover reveal \u2014 components/ai-studio/ChatHistoryPanel.tsx:250", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ai-studio/ChatHistoryPanel.tsx:250"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-729b5c655f1d2c78", "name": "`truncate` class without `title=` for hover reveal \u2014 components/ai-studio/ContextPanel.tsx:852", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ai-studio/ContextPanel.tsx:852"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b52cca50a9c6aabf", "name": "`truncate` class without `title=` for hover reveal \u2014 components/ai-studio/ModelSelector.tsx:208", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ai-studio/ModelSelector.tsx:208"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fd1045cd51c65157", "name": "`truncate` class without `title=` for hover reveal \u2014 components/ai-studio/ChatNavigationCard.tsx:53", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ai-studio/ChatNavigationCard.tsx:53"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5b722575a05b0c4f", "name": "`truncate` class without `title=` for hover reveal \u2014 components/ai-studio/EnhancedProgramPreview.tsx:861", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ai-studio/EnhancedProgramPreview.tsx:861"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-967cd5c9f37a8a48", "name": "`truncate` class without `title=` for hover reveal \u2014 components/ai-studio/ExercisePicker.tsx:220", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ai-studio/ExercisePicker.tsx:220"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d3e0482c8266a761", "name": "`truncate` class without `title=` for hover reveal \u2014 components/ai-studio/AIStudioClient.tsx:1184", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ai-studio/AIStudioClient.tsx:1184"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6ac7e72edeab30fc", "name": "`truncate` class without `title=` for hover reveal \u2014 components/mva/MVAAnalysisClient.tsx:883", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/mva/MVAAnalysisClient.tsx:883"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a5af11e22a707241", "name": "`truncate` class without `title=` for hover reveal \u2014 components/mva/VariableSelector.tsx:348", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/mva/VariableSelector.tsx:348"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ee89cb834272d1bc", "name": "`truncate` class without `title=` for hover reveal \u2014 components/admin/ApplicationReviewPanel.tsx:173", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/admin/ApplicationReviewPanel.tsx:173"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fa1b764bb8d5a633", "name": "`truncate` class without `title=` for hover reveal \u2014 components/admin/monitoring/MetricsCharts.tsx:163", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/admin/monitoring/MetricsCharts.tsx:163"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ec9a838c17b54067", "name": "`truncate` class without `title=` for hover reveal \u2014 components/admin/monitoring/LiveErrorStream.tsx:136", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/admin/monitoring/LiveErrorStream.tsx:136"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d1f3defdde94e938", "name": "`truncate` class without `title=` for hover reveal \u2014 components/admin/data-health/AthleteIntegrityHealthPanel.tsx:260", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/admin/data-health/AthleteIntegrityHealthPanel.tsx:260"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fc760ad69b46502c", "name": "`truncate` class without `title=` for hover reveal \u2014 components/admin/operator-agents/WeeklyReportsPanel.tsx:208", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/admin/operator-agents/WeeklyReportsPanel.tsx:208"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-385b4405a27830bb", "name": "`truncate` class without `title=` for hover reveal \u2014 components/admin/businesses/AIActionHistoryPanel.tsx:323", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/admin/businesses/AIActionHistoryPanel.tsx:323"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c840fec8c5d7b9cb", "name": "`truncate` class without `title=` for hover reveal \u2014 components/admin/businesses/BusinessesTable.tsx:225", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/admin/businesses/BusinessesTable.tsx:225"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-85739f919181433d", "name": "`truncate` class without `title=` for hover reveal \u2014 components/programs/BundleAssignmentsDialog.tsx:226", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/programs/BundleAssignmentsDialog.tsx:226"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b39e8fdc88cd8b69", "name": "`truncate` class without `title=` for hover reveal \u2014 components/programs/ProgramFuelingOverview.tsx:271", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/programs/ProgramFuelingOverview.tsx:271"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8cdc2e8beedb9285", "name": "`truncate` class without `title=` for hover reveal \u2014 components/programs/import/ExerciseAliasesClient.tsx:155", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/programs/import/ExerciseAliasesClient.tsx:155"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c594f85d64ebfb78", "name": "`truncate` class without `title=` for hover reveal \u2014 components/programs/import/ImportProgramClient.tsx:556", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/programs/import/ImportProgramClient.tsx:556"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-19b3b4d453fbd64c", "name": "`truncate` class without `title=` for hover reveal \u2014 components/programs/wizard/configuration-form/ProgramAudienceSelect", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/programs/wizard/configuration-form/ProgramAudienceSelector.tsx:211"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-910bb9700fc77247", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/PendingCoachRequests.tsx:155", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/PendingCoachRequests.tsx:155"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ebf215554badcec6", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/BusinessAthleteBrowser.tsx:146", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/BusinessAthleteBrowser.tsx:146"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-35d0220f97efd82d", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/AthleteAttentionCard.tsx:366", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/AthleteAttentionCard.tsx:366"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a737cebeb4333b4b", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/OrgSwitcher.tsx:94", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/OrgSwitcher.tsx:94"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-630e89207da9c9d5", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/competitions/CompetitionManager.tsx:362", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/competitions/CompetitionManager.tsx:362"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d465de2d9a759f0c", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/referrals/ReferralDashboardClient.tsx:407", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/referrals/ReferralDashboardClient.tsx:407"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4d67387faf6483ad", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/cardio/CardioSessionLibrary.tsx:367", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/cardio/CardioSessionLibrary.tsx:367"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-541bb73dad834190", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/cardio/CardioTemplateLibrary.tsx:426", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/cardio/CardioTemplateLibrary.tsx:426"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-38f6e68a03ab53fb", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/cardio/AutoCardioDialog.tsx:526", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/cardio/AutoCardioDialog.tsx:526"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bea1dc5edcf76b88", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/cardio/CardioSessionAssignmentDialog.tsx:554", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/cardio/CardioSessionAssignmentDialog.tsx:554"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2dfffe617025137b", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/exercise-library/ExerciseLibraryBrowser.tsx:407", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/exercise-library/ExerciseLibraryBrowser.tsx:407"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f8d264dfce7687f9", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/TeamCoachActionDialog.tsx:214", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/TeamCoachActionDialog.tsx:214"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-df11534e6143db2e", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/GymClientListCard.tsx:118", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/GymClientListCard.tsx:118"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-95e541aaa96faa7c", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/PTDashboardLayout.tsx:115", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/PTDashboardLayout.tsx:115"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7ac51e4121c05c3c", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/DashboardStatCards.tsx:93", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/DashboardStatCards.tsx:93"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a5e7e4f79a9dd4af", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/CoachCommandCenter.tsx:173", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/CoachCommandCenter.tsx:173"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-335c9937c0b4f2be", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/SocialMediaCard.tsx:246", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/SocialMediaCard.tsx:246"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-87d01193e298d3c4", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/GymClientCard.tsx:122", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/GymClientCard.tsx:122"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8955afe03eb2cdc2", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/TodaysAppointmentsCard.tsx:205", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/TodaysAppointmentsCard.tsx:205"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-30e7797bc8f4fc56", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/ClientStatusCard.tsx:170", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/ClientStatusCard.tsx:170"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a63964c23e251dcf", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/CompetitionCard.tsx:160", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/CompetitionCard.tsx:160"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cf16038b7a2aa451", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/TeamQuickAccess.tsx:85", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/TeamQuickAccess.tsx:85"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3b35d5c37059b057", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/GymClassesCard.tsx:149", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/GymClassesCard.tsx:149"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1b85d6202251c6d3", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/TeamPulsePanel.tsx:113", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/TeamPulsePanel.tsx:113"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fd4df6fc34bdea45", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/AthleteDetailSheet.tsx:769", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/AthleteDetailSheet.tsx:769"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-641dff9727c72bff", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/TeamTestsAndActivity.tsx:73", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/TeamTestsAndActivity.tsx:73"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b089b2a40a1471c4", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/TeamRosterGrid.tsx:258", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/TeamRosterGrid.tsx:258"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-677d7d9eea4331a3", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/team/WorkoutPickerField.tsx:234", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/team/WorkoutPickerField.tsx:234"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-105e97395dec02a1", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/athlete-profile/AssessmentTimeline.tsx:201", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/athlete-profile/AssessmentTimeline.tsx:201"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e84d0bda639e2d3a", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/athlete-profile/DevelopmentTab.tsx:198", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/athlete-profile/DevelopmentTab.tsx:198"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-65288799d955f093", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/athlete-profile/ProfileTab.tsx:237", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/athlete-profile/ProfileTab.tsx:237"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-05089c0e11005c30", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/athlete-profile/PlanningTab.tsx:114", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/athlete-profile/PlanningTab.tsx:114"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7d0642a9c90561e0", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/athlete-profile/OverviewTab.tsx:123", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/athlete-profile/OverviewTab.tsx:123"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0db52075812d910d", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/athlete-profile/RecurringExercises.tsx:86", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/athlete-profile/RecurringExercises.tsx:86"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-af0bbc1cbe544f82", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/athlete-profile/ui.tsx:52", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/athlete-profile/ui.tsx:52"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cfa2e8699484f839", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/drills/InteractiveDrillEditor.tsx:1217", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/drills/InteractiveDrillEditor.tsx:1217"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-084e7bc62828d42e", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/drills/DrillList.tsx:296", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/drills/DrillList.tsx:296"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-853bd2e4929edbd6", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/drills/DrillTemplateLibrary.tsx:108", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/drills/DrillTemplateLibrary.tsx:108"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bc3a34ccf046dc30", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/drills/ClubDrillLibrary.tsx:263", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/drills/ClubDrillLibrary.tsx:263"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-aa4680e435777095", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/teams/TeamKioskClient.tsx:147", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/teams/TeamKioskClient.tsx:147"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ce6a531b3ca0e266", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/teams/TeamTestManualEntryDialog.tsx:408", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/teams/TeamTestManualEntryDialog.tsx:408"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5b6212d9f0db0b31", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/teams/TeamPlayerDevelopment.tsx:149", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/teams/TeamPlayerDevelopment.tsx:149"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a98a0be5ff2dd896", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/teams/TeamTestProfile.tsx:238", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/teams/TeamTestProfile.tsx:238"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-53758d81495713ab", "name": "\"active\" state uses light bg in a dark theme \u2014 components/coach/teams/TeamTestProfile.tsx:466", "shortDescription": {"text": "\"active\" state uses light bg in a dark theme \u2014 components/coach/teams/TeamTestProfile.tsx:466"}, "fullDescription": {"text": "A ternary like `active ? 'bg-white' : '...'` (or bg-gray-100/200) on a dark theme produces jarring white pills. Use a dark-emphasized active state instead \u2014 border + ring or slightly brighter dark bg. Example: `active ? 'bg-gray-800 border-gray-500 ring-1 ring-blue-500/30' : '\u2026'`.\n\nWhy: P-E in CHECKLIST.md \u2014 light bg in a dark theme is a class of regression.\nRule id: fq.active-light-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c3103a0e572bec55", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/teams/AddPlayersDialog.tsx:299", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/teams/AddPlayersDialog.tsx:299"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-70cbedafffd7cff0", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/teams/TeamWorkoutMonitor.tsx:612", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/teams/TeamWorkoutMonitor.tsx:612"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b9e757bba6406f22", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/teams/TeamTestsClient.tsx:829", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/teams/TeamTestsClient.tsx:829"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5c511fa170acbbe8", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/teams/TeamTestImportDialog.tsx:473", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/teams/TeamTestImportDialog.tsx:473"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1055f59657b61ef6", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/teams/ImportRosterClient.tsx:388", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/teams/ImportRosterClient.tsx:388"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-57d35b3ed2c8a3e1", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/teams/TeamAnalysisClient.tsx:419", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/teams/TeamAnalysisClient.tsx:419"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9c363caa1fba73c3", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/teams/kiosk/TeamKioskWorkoutPanel.tsx:193", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/teams/kiosk/TeamKioskWorkoutPanel.tsx:193"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-89f314151ac2d540", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/teams/cockpit/TeamRosterRail.tsx:232", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/teams/cockpit/TeamRosterRail.tsx:232"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3a6e662f59cf0789", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/teams/cockpit/TeamPhaseStrip.tsx:60", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/teams/cockpit/TeamPhaseStrip.tsx:60"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2aecfedd8a4b66e1", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/teams/cockpit/TeamSchedulePane.tsx:377", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/teams/cockpit/TeamSchedulePane.tsx:377"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dfeebc38a7c9c137", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/interval-session/LactateEntryPanel.tsx:86", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/interval-session/LactateEntryPanel.tsx:86"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d670a97f240c6b54", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/interval-session/IntervalSessionList.tsx:173", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/interval-session/IntervalSessionList.tsx:173"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0a6e6ca10ba62d88", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/interval-session/IntervalSessionDashboard.tsx:229", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/interval-session/IntervalSessionDashboard.tsx:229"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e21205be448dd6c7", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/admin/BusinessCoachAssignmentsTab.tsx:325", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/admin/BusinessCoachAssignmentsTab.tsx:325"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3bc096e17fd95bf6", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/admin/CustomDomainSection.tsx:204", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/admin/CustomDomainSection.tsx:204"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6d87306f6acdbe02", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/admin/BusinessAiBudgetsTab.tsx:223", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/admin/BusinessAiBudgetsTab.tsx:223"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-35c652292297588d", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/admin/CustomEmailDomainSection.tsx:254", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/admin/CustomEmailDomainSection.tsx:254"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-221714599f358596", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/live-hr/AthleteHRCard.tsx:91", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/live-hr/AthleteHRCard.tsx:91"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a013fad1e7b6cebe", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/live-hr/SessionList.tsx:311", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/live-hr/SessionList.tsx:311"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-affd2d35d8db4a49", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/messages/MessagesClient.tsx:319", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/messages/MessagesClient.tsx:319"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-76d31ec505b7fb27", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/strength/SortableExerciseItem.tsx:202", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/strength/SortableExerciseItem.tsx:202"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2581c630a9247e7f", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/strength/SessionBuilder.tsx:621", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/strength/SessionBuilder.tsx:621"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1918584acb7bb4b2", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/strength/StrengthPRTable.tsx:388", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/strength/StrengthPRTable.tsx:388"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-642cc4469aad6158", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/strength/StrengthSessionLibrary.tsx:560", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/strength/StrengthSessionLibrary.tsx:560"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-012694eb96cc0b09", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/strength/SectionWorkoutBuilder.tsx:1398", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/strength/SectionWorkoutBuilder.tsx:1398"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-20226fc22d87e060", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/clients/ExternalAthleteAccessCard.tsx:306", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/clients/ExternalAthleteAccessCard.tsx:306"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8d4a2684fecb5f63", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/clients/ClientFuelingSummary.tsx:456", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/clients/ClientFuelingSummary.tsx:456"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c78bfa9b9faa65e6", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/clients/RecentTestsCard.tsx:116", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/clients/RecentTestsCard.tsx:116"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-24c5a82a5d5e8d1f", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/video-analysis/VideoUploader.tsx:521", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/video-analysis/VideoUploader.tsx:521"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c07698356ca606a9", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/team-calendar/EditEventDialog.tsx:956", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/team-calendar/EditEventDialog.tsx:956"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1c332d9ffe4b9e78", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/team-calendar/TeamCalendarView.tsx:907", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/team-calendar/TeamCalendarView.tsx:907"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-aa06bf4aa07af18d", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/quick-erg/CoachQuickErgWidgets.tsx:367", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/quick-erg/CoachQuickErgWidgets.tsx:367"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-23b0af7200319639", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/calendar/CoachCalendarClient.tsx:382", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/calendar/CoachCalendarClient.tsx:382"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-eb4664b098d23b68", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/sport-views/HockeyAthleteView.tsx:1232", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/sport-views/HockeyAthleteView.tsx:1232"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bdeea07e5403177f", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/sport-views/HYROXAthleteView.tsx:256", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/sport-views/HYROXAthleteView.tsx:256"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-afe0dc872f4ab11b", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/sport-views/FunctionalFitnessAthleteView.tsx:254", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/sport-views/FunctionalFitnessAthleteView.tsx:254"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ddaf47339765f7a4", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coach/sport-views/PadelAthleteView.tsx:231", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/sport-views/PadelAthleteView.tsx:231"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d3d42effd1229848", "name": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/BusinessCoachBrowser.tsx:220", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/BusinessCoachBrowser.tsx:220"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8e46c116f13327e6", "name": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/UpcomingWorkouts.tsx:77", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/UpcomingWorkouts.tsx:77"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-db5481ed47f72225", "name": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/IntegratedRecentActivity.tsx:323", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/IntegratedRecentActivity.tsx:323"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5548c9754e7692d5", "name": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/UpcomingTeamEvents.tsx:140", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/UpcomingTeamEvents.tsx:140"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8ce5e6fd98bf159c", "name": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/WeeklyTrainingSummaryCard.tsx:631", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/WeeklyTrainingSummaryCard.tsx:631"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f1f1373d8cdf1da3", "name": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/MentalPrepCard.tsx:216", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/MentalPrepCard.tsx:216"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5f37614d1a8c6094", "name": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/AthleteTestProfileCard.tsx:114", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/AthleteTestProfileCard.tsx:114"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0727290497f0a5a6", "name": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/VBTProgressionWidget.tsx:268", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/VBTProgressionWidget.tsx:268"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d353304968173327", "name": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/AthleteDrillList.tsx:152", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/AthleteDrillList.tsx:152"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a0f52b956ecb09ca", "name": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/WODHistorySection.tsx:139", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/WODHistorySection.tsx:139"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b21434e661a1ecac", "name": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/MatchScheduleWidget.tsx:201", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/MatchScheduleWidget.tsx:201"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-30c70e76fb13fc56", "name": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/workout/HeadlessVoiceCoach.tsx:177", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/workout/HeadlessVoiceCoach.tsx:177"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ab262e4b8eaa2bca", "name": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/workout/WorkoutLogClient.tsx:418", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/workout/WorkoutLogClient.tsx:418"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bf255257a98e30f8", "name": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/adhoc/WorkoutReview.tsx:484", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/adhoc/WorkoutReview.tsx:484"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a5bdf5de5b1b19b6", "name": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/ai/ChatCardioWorkoutCard.tsx:42", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/ai/ChatCardioWorkoutCard.tsx:42"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0353ee9be81c60ae", "name": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/ai/ChatProgramPreviewCard.tsx:147", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/ai/ChatProgramPreviewCard.tsx:147"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a52f0755062d6507", "name": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/ai/AthleteFloatingChat.tsx:948", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/ai/AthleteFloatingChat.tsx:948"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9084f06efaab45c9", "name": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/ai/ChatWorkoutCard.tsx:111", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/ai/ChatWorkoutCard.tsx:111"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6a4ca1650c280693", "name": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/shareable/ShareAchievementButton.tsx:270", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/shareable/ShareAchievementButton.tsx:270"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3dbc2a70e2a21ab8", "name": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/cardio/LiveVoiceCoachButton.tsx:52", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/cardio/LiveVoiceCoachButton.tsx:52"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-102509c4e6105703", "name": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/hybrid/AthleteHybridClient.tsx:272", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/hybrid/AthleteHybridClient.tsx:272"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-008f6e3d7aee9637", "name": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/fueling/WorkoutFuelingPlanCard.tsx:250", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/fueling/WorkoutFuelingPlanCard.tsx:250"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3153b6925fe2f20a", "name": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/fueling/FuelingTrainingProgressCard.tsx:291", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/fueling/FuelingTrainingProgressCard.tsx:291"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5788349aea60c470", "name": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/fueling/RaceFuelingPlanDetail.tsx:985", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/fueling/RaceFuelingPlanDetail.tsx:985"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-531dc2f27e6b7e90", "name": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/dashboard/RestDayHeroCard.tsx:566", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/dashboard/RestDayHeroCard.tsx:566"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-73c322d6cba779e6", "name": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/performance/HYROXPerformanceForm.tsx:319", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/performance/HYROXPerformanceForm.tsx:319"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e81fd0a3c28314c2", "name": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/wod/WODHistorySummary.tsx:98", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/wod/WODHistorySummary.tsx:98"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b0dc978acc8dbd6c", "name": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/outdoor-run/OutdoorRunCapture.tsx:523", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/outdoor-run/OutdoorRunCapture.tsx:523"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f27236c224b8abba", "name": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/strength/StrengthFocusMode.tsx:619", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/strength/StrengthFocusMode.tsx:619"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d03a4ffebf318838", "name": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/strength/AthleteStrengthPRTable.tsx:161", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/strength/AthleteStrengthPRTable.tsx:161"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-042043a5a43c15c4", "name": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/nutrition/MealInputMethodSelector.tsx:107", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/nutrition/MealInputMethodSelector.tsx:107"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-53a4af437d7fec8c", "name": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/nutrition/IngredientBuilder.tsx:709", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/nutrition/IngredientBuilder.tsx:709"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-eb8638f4a954c234", "name": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/nutrition/QuickMealLog.tsx:950", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/nutrition/QuickMealLog.tsx:950"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7ddbf953ec632413", "name": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/nutrition/DailyNutritionCard.tsx:396", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/nutrition/DailyNutritionCard.tsx:396"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-94b0d0fc12897a55", "name": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/quick-erg/QuickErgCapture.tsx:490", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/quick-erg/QuickErgCapture.tsx:490"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3144add7a459c352", "name": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/browse-workouts/WorkoutTemplateCard.tsx:87", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/browse-workouts/WorkoutTemplateCard.tsx:87"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-69fa60268b8f6d82", "name": "`truncate` class without `title=` for hover reveal \u2014 components/documents/DocumentUploader.tsx:360", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/documents/DocumentUploader.tsx:360"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d5054345e8bc7ab5", "name": "`truncate` class without `title=` for hover reveal \u2014 components/documents/DocumentsClient.tsx:450", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/documents/DocumentsClient.tsx:450"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2e8740d1f4eb7f74", "name": "`truncate` class without `title=` for hover reveal \u2014 components/documents/DocumentPreview.tsx:137", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/documents/DocumentPreview.tsx:137"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6f31fce9b08918b1", "name": "`truncate` class without `title=` for hover reveal \u2014 components/physio/MultiExercisePicker.tsx:121", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/physio/MultiExercisePicker.tsx:121"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-27fd38bfd9befa1d", "name": "`truncate` class without `title=` for hover reveal \u2014 components/coaches/CoachDirectoryClient.tsx:218", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coaches/CoachDirectoryClient.tsx:218"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9ef232f5dd521990", "name": "`truncate` class without `title=` for hover reveal \u2014 components/nutrition/NutritionTipCard.tsx:165", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/nutrition/NutritionTipCard.tsx:165"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3e65c9f2ea9b7a17", "name": "`truncate` class without `title=` for hover reveal \u2014 components/nutrition/FoodPhotoScanner.tsx:1149", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/nutrition/FoodPhotoScanner.tsx:1149"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-347474c7a0ca1bb2", "name": "`truncate` class without `title=` for hover reveal \u2014 components/nutrition/FoodHistoryPage.tsx:361", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/nutrition/FoodHistoryPage.tsx:361"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9c06f561ae2e27c0", "name": "`truncate` class without `title=` for hover reveal \u2014 components/hybrid-studio/WorkoutAssignmentDialog.tsx:345", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/hybrid-studio/WorkoutAssignmentDialog.tsx:345"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-815320a2c5f72a6d", "name": "`truncate` class without `title=` for hover reveal \u2014 components/hybrid-studio/HybridStudioClient.tsx:1007", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/hybrid-studio/HybridStudioClient.tsx:1007"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2c5b646743beb6c0", "name": "`truncate` class without `title=` for hover reveal \u2014 components/calendar/UnifiedCalendar.tsx:1623", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/calendar/UnifiedCalendar.tsx:1623"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7574786f812e79bd", "name": "`truncate` class without `title=` for hover reveal \u2014 components/calendar/MonthViewDraggable.tsx:657", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/calendar/MonthViewDraggable.tsx:657"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b27bfc8f57b04036", "name": "`truncate` class without `title=` for hover reveal \u2014 components/calendar/MonthView.tsx:341", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/calendar/MonthView.tsx:341"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d41b44a7cac06dd5", "name": "`truncate` class without `title=` for hover reveal \u2014 components/calendar/DayActionMenu.tsx:149", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/calendar/DayActionMenu.tsx:149"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-61ce2776d23f9d0d", "name": "`truncate` class without `title=` for hover reveal \u2014 components/calendar/day-sidebar/item-cards.tsx:252", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/calendar/day-sidebar/item-cards.tsx:252"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c0159732fa30b90a", "name": "`truncate` class without `title=` for hover reveal \u2014 components/feedback/BetaFeedbackWidget.tsx:411", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/feedback/BetaFeedbackWidget.tsx:411"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c23ee5bfdd24bd1d", "name": "`truncate` class without `title=` for hover reveal \u2014 components/forms/SmartTestImportDialog.tsx:316", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/forms/SmartTestImportDialog.tsx:316"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1cfa6a88e1d0e329", "name": "`truncate` class without `title=` for hover reveal \u2014 components/workouts/WorkoutPreview.tsx:337", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/workouts/WorkoutPreview.tsx:337"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c74375357fde3915", "name": "`truncate` class without `title=` for hover reveal \u2014 components/workouts/print/PrintableWorkoutSheet.tsx:75", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/workouts/print/PrintableWorkoutSheet.tsx:75"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-857a3ef2342bc6b1", "name": "`truncate` class without `title=` for hover reveal \u2014 components/workouts/import/ImportWorkoutDialog.tsx:501", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/workouts/import/ImportWorkoutDialog.tsx:501"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4454f986c08d94e5", "name": "`truncate` class without `title=` for hover reveal \u2014 app/external/athlete/[token]/page.tsx:439", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/external/athlete/[token]/page.tsx:439"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-13ee5b23a223dc99", "name": "TODO/FIXME marker in shipping code \u2014 app/api/calendar/external/[id]/sync/route.ts:578", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 app/api/calendar/external/[id]/sync/route.ts:578"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c2b52a75e83c7ea4", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(business)/[businessSlug]/coach/clients/page.tsx:370", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(business)/[businessSlug]/coach/clients/page.tsx:370"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a1fa3ede7c48d465", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(business)/[businessSlug]/athlete/ad-hoc/[id]/page.tsx:426", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(business)/[businessSlug]/athlete/ad-hoc/[id]/page.tsx:426"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f2e3837cba07d0e7", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(business)/[businessSlug]/physio/messages/page.tsx:238", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(business)/[businessSlug]/physio/messages/page.tsx:238"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-30c62805d1417245", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(business)/[businessSlug]/physio/rehab-programs/page.tsx:224", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(business)/[businessSlug]/physio/rehab-programs/page.tsx:224"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b6b50598d14c56ca", "name": "`truncate` class without `title=` for hover reveal \u2014 app/athlete/wod/history/WODHistoryClient.tsx:271", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/athlete/wod/history/WODHistoryClient.tsx:271"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-40c9b13a196c0ac0", "name": "`truncate` class without `title=` for hover reveal \u2014 app/athlete/ad-hoc/[id]/page.tsx:493", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/athlete/ad-hoc/[id]/page.tsx:493"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-efc0c7de9d7a7d21", "name": "`truncate` class without `title=` for hover reveal \u2014 app/athlete/log-workout/import/garmin/page.tsx:218", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/athlete/log-workout/import/garmin/page.tsx:218"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-76080ca5a66f8b15", "name": "`truncate` class without `title=` for hover reveal \u2014 app/athlete/log-workout/import/strava/page.tsx:213", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/athlete/log-workout/import/strava/page.tsx:213"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a682b6049db62adb", "name": "`truncate` class without `title=` for hover reveal \u2014 app/my/calendar/UnifiedCalendarClient.tsx:424", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/my/calendar/UnifiedCalendarClient.tsx:424"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-175c4a2a12ea361a", "name": "TODO/FIXME marker in shipping code \u2014 lib/rate-limit-redis.ts:15", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 lib/rate-limit-redis.ts:15"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e6bd50fdbace0eb9", "name": "TODO/FIXME marker in shipping code \u2014 lib/managed-agents/shadow-mode.ts:168", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 lib/managed-agents/shadow-mode.ts:168"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f0554739a0f14ea0", "name": "TODO/FIXME marker in shipping code \u2014 lib/operator-agents/tools/platform-health.ts:31", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 lib/operator-agents/tools/platform-health.ts:31"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-04297a3fb9534b67", "name": "Stray `console.log` in TS/JS \u2014 pitch-deck/generate-pptx.js:1008", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 pitch-deck/generate-pptx.js:1008"}, "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-c811bd80dbcabc0f", "name": "Stray `console.log` in TS/JS \u2014 load-tests/k6/run.test.ts:64", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 load-tests/k6/run.test.ts:64"}, "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-79f94bcc0bd5ae30", "name": "Dockerfile runs as root: apps/garmin-webhook/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: apps/garmin-webhook/Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e39e0c5bb936a070", "name": "Docker base image is tag-pinned but not digest-pinned: node:20-bookworm-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-bookworm-slim"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6b37a6f0cc55804a", "name": "Insecure pattern 'node_child_process' in scripts/qa-hockey-browser-env.cjs:5", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/qa-hockey-browser-env.cjs:5"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d8365d93a6931de3", "name": "Insecure pattern 'node_child_process' in scripts/hockey-pilot-evidence.test.ts:4", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/hockey-pilot-evidence.test.ts:4"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-afe8f87357f3b600", "name": "Insecure pattern 'node_child_process' in scripts/qa-hockey-pilot-readiness.cjs:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/qa-hockey-pilot-readiness.cjs:2"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d3e5309d362ff6cc", "name": "Insecure pattern 'node_child_process' in scripts/qa-hockey-pilot-gates.cjs:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/qa-hockey-pilot-gates.cjs:2"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1dca9b3e072c52d9", "name": "Possible secret in scripts/create-athlete-for-client.ts", "shortDescription": {"text": "Possible secret in scripts/create-athlete-for-client.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-720dbe257e98525c", "name": "Insecure pattern 'node_child_process' in scripts/qa-hockey-pilot-env.cjs:8", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/qa-hockey-pilot-env.cjs:8"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a0fa1a68a87f30c0", "name": "Insecure pattern 'node_child_process' in scripts/qa-hockey-deployment-commit.cjs:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/qa-hockey-deployment-commit.cjs:2"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1981613a991784c7", "name": "Insecure pattern 'eval_used' in scripts/chrome-debug.cjs:181", "shortDescription": {"text": "Insecure pattern 'eval_used' in scripts/chrome-debug.cjs:181"}, "fullDescription": {"text": "Found a known-risky pattern (eval_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-75dcb86c05a47944", "name": "Insecure pattern 'node_child_process' in scripts/qa-hockey-evidence-commands.cjs:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/qa-hockey-evidence-commands.cjs:2"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f3b1e4b344f69084", "name": "Insecure pattern 'node_child_process' in scripts/qa-hockey-pilot-env.test.ts:4", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/qa-hockey-pilot-env.test.ts:4"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-490b17a54ccf1454", "name": "Insecure pattern 'document_write' in components/ai-studio/ResearchResultViewer.tsx:162", "shortDescription": {"text": "Insecure pattern 'document_write' in components/ai-studio/ResearchResultViewer.tsx:162"}, "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-605ca79a6accf114", "name": "Insecure pattern 'document_write' in components/coach/drills/PracticePlanner.tsx:392", "shortDescription": {"text": "Insecure pattern 'document_write' in components/coach/drills/PracticePlanner.tsx:392"}, "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-1f98f7e358d28381", "name": "Insecure pattern 'document_write' in components/coach/video-analysis/ClientVideoAnalyses.tsx:176", "shortDescription": {"text": "Insecure pattern 'document_write' in components/coach/video-analysis/ClientVideoAnalyses.tsx:176"}, "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-31c36154a969ed58", "name": "Insecure pattern 'document_write' in components/coach/video-analysis/VideoAnalysisCard.tsx:720", "shortDescription": {"text": "Insecure pattern 'document_write' in components/coach/video-analysis/VideoAnalysisCard.tsx:720"}, "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-b334f519343762d4", "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-1a50467f36b413ec", "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-cb639d9a10a47b23", "name": "package.json defines install-time lifecycle scripts", "shortDescription": {"text": "package.json defines install-time lifecycle scripts"}, "fullDescription": {"text": "preinstall/install/postinstall/prepare scripts execute during dependency installation. Review them carefully for network calls, obfuscation, shell execution, or credential access."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-802ad68136bbee65", "name": "Very large file: scripts/build-exercise-image-frame-prompts.ts (1246 lines)", "shortDescription": {"text": "Very large file: scripts/build-exercise-image-frame-prompts.ts (1246 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-fb2a935ce59c118b", "name": "Very large file: prisma/seed-exercises.ts (2055 lines)", "shortDescription": {"text": "Very large file: prisma/seed-exercises.ts (2055 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-667c556b73e2b0ce", "name": "Very large file: prisma/seed-hybrid-movements.ts (2073 lines)", "shortDescription": {"text": "Very large file: prisma/seed-hybrid-movements.ts (2073 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-027dd558bb38ea67", "name": "Very large file: prisma/seed-workout-templates.ts (1553 lines)", "shortDescription": {"text": "Very large file: prisma/seed-workout-templates.ts (1553 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-3cde17ba3223d0e1", "name": "Very large file: prisma/seed-unified-exercises.ts (1507 lines)", "shortDescription": {"text": "Very large file: prisma/seed-unified-exercises.ts (1507 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-956c4b6fa4af33b9", "name": "Very large file: prisma/seed-agility-drills.ts (1839 lines)", "shortDescription": {"text": "Very large file: prisma/seed-agility-drills.ts (1839 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-98d40fffd5b75c48", "name": "Very large file: components/ai-canvas/AICanvasClient.tsx (1515 lines)", "shortDescription": {"text": "Very large file: components/ai-canvas/AICanvasClient.tsx (1515 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-ee1cd9c93000946a", "name": "Very large file: components/ai-studio/FloatingAIChat.tsx (2405 lines)", "shortDescription": {"text": "Very large file: components/ai-studio/FloatingAIChat.tsx (2405 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-ae56769e0fd90369", "name": "Very large file: components/ai-studio/DraftWorkoutEditor.tsx (1200 lines)", "shortDescription": {"text": "Very large file: components/ai-studio/DraftWorkoutEditor.tsx (1200 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-8bd05a7b4d8692e7", "name": "Very large file: components/ai-studio/EnhancedProgramPreview.tsx (1452 lines)", "shortDescription": {"text": "Very large file: components/ai-studio/EnhancedProgramPreview.tsx (1452 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-570c3ec735fb22f6", "name": "Very large file: components/ai-studio/AIStudioClient.tsx (1810 lines)", "shortDescription": {"text": "Very large file: components/ai-studio/AIStudioClient.tsx (1810 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-a37a4a7d77671e2d", "name": "Very large file: components/mva/MVAAnalysisClient.tsx (1672 lines)", "shortDescription": {"text": "Very large file: components/mva/MVAAnalysisClient.tsx (1672 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-023b2a6749b41648", "name": "Very large file: components/programs/wizard/ConfigurationForm.tsx (1425 lines)", "shortDescription": {"text": "Very large file: components/programs/wizard/ConfigurationForm.tsx (1425 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-531bf24cbcbbad1d", "name": "Very large file: components/coach/cardio/CardioSessionBuilder.tsx (1872 lines)", "shortDescription": {"text": "Very large file: components/coach/cardio/CardioSessionBuilder.tsx (1872 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-62a63d70805176ac", "name": "Very large file: components/coach/drills/InteractiveDrillEditor.tsx (1548 lines)", "shortDescription": {"text": "Very large file: components/coach/drills/InteractiveDrillEditor.tsx (1548 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-906c42497243cba8", "name": "Very large file: components/coach/teams/TeamTestsClient.tsx (1590 lines)", "shortDescription": {"text": "Very large file: components/coach/teams/TeamTestsClient.tsx (1590 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-5752e9169ec85697", "name": "Very large file: components/coach/strength/SectionWorkoutBuilder.tsx (1560 lines)", "shortDescription": {"text": "Very large file: components/coach/strength/SectionWorkoutBuilder.tsx (1560 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-2228e4b98320273e", "name": "Very large file: components/coach/video-analysis/PoseAnalyzer.tsx (1978 lines)", "shortDescription": {"text": "Very large file: components/coach/video-analysis/PoseAnalyzer.tsx (1978 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-c09ff6ce13132a97", "name": "Very large file: components/coach/video-analysis/VideoAnalysisCard.tsx (1508 lines)", "shortDescription": {"text": "Very large file: components/coach/video-analysis/VideoAnalysisCard.tsx (1508 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-e5f32f71019f732d", "name": "Very large file: components/coach/hockey-tests/HockeyTestForm.tsx (1042 lines)", "shortDescription": {"text": "Very large file: components/coach/hockey-tests/HockeyTestForm.tsx (1042 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-718d9119b24df4b0", "name": "Very large file: components/coach/team-calendar/EditEventDialog.tsx (1458 lines)", "shortDescription": {"text": "Very large file: components/coach/team-calendar/EditEventDialog.tsx (1458 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-16a7d3d981e29252", "name": "Very large file: components/coach/team-calendar/TeamCalendarView.tsx (1612 lines)", "shortDescription": {"text": "Very large file: components/coach/team-calendar/TeamCalendarView.tsx (1612 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-eb21e8f7a1fe9cce", "name": "Very large file: components/coach/sport-views/HockeyAthleteView.tsx (1674 lines)", "shortDescription": {"text": "Very large file: components/coach/sport-views/HockeyAthleteView.tsx (1674 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-eb1294fa4c1c998a", "name": "Very large file: components/athlete/DailyCheckInForm.tsx (1181 lines)", "shortDescription": {"text": "Very large file: components/athlete/DailyCheckInForm.tsx (1181 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-b8514fec827d1ce6", "name": "Very large file: components/athlete/WorkoutLoggingForm.tsx (1503 lines)", "shortDescription": {"text": "Very large file: components/athlete/WorkoutLoggingForm.tsx (1503 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-27b5e64d05e98cdd", "name": "Very large file: components/athlete/ai/AthleteFloatingChat.tsx (1584 lines)", "shortDescription": {"text": "Very large file: components/athlete/ai/AthleteFloatingChat.tsx (1584 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-6fed6ae982e688c7", "name": "Very large file: components/athlete/cardio/CardioFocusModeWorkout.tsx (1290 lines)", "shortDescription": {"text": "Very large file: components/athlete/cardio/CardioFocusModeWorkout.tsx (1290 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-de387a4440451816", "name": "Very large file: components/athlete/fueling/RaceFuelingPlanDetail.tsx (1407 lines)", "shortDescription": {"text": "Very large file: components/athlete/fueling/RaceFuelingPlanDetail.tsx (1407 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-558661732ccb90d5", "name": "Very large file: components/nutrition/FoodPhotoScanner.tsx (1972 lines)", "shortDescription": {"text": "Very large file: components/nutrition/FoodPhotoScanner.tsx (1972 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-c744e62180e35bdf", "name": "Very large file: components/hybrid-studio/HybridWorkoutBuilder.tsx (1345 lines)", "shortDescription": {"text": "Very large file: components/hybrid-studio/HybridWorkoutBuilder.tsx (1345 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-b30e4f6940298df6", "name": "Very large file: components/calendar/UnifiedCalendar.tsx (1627 lines)", "shortDescription": {"text": "Very large file: components/calendar/UnifiedCalendar.tsx (1627 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-6ba0005addfbab1b", "name": "Very large file: components/calendar/CalendarWorkoutDetailSheet.tsx (1433 lines)", "shortDescription": {"text": "Very large file: components/calendar/CalendarWorkoutDetailSheet.tsx (1433 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-f3d308ce78386d64", "name": "Very large file: components/forms/TestDataForm.tsx (1678 lines)", "shortDescription": {"text": "Very large file: components/forms/TestDataForm.tsx (1678 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-73a229d85a551da9", "name": "Very large file: lib/ai/athlete-context-builder.ts (1552 lines)", "shortDescription": {"text": "Very large file: lib/ai/athlete-context-builder.ts (1552 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-7ec039cdf6055b66", "name": "Very large file: lib/ai/program-prompts.ts (1683 lines)", "shortDescription": {"text": "Very large file: lib/ai/program-prompts.ts (1683 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-7b20d2de43a8b880", "name": "Very large file: lib/ai/wod-prompts.ts (1629 lines)", "shortDescription": {"text": "Very large file: lib/ai/wod-prompts.ts (1629 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-630a05eb78f9b248", "name": "Very large file: lib/ai/chat-tools.ts (1054 lines)", "shortDescription": {"text": "Very large file: lib/ai/chat-tools.ts (1054 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea3b5e389d8c9c0f", "name": "Low test-to-source ratio", "shortDescription": {"text": "Low test-to-source ratio"}, "fullDescription": {"text": "518 tests / 2856 src (ratio 0.18)."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 1613 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 1423 placeholder/mock markers across 334 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e725d2ab884fbd49", "name": "Multiple root agent instruction files without precedence", "shortDescription": {"text": "Multiple root agent instruction files without precedence"}, "fullDescription": {"text": "The repo has multiple top-level AI-coder instruction files. Without precedence rules, different agents may follow different policies."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1cb1c1ff6705d8b2", "name": "Commented-code block (5 lines) in eslint.config.mjs:28", "shortDescription": {"text": "Commented-code block (5 lines) in eslint.config.mjs: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-17dd40c6f2bfe31a", "name": "Commented-code block (5 lines) in proxy.ts:430", "shortDescription": {"text": "Commented-code block (5 lines) in proxy.ts:430"}, "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-11c4d6f19b1c23e9", "name": "Commented-code block (6 lines) in next.config.ts:7", "shortDescription": {"text": "Commented-code block (6 lines) in next.config.ts:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f4df2edf63a89ea8", "name": "Commented-code block (5 lines) in types/ai-models.ts:381", "shortDescription": {"text": "Commented-code block (5 lines) in types/ai-models.ts:381"}, "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-00b4f5e042542e17", "name": "Commented-code block (5 lines) in scripts/verify-percent-resolution.ts:110", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/verify-percent-resolution.ts:110"}, "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-14fb46071e016ee4", "name": "Legacy-named symbol `totalLegacy` in scripts/audit-legacy-routes.ts:164", "shortDescription": {"text": "Legacy-named symbol `totalLegacy` in scripts/audit-legacy-routes.ts:164"}, "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-9c256d27f959dfa8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/qa-hockey-cockpit.ts:177", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/qa-hockey-cockpit.ts:177"}, "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-2cf643148d4dc139", "name": "Legacy-named symbol `embedding_v2` in scripts/seed-hockey-knowledge-skill.ts:10", "shortDescription": {"text": "Legacy-named symbol `embedding_v2` in scripts/seed-hockey-knowledge-skill.ts:10"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3b8d0992905a119a", "name": "Legacy-named symbol `embedding_v2` in scripts/migrate-embeddings-v2.ts:2", "shortDescription": {"text": "Legacy-named symbol `embedding_v2` in scripts/migrate-embeddings-v2.ts:2"}, "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-aa49d6bc1ad243ee", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/import-livsmedelsverket.ts:75", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/import-livsmedelsverket.ts:75"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c50d6b8155175b31", "name": "Legacy-named symbol `embedding_v2` in scripts/seed-platform-help.ts:8", "shortDescription": {"text": "Legacy-named symbol `embedding_v2` in scripts/seed-platform-help.ts:8"}, "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-86ae155ab76b9a9a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/ai/performance-analysis/AnalyzeTestButton.tsx:97", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/ai/performance-analysis/AnalyzeTestButton.tsx:97"}, "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-10ef9c1efd8bf662", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/test/TestPageContent.tsx:243", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/test/TestPageContent.tsx:243"}, "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-4a42e6abdf471096", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/data-moat/CoachDecisionModal.tsx:375", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/data-moat/CoachDecisionModal.tsx:375"}, "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-3d03c315da344485", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/ai-studio/FloatingAIChat.tsx:1010", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/ai-studio/FloatingAIChat.tsx:1010"}, "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-5f420839bc43d04f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/ai-studio/ResearchHistory.tsx:194", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/ai-studio/ResearchHistory.tsx:194"}, "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-5ab0137fca97977f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/ai-studio/AIContextButton.tsx:134", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/ai-studio/AIContextButton.tsx:134"}, "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-a42ce8712c575f1d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/mva/MVAAnalysisClient.tsx:534", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/mva/MVAAnalysisClient.tsx:534"}, "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-6c9e807d4465f0c6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/admin/businesses/PartnerReferralsTab.tsx:109", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/admin/businesses/PartnerReferralsTab.tsx:109"}, "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-b5a4119be5cecf9e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/admin/businesses/AIActionHistoryPanel.tsx:80", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/admin/businesses/AIActionHistoryPanel.tsx:80"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7275751fbc6929fb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/admin/businesses/BusinessForm.tsx:59", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/admin/businesses/BusinessForm.tsx:59"}, "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-d9f57df79a8e5e02", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/admin/contracts/ContractsTable.tsx:81", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/admin/contracts/ContractsTable.tsx:81"}, "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-dda2d91409ab280b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/programs/import/ExerciseAliasesClient.tsx:55", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/programs/import/ExerciseAliasesClient.tsx:55"}, "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-8655f301529acdb0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/programs/import/ImportProgramClient.tsx:294", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/programs/import/ImportProgramClient.tsx:294"}, "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-f4fac47ba31b86d1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/programs/wizard/ConfigurationForm.tsx:329", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/programs/wizard/ConfigurationForm.tsx:329"}, "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-5494625e3a11fe82", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/programs/wizard/ProgramWizard.tsx:405", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/programs/wizard/ProgramWizard.tsx:405"}, "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-6dfc53861acd8cd9", "name": "Commented-code block (6 lines) in components/programs/wizard/configuration-form/schema.ts:45", "shortDescription": {"text": "Commented-code block (6 lines) in components/programs/wizard/configuration-form/schema.ts:45"}, "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-d07929d9fa1bf66d", "name": "Commented-code block (6 lines) in components/agility-studio/AgilityWorkoutBuilder.tsx:164", "shortDescription": {"text": "Commented-code block (6 lines) in components/agility-studio/AgilityWorkoutBuilder.tsx:164"}, "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-5071ab51f017bc53", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/agility-studio/AgilityStudioClient.tsx:133", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/agility-studio/AgilityStudioClient.tsx:133"}, "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-5293a5b43fc78af1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/agility-studio/TimingGateImport.tsx:191", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/agility-studio/TimingGateImport.tsx:191"}, "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-e497bc832e8034b7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/WorkoutFeedbackModal.tsx:193", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/WorkoutFeedbackModal.tsx:193"}, "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-4e54d482c4a26318", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/CoachAIAssistantPanel.tsx:73", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/CoachAIAssistantPanel.tsx:73"}, "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-4298d70ec5c821c9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/AthleteModeToggle.tsx:126", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/AthleteModeToggle.tsx:126"}, "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-534b3d0757bf9da2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/BusinessCoachGlassHeader.tsx:143", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/BusinessCoachGlassHeader.tsx:143"}, "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-45b1a92fecd2efcd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/settings/ai/DefaultModelSelector.tsx:73", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/settings/ai/DefaultModelSelector.tsx:73"}, "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-58b7e8c9eb1839fa", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/settings/ai/ApiKeySettingsClient.tsx:181", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/settings/ai/ApiKeySettingsClient.tsx:181"}, "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-159527dab7d5e56c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/settings/athlete-dashboards/AthleteDashboardTemplatesClie", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/settings/athlete-dashboards/AthleteDashboardTemplatesClient.tsx:246"}, "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-910b88d9ee887da9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/voice-workout/VoiceWorkoutCreator.tsx:248", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/voice-workout/VoiceWorkoutCreator.tsx:248"}, "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-9fe887f0e487dc1f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/voice-workout/TargetSelector.tsx:76", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/voice-workout/TargetSelector.tsx: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-1317fc1ac20f78bb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/cardio/CardioSessionLibrary.tsx:195", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/cardio/CardioSessionLibrary.tsx:195"}, "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-5e317fb4d4c8d8ea", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/cardio/CardioTemplateLibrary.tsx:163", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/cardio/CardioTemplateLibrary.tsx:163"}, "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-3ff47e471675b8cb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/cardio/CardioSessionAssignmentDialog.tsx:145", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/cardio/CardioSessionAssignmentDialog.tsx:145"}, "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-dc02add7116ab06c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/cardio/CardioSessionBuilder.tsx:412", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/cardio/CardioSessionBuilder.tsx:412"}, "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-2ef8003df1425f95", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/exercise-library/ExerciseLibraryBrowser.tsx:173", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/exercise-library/ExerciseLibraryBrowser.tsx:173"}, "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-7dfeb676a719999f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/exercise-library/CustomExerciseCreator.tsx:184", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/exercise-library/CustomExerciseCreator.tsx:184"}, "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-677c4d1223dcf040", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/dashboard/TeamCoachActionDialog.tsx:149", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/dashboard/TeamCoachActionDialog.tsx:149"}, "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-f8e8367987258166", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/dashboard/AthleteAttentionList.tsx:176", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/dashboard/AthleteAttentionList.tsx:176"}, "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-f9ac7522b7267923", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/dashboard/GymClientListCard.tsx:63", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/dashboard/GymClientListCard.tsx: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-9ee9d39b7146417a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/dashboard/ClientStatusGrid.tsx:116", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/dashboard/ClientStatusGrid.tsx:116"}, "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-22b027c2c897c2d8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/dashboard/GymClassesCard.tsx:67", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/dashboard/GymClassesCard.tsx:67"}, "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-a985ea87c956fcb7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/agent/AgentPerformanceMetrics.tsx:107", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/agent/AgentPerformanceMetrics.tsx:107"}, "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-5036b3620c02397e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/agent/AgentOversightSummaryCard.tsx:37", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/agent/AgentOversightSummaryCard.tsx:37"}, "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-508f849dec08602a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/agent/AgentOversightQueue.tsx:56", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/agent/AgentOversightQueue.tsx:56"}, "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-7e60cd83a29f4165", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/agent/ManagedAgentsMonitor.tsx:69", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/agent/ManagedAgentsMonitor.tsx: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-67d3c49637f848ad", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/team/WorkoutPickerField.tsx:82", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/team/WorkoutPickerField.tsx:82"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-236914e58cf47acc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/team/TeamWorkoutAssignmentDialog.tsx:363", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/team/TeamWorkoutAssignmentDialog.tsx:363"}, "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-34a3c43b7b74c8f1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/athlete-profile/AssessmentTimeline.tsx:86", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/athlete-profile/AssessmentTimeline.tsx:86"}, "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-3c5e7b0a8678b38d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/teams/TeamTestManualEntryDialog.tsx:106", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/teams/TeamTestManualEntryDialog.tsx:106"}, "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-544ac108365e2e98", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/teams/AddPlayersDialog.tsx:196", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/teams/AddPlayersDialog.tsx:196"}, "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-ddac22f678f040c7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/teams/TeamWorkoutMonitor.tsx:316", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/teams/TeamWorkoutMonitor.tsx:316"}, "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-df104b940a61d0a7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/teams/TeamTestImportDialog.tsx:175", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/teams/TeamTestImportDialog.tsx:175"}, "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-f82083b55f515525", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/teams/TeamChatPanel.tsx:78", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/teams/TeamChatPanel.tsx:78"}, "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-c734db3e972d8db8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/teams/ImportRosterClient.tsx:213", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/teams/ImportRosterClient.tsx:213"}, "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-3928ce5c316df948", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/teams/kiosk/TeamKioskWorkoutPanel.tsx:144", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/teams/kiosk/TeamKioskWorkoutPanel.tsx:144"}, "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-776cb1c6e8a228d2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/teams/kiosk/KioskSetLogger.tsx:110", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/teams/kiosk/KioskSetLogger.tsx:110"}, "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-0839cd3184e3e88a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/interval-session/CreateIntervalSessionDialog.tsx:163", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/interval-session/CreateIntervalSessionDialog.tsx:163"}, "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-92efc61feef36a2c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/admin/BusinessBrandingTab.tsx:217", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/admin/BusinessBrandingTab.tsx:217"}, "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-aaaf9eeb2987208f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/admin/BusinessReferralsTab.tsx:107", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/admin/BusinessReferralsTab.tsx:107"}, "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-4b0432b6a3999ee4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/injury/InjuryProgressTimeline.tsx:254", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/injury/InjuryProgressTimeline.tsx:254"}, "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-530cdbcd0730d97c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/injury/AutoModifiedWorkoutsView.tsx:78", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/injury/AutoModifiedWorkoutsView.tsx:78"}, "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-db3bbfed309bf78b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/injury/ACWRRiskMonitor.tsx:214", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/injury/ACWRRiskMonitor.tsx:214"}, "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-3315ac39a43accb5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/injury/InjuryAlertCenter.tsx:208", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/injury/InjuryAlertCenter.tsx:208"}, "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-921b3a56007281b9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/programs/ProgramExportButton.tsx:132", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/programs/ProgramExportButton.tsx:132"}, "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-c42cecdd86264eea", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/live-hr/LiveHRDashboard.tsx:153", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/live-hr/LiveHRDashboard.tsx:153"}, "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-e33df64cf9e0652c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/live-hr/MachineCapturePanel.tsx:159", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/live-hr/MachineCapturePanel.tsx:159"}, "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-469b832df23eea9e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/strength/SessionBuilder.tsx:389", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/strength/SessionBuilder.tsx:389"}, "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-faa387afe188918d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/strength/StrengthSessionLibrary.tsx:246", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/strength/StrengthSessionLibrary.tsx:246"}, "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-0c479f134bd5178b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/strength/SectionWorkoutBuilder.tsx:473", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/strength/SectionWorkoutBuilder.tsx:473"}, "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-ee7075c5ba0b6d19", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/strength/StrengthDashboard.tsx:592", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/strength/StrengthDashboard.tsx:592"}, "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-221b69fd3d6cb11f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/strength/BulkPRImportDialog.tsx:222", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/strength/BulkPRImportDialog.tsx:222"}, "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-28d6bdf5ff36056a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/strength/StrengthSessionAssignmentDialog.tsx:143", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/strength/StrengthSessionAssignmentDialog.tsx:143"}, "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-1c68bca2a3622f06", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/onboarding/ClubOnboardingWizard.tsx:144", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/onboarding/ClubOnboardingWizard.tsx:144"}, "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-3395b0b12d36598b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/clients/SportProfileEditor.tsx:337", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/clients/SportProfileEditor.tsx:337"}, "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-a0bbad790ef62696", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/video-analysis/VideoUploader.tsx:243", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/video-analysis/VideoUploader.tsx:243"}, "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-7efaa62b021386c9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/video-analysis/VideoAnalysisList.tsx:112", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/video-analysis/VideoAnalysisList.tsx:112"}, "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-dda3a4c5c909c60d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/video-analysis/PoseAnalyzer.tsx:716", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/video-analysis/PoseAnalyzer.tsx:716"}, "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-8592086b657f0fa9", "name": "Commented-code block (5 lines) in components/coach/video-analysis/pose-analyzer/calculate-joint-angles.ts:47", "shortDescription": {"text": "Commented-code block (5 lines) in components/coach/video-analysis/pose-analyzer/calculate-joint-angles.ts:47"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-083fec5c6b789fa0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/team-calendar/EditEventDialog.tsx:561", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/team-calendar/EditEventDialog.tsx:561"}, "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-919bfefda128e765", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/team-calendar/TeamCalendarView.tsx:297", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/team-calendar/TeamCalendarView.tsx:297"}, "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-4f5a9b75bac1754a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/team-calendar/CreateEventDialog.tsx:133", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/team-calendar/CreateEventDialog.tsx:133"}, "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-746b685a48e67a89", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/team-calendar/PlanTeamWorkoutDialog.tsx:183", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/team-calendar/PlanTeamWorkoutDialog.tsx:183"}, "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-c48d0490d0b9987d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/calculators/VDOTCalculator.tsx:68", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/calculators/VDOTCalculator.tsx: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-0c94850de20b20ef", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/cross-training/SubstitutionSchedule.tsx:49", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/cross-training/SubstitutionSchedule.tsx: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-d3999c1796bde601", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/cross-training/FitnessProjection.tsx:53", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/cross-training/FitnessProjection.tsx:53"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4aa81f4b0376b73f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/cross-training/ModalityPreferences.tsx:43", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/cross-training/ModalityPreferences.tsx:43"}, "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-7198f24ccfd23266", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/goal-based/GoalZoneWizard.tsx:151", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/goal-based/GoalZoneWizard.tsx:151"}, "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-eb4ec3df807e3903", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/sport-views/HockeyAthleteView.tsx:756", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/sport-views/HockeyAthleteView.tsx:756"}, "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-327e7c8f18e35542", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/sport-views/ErgometerAthleteView.tsx:137", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/sport-views/ErgometerAthleteView.tsx:137"}, "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-efb95acd8332e365", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/ChangeSportDialog.tsx:112", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/ChangeSportDialog.tsx:112"}, "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-a05c9164ae1d64e2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/VBTUploadWidget.tsx:130", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/VBTUploadWidget.tsx:130"}, "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-635b5f44a9255b07", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/MorningBriefingCard.tsx:69", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/MorningBriefingCard.tsx: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-23b248ceddeee79e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/AgilityWorkoutExecution.tsx:185", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/AgilityWorkoutExecution.tsx:185"}, "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-7832b1ec0db456e0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/PostWorkoutCheckCard.tsx:97", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/PostWorkoutCheckCard.tsx:97"}, "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-1ab983e7a34c0b93", "name": "Commented-code block (5 lines) in components/athlete/AthleteTestProfileCard.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in components/athlete/AthleteTestProfileCard.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-a553dad0c1987096", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/ErgometerDashboard.tsx:208", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/ErgometerDashboard.tsx:208"}, "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-1b2ecc064f128fcc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/PreWorkoutNudgeCard.tsx:70", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/PreWorkoutNudgeCard.tsx:70"}, "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-a642332dd52cbc15", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/PatternAlertCard.tsx:90", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/PatternAlertCard.tsx:90"}, "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-b15646b482c2c943", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/MilestoneCelebrationCard.tsx:78", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/MilestoneCelebrationCard.tsx:78"}, "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-fa41ba56af8b06c1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/DailyCheckInForm.tsx:312", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/DailyCheckInForm.tsx:312"}, "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-48a55fadbe9d5c4c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/RacePredictionWidget.tsx:155", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/RacePredictionWidget.tsx:155"}, "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-a93a3d0875fed5aa", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/WorkoutLoggingForm.tsx:240", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/WorkoutLoggingForm.tsx:240"}, "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-b4c30fceecf6ddce", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/workout/HeadlessVoiceCoach.tsx:50", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/workout/HeadlessVoiceCoach.tsx: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-cf9a207e92d54ed8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/workout/WorkoutFocusMode.tsx:188", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/workout/WorkoutFocusMode.tsx:188"}, "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-2c4c7a9d717d57da", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/workout/FocusModeWorkout.tsx:368", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/workout/FocusModeWorkout.tsx:368"}, "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-346e44536a616dea", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/workout/NewProgramDialog.tsx:93", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/workout/NewProgramDialog.tsx:93"}, "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-f7f73365e7a1ccf0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/settings/MacroSplitEditor.tsx:281", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/settings/MacroSplitEditor.tsx:281"}, "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-0f6304cff6b6c005", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/settings/AIContextSettings.tsx:267", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/settings/AIContextSettings.tsx:267"}, "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-e925b4b9cfc468fb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/adhoc/VoiceCapture.tsx:188", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/adhoc/VoiceCapture.tsx:188"}, "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-fd4e28bab13041f2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/adhoc/PhotoCapture.tsx:94", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/adhoc/PhotoCapture.tsx:94"}, "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-cca96519e629dd97", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/ai/MemoryIndicator.tsx:80", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/ai/MemoryIndicator.tsx:80"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e79a2a61cf21e942", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/ai/AthleteFloatingChat.tsx:634", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/ai/AthleteFloatingChat.tsx:634"}, "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-85b6706354482955", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/ai/useAthleteChatVoice.ts:576", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/ai/useAthleteChatVoice.ts:576"}, "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-3cf1f69069a70717", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/shareable/ShareAchievementButton.tsx:102", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/shareable/ShareAchievementButton.tsx:102"}, "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-71faa1697f0d65f8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/cardio/AthleteCardioClient.tsx:283", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/cardio/AthleteCardioClient.tsx:283"}, "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-5d0cd34843f31cc4", "name": "Commented-code block (7 lines) in components/athlete/cardio/IntervalTimer.tsx:189", "shortDescription": {"text": "Commented-code block (7 lines) in components/athlete/cardio/IntervalTimer.tsx:189"}, "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-64037215618529e8", "name": "Commented-code block (5 lines) in components/athlete/cardio/CardioFocusModeWorkout.tsx:220", "shortDescription": {"text": "Commented-code block (5 lines) in components/athlete/cardio/CardioFocusModeWorkout.tsx:220"}, "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-69a8e380a028253a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/hybrid/HybridWorkoutDetail.tsx:624", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/hybrid/HybridWorkoutDetail.tsx:624"}, "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-d652050ba7d6c085", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/dashboard/AccountabilityStreakWidget.tsx:32", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/dashboard/AccountabilityStreakWidget.tsx:32"}, "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-c5851364a4c232aa", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/agent/AgentRecommendationsPanel.tsx:73", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/agent/AgentRecommendationsPanel.tsx:73"}, "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-8602c4aed5f5e028", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/pacing/RacePacingCard.tsx:184", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/pacing/RacePacingCard.tsx:184"}, "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-ea3b7dd09615cb10", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/interval-results/IntervalResultsHistory.tsx:82", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/interval-results/IntervalResultsHistory.tsx:82"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9b123f1130464e03", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/audio-journal/AudioRecorder.tsx:309", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/audio-journal/AudioRecorder.tsx:309"}, "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-d3926ffdf6f58cd6", "name": "Commented-code block (5 lines) in components/athlete/strength/StrengthFocusMode.tsx:149", "shortDescription": {"text": "Commented-code block (5 lines) in components/athlete/strength/StrengthFocusMode.tsx:149"}, "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-9b1c539da633a478", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/strength/StrengthFocusMode.tsx:505", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/strength/StrengthFocusMode.tsx:505"}, "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-b6205f25f3f3262d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/strength/StrengthTemplateSelector.tsx:121", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/strength/StrengthTemplateSelector.tsx: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-430bef2f38243dde", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/nutrition/VoiceMealCapture.tsx:71", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/nutrition/VoiceMealCapture.tsx:71"}, "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-73dc575e22012aab", "name": "Commented-code block (5 lines) in components/athlete/nutrition/QuickMealLog.tsx:464", "shortDescription": {"text": "Commented-code block (5 lines) in components/athlete/nutrition/QuickMealLog.tsx:464"}, "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-73442c0166731a36", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/nutrition/QuickMealLog.tsx:424", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/nutrition/QuickMealLog.tsx:424"}, "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-b7afc6ea33441d18", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/nutrition/DailyNutritionCard.tsx:239", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/nutrition/DailyNutritionCard.tsx:239"}, "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-9829d856dab0b52d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/browse-workouts/BrowseWorkoutsClient.tsx:56", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/browse-workouts/BrowseWorkoutsClient.tsx:56"}, "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-607242f4b795272d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/video/AthleteVideoUploader.tsx:243", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/video/AthleteVideoUploader.tsx:243"}, "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-1ca3c3764d21522f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/injury-prevention/InjuryPreventionDashboard.tsx:66", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/injury-prevention/InjuryPreventionDashboard.tsx:66"}, "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-bcd439fa48c1ba17", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/injury-prevention/InjuryPreventionWidget.tsx:70", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/injury-prevention/InjuryPreventionWidget.tsx:70"}, "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-2c0978f01fc50672", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/strength/MuscleGroupDashboard.tsx:96", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/strength/MuscleGroupDashboard.tsx:96"}, "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-ea7bc7e07b1daf1a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/onboarding/OnboardingWizard.tsx:362", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/onboarding/OnboardingWizard.tsx:362"}, "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-dfa062cc00679aa9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/auto-optimize/AutoOptimizeDashboard.tsx:269", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/auto-optimize/AutoOptimizeDashboard.tsx:269"}, "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-024ada8e55488a8e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/reports/EmailReportButton.tsx:82", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/reports/EmailReportButton.tsx:82"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a90d3aa9231716bc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/documents/DocumentUploader.tsx:46", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/documents/DocumentUploader.tsx:46"}, "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-21bc0a240972722c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/physio/AcuteReportDetailClient.tsx:272", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/physio/AcuteReportDetailClient.tsx:272"}, "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-ea820466e73eff69", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/physio/AcuteReportsClient.tsx:151", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/physio/AcuteReportsClient.tsx:151"}, "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-31c68e8be3208fb6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/coaches/CoachDirectoryClient.tsx:93", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coaches/CoachDirectoryClient.tsx:93"}, "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-295f6af93b0caaba", "name": "Commented-code block (5 lines) in components/nutrition/FoodPhotoScanner.test.tsx:79", "shortDescription": {"text": "Commented-code block (5 lines) in components/nutrition/FoodPhotoScanner.test.tsx:79"}, "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-001b9811ffc5116c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/nutrition/NutritionDashboard.tsx:116", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/nutrition/NutritionDashboard.tsx:116"}, "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-80fbd4b93d42c667", "name": "Commented-code block (5 lines) in components/nutrition/FoodPhotoScanner.tsx:285", "shortDescription": {"text": "Commented-code block (5 lines) in components/nutrition/FoodPhotoScanner.tsx:285"}, "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-a6d28dab7f24bf58", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/nutrition/FoodPhotoScanner.tsx:661", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/nutrition/FoodPhotoScanner.tsx:661"}, "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-9a380b0fabf890a8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/nutrition/FoodHistoryPage.tsx:142", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/nutrition/FoodHistoryPage.tsx:142"}, "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-f1fb04dde42ff493", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/nutrition/wrapped/NutritionWrappedPage.tsx:126", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/nutrition/wrapped/NutritionWrappedPage.tsx:126"}, "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-b74b5820ba94ed4b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/hybrid-studio/HybridWorkoutBuilder.tsx:476", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/hybrid-studio/HybridWorkoutBuilder.tsx:476"}, "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-4d9b5e6ef3ef3124", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/hybrid-studio/WorkoutAssignmentDialog.tsx:168", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/hybrid-studio/WorkoutAssignmentDialog.tsx:168"}, "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-1577afa5344845e6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/hybrid-studio/HybridStudioClient.tsx:448", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/hybrid-studio/HybridStudioClient.tsx:448"}, "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-f8fb91f2faa2365d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/calendar/UnifiedCalendar.tsx:61", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/calendar/UnifiedCalendar.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-9df8e507a5b87691", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/calendar/CalendarAssignDialog.tsx:131", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/calendar/CalendarAssignDialog.tsx:131"}, "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-d1e5c5c6d22e9626", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/calendar/CalendarWorkoutDetailSheet.tsx:273", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/calendar/CalendarWorkoutDetailSheet.tsx:273"}, "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-0d2103b0ec288488", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/calendar/NotificationsPanel.tsx:50", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/calendar/NotificationsPanel.tsx: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-15590bf350ce7a2a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/calendar/EventFormDialog.tsx:208", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/calendar/EventFormDialog.tsx:208"}, "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-ba481758d6cd3268", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/calendar/day-sidebar/detail-panels/workout.tsx:133", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/calendar/day-sidebar/detail-panels/workout.tsx:133"}, "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-313a98e82c090cc9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/feedback/BetaFeedbackWidget.tsx:219", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/feedback/BetaFeedbackWidget.tsx:219"}, "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-2e31be61a1a0f3d5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/forms/TestDataForm.tsx:280", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/forms/TestDataForm.tsx:280"}, "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-ebdb0b65e1a5b118", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/workouts/CardioWorkoutPreview.tsx:297", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/workouts/CardioWorkoutPreview.tsx:297"}, "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-a5d54025caf5b90c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/workouts/StrengthWorkoutPreview.tsx:83", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/workouts/StrengthWorkoutPreview.tsx:83"}, "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-41dec72d1ae853be", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/workouts/AgilityWorkoutPreview.tsx:152", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/workouts/AgilityWorkoutPreview.tsx:152"}, "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-f343b6cc681a231b", "name": "Commented-code block (5 lines) in components/workouts/import/ImportWorkoutDialog.tsx:392", "shortDescription": {"text": "Commented-code block (5 lines) in components/workouts/import/ImportWorkoutDialog.tsx:392"}, "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-aa931edb90c21d9d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/workouts/import/ImportWorkoutDialog.tsx:303", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/workouts/import/ImportWorkoutDialog.tsx:303"}, "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-6cd140990bcd0ebe", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/settings/api-keys/route.ts:194", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/settings/api-keys/route.ts:194"}, "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-3d7ec77317ee423f", "name": "Commented-code block (5 lines) in app/api/settings/default-model/route.ts:96", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/settings/default-model/route.ts:96"}, "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-a73f7d90d5ca3a79", "name": "Commented-code block (5 lines) in app/api/ai/food-scan/recipe/route.ts:50", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/ai/food-scan/recipe/route.ts:50"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1504616ea804ee92", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/ai/chat/realtime-call/route.ts:473", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/ai/chat/realtime-call/route.ts:473"}, "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-29e8e58eeedacb13", "name": "Commented-code block (5 lines) in app/api/ai/test-import/route.ts:486", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/ai/test-import/route.ts:486"}, "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-55a212e72fd61fc6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/auth/google/callback/route.ts:137", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/auth/google/callback/route.ts:137"}, "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-5f86f4d04d47c055", "name": "Commented-code block (5 lines) in app/api/auth/callback/route.ts:36", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/auth/callback/route.ts: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-b23397be1a07fc90", "name": "Commented-code block (5 lines) in app/api/strength-pr/from-set/route.ts:128", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/strength-pr/from-set/route.ts:128"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-632a6e242da82b03", "name": "Legacy-named symbol `embedding_v2` in app/api/admin/ai-skills/audit/route.ts:55", "shortDescription": {"text": "Legacy-named symbol `embedding_v2` in app/api/admin/ai-skills/audit/route.ts:55"}, "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-948ae9feaa8ebc5e", "name": "Commented-code block (5 lines) in app/api/programs/import-parse/route.ts:62", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/programs/import-parse/route.ts:62"}, "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-96c30ee75bf301cd", "name": "Commented-code block (7 lines) in app/api/exports/program-pdf/route.ts:75", "shortDescription": {"text": "Commented-code block (7 lines) in app/api/exports/program-pdf/route.ts:75"}, "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-3ec3428eaa83f562", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/coach/admin/ai-keys/route.ts:125", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/coach/admin/ai-keys/route.ts:125"}, "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-3558aff356c10809", "name": "Commented-code block (5 lines) in app/api/coach/admin/branding/custom-email-domain/route.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/coach/admin/branding/custom-email-domain/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-932c547e704f319e", "name": "Commented-code block (6 lines) in app/api/strength-sessions/[id]/focus-mode/route.ts:231", "shortDescription": {"text": "Commented-code block (6 lines) in app/api/strength-sessions/[id]/focus-mode/route.ts:231"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cc3c4ac1a530b91b", "name": "Commented-code block (9 lines) in app/api/webhooks/resend/route.ts:8", "shortDescription": {"text": "Commented-code block (9 lines) in app/api/webhooks/resend/route.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-a856770ff455a78b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/calendar/external/[id]/sync/route.ts:346", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/calendar/external/[id]/sync/route.ts:346"}, "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-72516e05dee9445b", "name": "Commented-code block (5 lines) in app/api/meals/[mealId]/route.ts:180", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/meals/[mealId]/route.ts:180"}, "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-141e0a77333d8258", "name": "Commented-code block (5 lines) in app/api/workouts/create/route.ts:78", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/workouts/create/route.ts:78"}, "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-39a52bc45120b6e9", "name": "Commented-code block (5 lines) in app/(business)/[businessSlug]/coach/referrals/page.tsx:84", "shortDescription": {"text": "Commented-code block (5 lines) in app/(business)/[businessSlug]/coach/referrals/page.tsx:84"}, "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-d17439119364f5a4", "name": "Commented-code block (5 lines) in app/(business)/[businessSlug]/coach/subscription/page.tsx:39", "shortDescription": {"text": "Commented-code block (5 lines) in app/(business)/[businessSlug]/coach/subscription/page.tsx:39"}, "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-62b56e3498e321ae", "name": "Commented-code block (5 lines) in app/(business)/[businessSlug]/coach/teams/[teamId]/page.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in app/(business)/[businessSlug]/coach/teams/[teamId]/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-4b32d61e414c5484", "name": "Commented-code block (7 lines) in app/(business)/[businessSlug]/coach/teams/[teamId]/uppfoljning/page.tsx:15", "shortDescription": {"text": "Commented-code block (7 lines) in app/(business)/[businessSlug]/coach/teams/[teamId]/uppfoljning/page.tsx:15"}, "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-b8a4b70649a6aa2d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(business)/[businessSlug]/physio/dashboard/page.tsx:76", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(business)/[businessSlug]/physio/dashboard/page.tsx: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-db817fc19b032f8a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(business)/[businessSlug]/physio/athletes/page.tsx:87", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(business)/[businessSlug]/physio/athletes/page.tsx:87"}, "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-378068667f4b327e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(business)/[businessSlug]/physio/messages/page.tsx:90", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(business)/[businessSlug]/physio/messages/page.tsx:90"}, "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-6b131776ea3fc767", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(business)/[businessSlug]/physio/rehab-programs/page.tsx:103", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(business)/[businessSlug]/physio/rehab-programs/page.tsx:103"}, "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-83bae32255e7c4ff", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(business)/[businessSlug]/physio/treatments/page.tsx:81", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(business)/[businessSlug]/physio/treatments/page.tsx:81"}, "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-ea29556a44d14ab9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/signup/coach/page.tsx:181", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/signup/coach/page.tsx:181"}, "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-8e9e4214425c7595", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/signup/physio/page.tsx:124", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/signup/physio/page.tsx:124"}, "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-940e87fb7681ab73", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/AdminDashboardClient.tsx:288", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/AdminDashboardClient.tsx:288"}, "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-64b0a7e81feec282", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/athlete/wod/[id]/page.tsx:132", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/athlete/wod/[id]/page.tsx:132"}, "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-3f8da05758324be8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/athlete/rehab/[id]/AthleteRehabProgram.tsx:253", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/athlete/rehab/[id]/AthleteRehabProgram.tsx:253"}, "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-cf774d46c3863d0f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/athlete/log-workout/text/page.tsx:56", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/athlete/log-workout/text/page.tsx:56"}, "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-a1d5befdf7e80c9a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/athlete/log-workout/voice/page.tsx:56", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/athlete/log-workout/voice/page.tsx:56"}, "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-250f5ea7aafb4c0a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/athlete/log-workout/photo/page.tsx:56", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/athlete/log-workout/photo/page.tsx:56"}, "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-a4a752511d89953d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/athlete/log-workout/manual/page.tsx:56", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/athlete/log-workout/manual/page.tsx:56"}, "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-5378e15bb7095d6e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/my/calendar/UnifiedCalendarClient.tsx:223", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/my/calendar/UnifiedCalendarClient.tsx:223"}, "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-f7dfbfe885d7e16e", "name": "Commented-code block (5 lines) in lib/integrations/vbt/calculations.ts:125", "shortDescription": {"text": "Commented-code block (5 lines) in lib/integrations/vbt/calculations.ts:125"}, "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-99eb45b81a205ce8", "name": "Commented-code block (5 lines) in lib/__tests__/sanitize.test.ts:122", "shortDescription": {"text": "Commented-code block (5 lines) in lib/__tests__/sanitize.test.ts:122"}, "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-7d3ec21f9b00626b", "name": "Commented-code block (5 lines) in lib/email/branding.ts:97", "shortDescription": {"text": "Commented-code block (5 lines) in lib/email/branding.ts:97"}, "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-7aeec70ef5ca7a40", "name": "Commented-code block (5 lines) in lib/email/branding.test.ts:67", "shortDescription": {"text": "Commented-code block (5 lines) in lib/email/branding.test.ts:67"}, "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-5194360cab59ee8d", "name": "Legacy-named symbol `embedding_v2` in lib/ai/embeddings.ts:8", "shortDescription": {"text": "Legacy-named symbol `embedding_v2` in lib/ai/embeddings.ts:8"}, "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-c261b51b509d8cc9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/ai/document-processor.ts:582", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/ai/document-processor.ts:582"}, "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-be8c425c25a5ad4a", "name": "Legacy-named symbol `embedding_v2` in lib/ai/knowledge-skills.ts:402", "shortDescription": {"text": "Legacy-named symbol `embedding_v2` in lib/ai/knowledge-skills.ts:402"}, "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-4f24661072aa70b2", "name": "Commented-code block (6 lines) in lib/ai/user-ai-config.ts:118", "shortDescription": {"text": "Commented-code block (6 lines) in lib/ai/user-ai-config.ts:118"}, "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-a41790f74ebf91cc", "name": "Legacy-named symbol `embedding_v2` in lib/ai/__tests__/knowledge-skills.test.ts:23", "shortDescription": {"text": "Legacy-named symbol `embedding_v2` in lib/ai/__tests__/knowledge-skills.test.ts:23"}, "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-907eebaad5aa4c9e", "name": "Commented-code block (5 lines) in lib/managed-agents/agent-client.ts:466", "shortDescription": {"text": "Commented-code block (5 lines) in lib/managed-agents/agent-client.ts:466"}, "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-ccef0e7154cdbbcd", "name": "Legacy-named symbol `daysOld` in lib/athlete-profile/freshness-calculator.ts:17", "shortDescription": {"text": "Legacy-named symbol `daysOld` in lib/athlete-profile/freshness-calculator.ts:17"}, "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-faeb1d09d6bbaf04", "name": "Commented-code block (5 lines) in lib/operator-agents/job-queue.ts:93", "shortDescription": {"text": "Commented-code block (5 lines) in lib/operator-agents/job-queue.ts:93"}, "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-b785682eb398ff42", "name": "Legacy-named symbol `tooOld` in lib/operator-agents/tools/data-quality.ts:78", "shortDescription": {"text": "Legacy-named symbol `tooOld` in lib/operator-agents/tools/data-quality.ts:78"}, "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-0c46b39b9db28d61", "name": "Commented-code block (6 lines) in lib/chat/push.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in lib/chat/push.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-29cd61eae0c57067", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/chat/push.ts:75", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/chat/push.ts:75"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5a5ac3edce293ca9", "name": "Commented-code block (6 lines) in lib/chat/membership.ts:7", "shortDescription": {"text": "Commented-code block (6 lines) in lib/chat/membership.ts:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b2a6ed42d2ba9b3b", "name": "Commented-code block (6 lines) in lib/training-engine/index.ts:129", "shortDescription": {"text": "Commented-code block (6 lines) in lib/training-engine/index.ts:129"}, "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-cfad0a375e70fa01", "name": "Commented-code block (5 lines) in lib/training-engine/monitoring/synced-strength-fatigue.ts:146", "shortDescription": {"text": "Commented-code block (5 lines) in lib/training-engine/monitoring/synced-strength-fatigue.ts:146"}, "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-69eaae93d4dd4186", "name": "Commented-code block (5 lines) in lib/training-engine/progression/setlog-rollup.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in lib/training-engine/progression/setlog-rollup.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-22a1922c90665222", "name": "Commented-code block (5 lines) in lib/nutrition-timing/index.ts:137", "shortDescription": {"text": "Commented-code block (5 lines) in lib/nutrition-timing/index.ts:137"}, "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-ca613e941d0c1dca", "name": "Commented-code block (6 lines) in lib/strength/last-performance.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in lib/strength/last-performance.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-0d36dc98d2c19b14", "name": "Commented-code block (6 lines) in lib/calculations/goal-estimation.ts:330", "shortDescription": {"text": "Commented-code block (6 lines) in lib/calculations/goal-estimation.ts:330"}, "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-610b3ee57d253e78", "name": "Commented-code block (6 lines) in lib/calculations/thresholds.ts:1059", "shortDescription": {"text": "Commented-code block (6 lines) in lib/calculations/thresholds.ts:1059"}, "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-f92bc985cf5f4ee5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/team-calendar/use-team-calendar-workout-link.ts:30", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/team-calendar/use-team-calendar-workout-link.ts:30"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-db2bdbd2421ad574", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/slack/github-code-tools.ts:29", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/slack/github-code-tools.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-243c05ee0db40f6b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 hooks/use-live-power-push.ts:72", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 hooks/use-live-power-push.ts:72"}, "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-9e1b3489c5f3e70c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 hooks/use-live-voice-coach.ts:458", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 hooks/use-live-voice-coach.ts:458"}, "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-cf83263767206b79", "name": "102 env vars used in code but missing from .env.example", "shortDescription": {"text": "102 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ADMIN_NOTIFICATION_EMAIL`, `AI_BILLING_SEK_PER_USD`, `ANTHROPIC_API_KEY`, `API_KEY_ENCRYPTION_KEY`, `CI`, `CONCEPT2_CLIENT_ID`, `CONCEPT2_CLIENT_SECRET`, `CONCEPT2_USE_DEV_SERVER` + 94 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/20366"}, "properties": {"repository": "Stormrider66/Konditionsapp", "repoUrl": "https://github.com/Stormrider66/Konditionsapp", "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-891fac1fbed43721", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-skelleftea-hockey-demo.ts:773"}, "properties": {"repobilityId": "1b003ab6211a84e0", "scanner": "scanner-primary", "fingerprint": "891fac1fbed43721", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bf6594422cbcbe45", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/prepare-ai-billing-smoke.ts:168"}, "properties": {"repobilityId": "879e3bcbc1f46609", "scanner": "scanner-primary", "fingerprint": "bf6594422cbcbe45", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5f8002352a6dee21", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate-solo-pros-to-personal-business.ts:46"}, "properties": {"repobilityId": "b025d067de45fda2", "scanner": "scanner-primary", "fingerprint": "5f8002352a6dee21", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6484e0b92196736b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-program-generation.ts:117"}, "properties": {"repobilityId": "e4e41efeb1e57761", "scanner": "scanner-primary", "fingerprint": "6484e0b92196736b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8fd3dff2100fe485", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-briefing.ts:157"}, "properties": {"repobilityId": "bca301eb3cdea852", "scanner": "scanner-primary", "fingerprint": "8fd3dff2100fe485", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cd9b807bed4da78d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/embed-training-docs.ts:93"}, "properties": {"repobilityId": "7ad81214b7965793", "scanner": "scanner-primary", "fingerprint": "cd9b807bed4da78d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ca1d75903777b8d5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/verify-percent-resolution.ts:23"}, "properties": {"repobilityId": "933ff2770d31056e", "scanner": "scanner-primary", "fingerprint": "ca1d75903777b8d5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-88b3feb138fb02f9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-knowledge-base.ts:77"}, "properties": {"repobilityId": "15ac28939177e539", "scanner": "scanner-primary", "fingerprint": "88b3feb138fb02f9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-51fb9189d93f7944", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-milestone-detection.ts:33"}, "properties": {"repobilityId": "1f0fa1595e68d1de", "scanner": "scanner-primary", "fingerprint": "51fb9189d93f7944", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5a59efc93223e4f7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-pattern-detection.ts:273"}, "properties": {"repobilityId": "a1f97e730bff70f5", "scanner": "scanner-primary", "fingerprint": "5a59efc93223e4f7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8b1cc940ef98fde6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-exercise-images.ts:25"}, "properties": {"repobilityId": "88b4cf7fab9ae1b9", "scanner": "scanner-primary", "fingerprint": "8b1cc940ef98fde6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2cc8fad89a2083c2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-ai-models.ts:152"}, "properties": {"repobilityId": "99f3866acc25c749", "scanner": "scanner-primary", "fingerprint": "2cc8fad89a2083c2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6c5dc8e891ef166a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diagnose-program.ts:5"}, "properties": {"repobilityId": "f7a7a8b7fcc6c22c", "scanner": "scanner-primary", "fingerprint": "6c5dc8e891ef166a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d75ad9407a6cdc5d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-data.ts:5"}, "properties": {"repobilityId": "e60dd9ee8f3d4c36", "scanner": "scanner-primary", "fingerprint": "d75ad9407a6cdc5d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-78d628c246cb3605", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/setup-star-by-th.ts:91"}, "properties": {"repobilityId": "84936af3b3c1c598", "scanner": "scanner-primary", "fingerprint": "78d628c246cb3605", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6c002a633f377ee9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/plan-exercise-image-rollout.ts:306"}, "properties": {"repobilityId": "debfaf3435fee143", "scanner": "scanner-primary", "fingerprint": "6c002a633f377ee9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-85929085c8ec37a8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/update-emails.ts:13"}, "properties": {"repobilityId": "60146a93c24de262", "scanner": "scanner-primary", "fingerprint": "85929085c8ec37a8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2c1cf84b34272f08", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-segment-duration.ts:128"}, "properties": {"repobilityId": "6971aa7db8ed092d", "scanner": "scanner-primary", "fingerprint": "2c1cf84b34272f08", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cac46d27c3a1b420", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-latest-program.ts:5"}, "properties": {"repobilityId": "5e70d0e623e0fb90", "scanner": "scanner-primary", "fingerprint": "cac46d27c3a1b420", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-101dc925bea099f5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-exercises-fast.ts:37"}, "properties": {"repobilityId": "35e4458162ffdc9c", "scanner": "scanner-primary", "fingerprint": "101dc925bea099f5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-842d934d2e948b00", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-post-workout-checkin.ts:81"}, "properties": {"repobilityId": "93f7ca84c3dd135c", "scanner": "scanner-primary", "fingerprint": "842d934d2e948b00", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cef52378beafe8bb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/cleanup-orphan-workout-calendar-events.ts:34"}, "properties": {"repobilityId": "bb8e2d750601a34a", "scanner": "scanner-primary", "fingerprint": "cef52378beafe8bb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f0a53c2968b79f2e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/cleanup-strength-studio-exercises.ts:201"}, "properties": {"repobilityId": "1590241b287169c4", "scanner": "scanner-primary", "fingerprint": "f0a53c2968b79f2e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-70be3cfd4d910cf9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-e2e-program-generation.ts:13"}, "properties": {"repobilityId": "4f5063bdc513725c", "scanner": "scanner-primary", "fingerprint": "70be3cfd4d910cf9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-38377d06db3f10f5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/update-burpee-sequence.ts:24"}, "properties": {"repobilityId": "011ac56d2896c820", "scanner": "scanner-primary", "fingerprint": "38377d06db3f10f5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-14c386cb38caf3b5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/audit-solo-pros.ts:51"}, "properties": {"repobilityId": "a7fde14f84e1dbe5", "scanner": "scanner-primary", "fingerprint": "14c386cb38caf3b5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e8e96b5ca6c60d7e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/verify-team-chat.ts:20"}, "properties": {"repobilityId": "d869cd7d2e49a31a", "scanner": "scanner-primary", "fingerprint": "e8e96b5ca6c60d7e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-dbea3bff76592b55", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-hockey-movement-library.ts:622"}, "properties": {"repobilityId": "606c3a45867a6053", "scanner": "scanner-primary", "fingerprint": "dbea3bff76592b55", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-11b9e06fd30aacb9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/pilot-openai-exercise-images.ts:178"}, "properties": {"repobilityId": "a97483c55d2425f3", "scanner": "scanner-primary", "fingerprint": "11b9e06fd30aacb9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-569bae1c974fc4f0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-testers.ts:10"}, "properties": {"repobilityId": "4173ab4dae4e61c3", "scanner": "scanner-primary", "fingerprint": "569bae1c974fc4f0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b8dc8df71e897f48", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/import-google-billing.ts:25"}, "properties": {"repobilityId": "24faab99ed6ad36d", "scanner": "scanner-primary", "fingerprint": "b8dc8df71e897f48", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-189e86d2fa5f9a8b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/audit-legacy-routes.ts:163"}, "properties": {"repobilityId": "a8d33b6aac1c5b80", "scanner": "scanner-primary", "fingerprint": "189e86d2fa5f9a8b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ca95e5fb40310300", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-training-load.ts:12"}, "properties": {"repobilityId": "22ba460e9a74b57b", "scanner": "scanner-primary", "fingerprint": "ca95e5fb40310300", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9d322d51436b72fa", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/qa-hockey-cockpit.ts:199"}, "properties": {"repobilityId": "d57d02ee2e800c98", "scanner": "scanner-primary", "fingerprint": "9d322d51436b72fa", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-84b9ae61cd6e7f43", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/simple-test.ts:2"}, "properties": {"repobilityId": "ab2f838cb40a605e", "scanner": "scanner-primary", "fingerprint": "84b9ae61cd6e7f43", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a1ce24477299eee5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/pilot-openai-exercise-images-v2.ts:193"}, "properties": {"repobilityId": "73a2f2ee629e2779", "scanner": "scanner-primary", "fingerprint": "a1ce24477299eee5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c74f99c186b87980", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/cleanup-skelleftea-ateam-mock-tests.ts:111"}, "properties": {"repobilityId": "e9dcb6fd5c5dbcc6", "scanner": "scanner-primary", "fingerprint": "c74f99c186b87980", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-46abc2e2ceb286ab", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/debug-upcoming.ts:8"}, "properties": {"repobilityId": "5b5337d20b6ac94a", "scanner": "scanner-primary", "fingerprint": "46abc2e2ceb286ab", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-aa4786d18d458a77", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-coach-alerts.ts:16"}, "properties": {"repobilityId": "dc4e0297a0ee809e", "scanner": "scanner-primary", "fingerprint": "aa4786d18d458a77", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-47ae0a338a13b7dc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/create-athlete-for-client.ts:14"}, "properties": {"repobilityId": "7f2432fcb39a33a2", "scanner": "scanner-primary", "fingerprint": "47ae0a338a13b7dc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c7322451b18e02b8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/build-exercise-image-frame-prompts.ts:1229"}, "properties": {"repobilityId": "4863478f35df7c5a", "scanner": "scanner-primary", "fingerprint": "c7322451b18e02b8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1d906e7fb34a98b6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-multi-sport-generator.ts:485"}, "properties": {"repobilityId": "0636c218f40e47e5", "scanner": "scanner-primary", "fingerprint": "1d906e7fb34a98b6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-393aac0e23a31a5c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/repair-star-auth-links-safe.ts:537"}, "properties": {"repobilityId": "122969dc30044dac", "scanner": "scanner-primary", "fingerprint": "393aac0e23a31a5c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-686262519e9ab9a0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-comprehensive-program-generation.ts:63"}, "properties": {"repobilityId": "e8688594db583917", "scanner": "scanner-primary", "fingerprint": "686262519e9ab9a0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-775f5bb499130f8a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/setup-skelleftea-pilot.ts:148"}, "properties": {"repobilityId": "fe1cabe86e900cd4", "scanner": "scanner-primary", "fingerprint": "775f5bb499130f8a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e77d2c097630931f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/upload-exercise-images.ts:315"}, "properties": {"repobilityId": "c7c070a99d55f8f7", "scanner": "scanner-primary", "fingerprint": "e77d2c097630931f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-239b733e5a8e0f59", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/enable-business-feature.ts:38"}, "properties": {"repobilityId": "ab6d725d600c28b6", "scanner": "scanner-primary", "fingerprint": "239b733e5a8e0f59", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5780a27b51f52ff9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/add-all-members.ts:13"}, "properties": {"repobilityId": "cb8579ac84eac0a8", "scanner": "scanner-primary", "fingerprint": "5780a27b51f52ff9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d8fabd8965d5fd8b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/qa-ai-billing.ts:234"}, "properties": {"repobilityId": "a29ec634b5e56a53", "scanner": "scanner-primary", "fingerprint": "d8fabd8965d5fd8b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-310214ac83a61b4b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/audit-orphan-tokens.ts:22"}, "properties": {"repobilityId": "5de04f9f12c989a4", "scanner": "scanner-primary", "fingerprint": "310214ac83a61b4b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ad709a48fb607171", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generate-barbell-sequences.ts:113"}, "properties": {"repobilityId": "1355cbfd294c43ed", "scanner": "scanner-primary", "fingerprint": "ad709a48fb607171", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-897eb8c3eb300be0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/create-mock-briefing.ts:9"}, "properties": {"repobilityId": "d54e20d7f1072f51", "scanner": "scanner-primary", "fingerprint": "897eb8c3eb300be0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-04d51d0bb48b8361", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-exercises.ts:8"}, "properties": {"repobilityId": "155e8e667f944145", "scanner": "scanner-primary", "fingerprint": "04d51d0bb48b8361", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-deb38d150a340f02", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/cleanup-duplicate-clients.ts:17"}, "properties": {"repobilityId": "0073e8e280ba9819", "scanner": "scanner-primary", "fingerprint": "deb38d150a340f02", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1b94846d551a589f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/setup-star-thomson-correct.ts:13"}, "properties": {"repobilityId": "81b7cf9a2f971ef0", "scanner": "scanner-primary", "fingerprint": "1b94846d551a589f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f86fb3596b22b39b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-hockey-knowledge-skill.ts:145"}, "properties": {"repobilityId": "4a931ce5fa4bdff2", "scanner": "scanner-primary", "fingerprint": "f86fb3596b22b39b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bc771c4959a60128", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-assignment-progression.ts:38"}, "properties": {"repobilityId": "1d6d38cc96a64dce", "scanner": "scanner-primary", "fingerprint": "bc771c4959a60128", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-071d1bb50be97f52", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/sync-user-ids-with-supabase.ts:57"}, "properties": {"repobilityId": "7fd645cac4cd35df", "scanner": "scanner-primary", "fingerprint": "071d1bb50be97f52", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4ffad5f09d45ce1d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-star-thomson.ts:6"}, "properties": {"repobilityId": "9ea0e6a7458b4d48", "scanner": "scanner-primary", "fingerprint": "4ffad5f09d45ce1d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e8f0e772770cee5f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/create-athlete-account.ts:10"}, "properties": {"repobilityId": "e82013ab60b5b9e2", "scanner": "scanner-primary", "fingerprint": "e8f0e772770cee5f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-121e8fa2187e0399", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-zone-calculations.ts:7"}, "properties": {"repobilityId": "272689d268ee387d", "scanner": "scanner-primary", "fingerprint": "121e8fa2187e0399", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6db42a66b29ea905", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/share-exercises-across-businesses.ts:24"}, "properties": {"repobilityId": "6098cc825ab1ad3c", "scanner": "scanner-primary", "fingerprint": "6db42a66b29ea905", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c283308870e188f7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/validate-calculations.ts:20"}, "properties": {"repobilityId": "e18f41d707fe499a", "scanner": "scanner-primary", "fingerprint": "c283308870e188f7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-37fcba8b62694f72", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/audit-athlete-integrity.ts:67"}, "properties": {"repobilityId": "57fd4f66059f7425", "scanner": "scanner-primary", "fingerprint": "37fcba8b62694f72", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9c723b5ecc6eb829", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-performance-analysis.ts:12"}, "properties": {"repobilityId": "252a25ad9a7c4aeb", "scanner": "scanner-primary", "fingerprint": "9c723b5ecc6eb829", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cd1331c9ae1c9aa6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate-embeddings-v2.ts:78"}, "properties": {"repobilityId": "ee1b948f790660fb", "scanner": "scanner-primary", "fingerprint": "cd1331c9ae1c9aa6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f4023f466c04ba5e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/import-livsmedelsverket.ts:122"}, "properties": {"repobilityId": "f3eec6ca271cf24c", "scanner": "scanner-primary", "fingerprint": "f4023f466c04ba5e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d2a1c4d7b8a77cd0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-training-engine.ts:15"}, "properties": {"repobilityId": "2fc27849c9974ffa", "scanner": "scanner-primary", "fingerprint": "d2a1c4d7b8a77cd0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-18700e3d02a77ddd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/sync-exercise-images.ts:396"}, "properties": {"repobilityId": "ff98b041fa9c8253", "scanner": "scanner-primary", "fingerprint": "18700e3d02a77ddd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-97bf8042f2a11d1f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-preworkout-nudge.ts:104"}, "properties": {"repobilityId": "951d7e322797244e", "scanner": "scanner-primary", "fingerprint": "97bf8042f2a11d1f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e78b3f4a16389f67", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/audit-rls-coverage.ts:170"}, "properties": {"repobilityId": "507993af65d36e6c", "scanner": "scanner-primary", "fingerprint": "e78b3f4a16389f67", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-91ea20c2221ad1c1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/qa-launch-config.ts:111"}, "properties": {"repobilityId": "136282496ae539ff", "scanner": "scanner-primary", "fingerprint": "91ea20c2221ad1c1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4bc731c173d224e2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-platform-help.ts:314"}, "properties": {"repobilityId": "5366d715415bf9b1", "scanner": "scanner-primary", "fingerprint": "4bc731c173d224e2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b300c5df61770701", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/configure-hockey-beta.ts:65"}, "properties": {"repobilityId": "32c0dc440c9c965b", "scanner": "scanner-primary", "fingerprint": "b300c5df61770701", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2900e8adc985d771", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/fix-star-thomson-auth.ts:66"}, "properties": {"repobilityId": "609b6470412f6b4d", "scanner": "scanner-primary", "fingerprint": "2900e8adc985d771", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-11e176757cabdb06", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/archive/test-cycling.js:91"}, "properties": {"repobilityId": "c9d72c2470d59155", "scanner": "scanner-primary", "fingerprint": "11e176757cabdb06", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-30930ff20e69e9b5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/dev/get-bearer-token.ts:65"}, "properties": {"repobilityId": "401e7bcb1a646c99", "scanner": "scanner-primary", "fingerprint": "30930ff20e69e9b5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8b3a83b00e2a06d3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed-ergometer-benchmarks.ts:649"}, "properties": {"repobilityId": "7d862325811c69ca", "scanner": "scanner-primary", "fingerprint": "8b3a83b00e2a06d3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8b0a08e2835da7d2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed-exercises.ts:1998"}, "properties": {"repobilityId": "9b1d2c17f346040c", "scanner": "scanner-primary", "fingerprint": "8b0a08e2835da7d2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-582f635447c2a7cf", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed-equipment.ts:507"}, "properties": {"repobilityId": "bed7535a4ac7b013", "scanner": "scanner-primary", "fingerprint": "582f635447c2a7cf", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4b7fed8a6e2c4f74", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed-rehab-exercises.ts:1072"}, "properties": {"repobilityId": "857f0255ed04f7f7", "scanner": "scanner-primary", "fingerprint": "4b7fed8a6e2c4f74", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4bca291ac92644b8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed-hybrid-movements.ts:1989"}, "properties": {"repobilityId": "f0fab4487b9d785c", "scanner": "scanner-primary", "fingerprint": "4bca291ac92644b8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e0bbd182f3d05907", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed-workout-templates.ts:1493"}, "properties": {"repobilityId": "2e511a21cfaaa505", "scanner": "scanner-primary", "fingerprint": "e0bbd182f3d05907", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c50c834bf793edbb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed-unified-exercises.ts:1380"}, "properties": {"repobilityId": "e4a37f2c151abac0", "scanner": "scanner-primary", "fingerprint": "c50c834bf793edbb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ebd1013369f24cb6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 prisma/check-exercises.ts:10"}, "properties": {"repobilityId": "0fd88228d11feac1", "scanner": "scanner-primary", "fingerprint": "ebd1013369f24cb6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-734634950805bac3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed-cardio-templates.ts:574"}, "properties": {"repobilityId": "e742b48c137b6c7e", "scanner": "scanner-primary", "fingerprint": "734634950805bac3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3103f7ef0f6ef1da", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 prisma/check-hybrid.ts:9"}, "properties": {"repobilityId": "63505ffee2e9ca76", "scanner": "scanner-primary", "fingerprint": "3103f7ef0f6ef1da", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-784ba531e3ad2732", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed-pricing.ts:12"}, "properties": {"repobilityId": "8546cc4d938f482e", "scanner": "scanner-primary", "fingerprint": "784ba531e3ad2732", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-464088f76b35fbcc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed-benchmark-workouts.ts:446"}, "properties": {"repobilityId": "908578643ec6ba3a", "scanner": "scanner-primary", "fingerprint": "464088f76b35fbcc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f397036962b7b7bc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed-agility-drills.ts:1777"}, "properties": {"repobilityId": "3299e8c86e02fd35", "scanner": "scanner-primary", "fingerprint": "f397036962b7b7bc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-68badcf7a86e3ee6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ai-canvas/AICanvasClient.tsx:1270"}, "properties": {"repobilityId": "bc702f68a9d36eaf", "scanner": "scanner-primary", "fingerprint": "68badcf7a86e3ee6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c83cd1e380f05a46", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ai-canvas/CanvasBlockView.tsx:319"}, "properties": {"repobilityId": "e78f9ad9dd027734", "scanner": "scanner-primary", "fingerprint": "c83cd1e380f05a46", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-af3d897c5a5edfbf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/client/ClientDetailTabs.tsx:90"}, "properties": {"repobilityId": "4a6173ae37346600", "scanner": "scanner-primary", "fingerprint": "af3d897c5a5edfbf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1d2bc3f18692ad57", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ai/AISkillPicker.tsx:340"}, "properties": {"repobilityId": "70bc3b115fdc5361", "scanner": "scanner-primary", "fingerprint": "1d2bc3f18692ad57", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7d94d829d5d06c83", "level": "note", "message": {"text": "\"active\" state uses light bg in a dark theme \u2014 components/navigation/MobileNav.tsx:411"}, "properties": {"repobilityId": "786deddb6434e681", "scanner": "scanner-primary", "fingerprint": "7d94d829d5d06c83", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.active-light-bg"]}}, {"ruleId": "scanner-8c55517bfd12dc55", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/navigation/UserNav.tsx:80"}, "properties": {"repobilityId": "83b91a548b27015f", "scanner": "scanner-primary", "fingerprint": "8c55517bfd12dc55", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c0da60652c5d065f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete-plans/AthletePlanSummaryCard.tsx:157"}, "properties": {"repobilityId": "3f596768d54d6861", "scanner": "scanner-primary", "fingerprint": "c0da60652c5d065f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9dbed9c835f9c66b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ai-studio/FloatingAIChat.tsx:1817"}, "properties": {"repobilityId": "ba689e9fcb22271b", "scanner": "scanner-primary", "fingerprint": "9dbed9c835f9c66b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e494a4ed3ab437ad", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ai-studio/ChatActionCard.tsx:162"}, "properties": {"repobilityId": "52c7ff18492dc64e", "scanner": "scanner-primary", "fingerprint": "e494a4ed3ab437ad", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ce620fa765cc7704", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ai-studio/ChatHistoryPanel.tsx:250"}, "properties": {"repobilityId": "1c3cd51a34719b58", "scanner": "scanner-primary", "fingerprint": "ce620fa765cc7704", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-729b5c655f1d2c78", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ai-studio/ContextPanel.tsx:852"}, "properties": {"repobilityId": "e54b4adea2a24fe6", "scanner": "scanner-primary", "fingerprint": "729b5c655f1d2c78", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b52cca50a9c6aabf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ai-studio/ModelSelector.tsx:208"}, "properties": {"repobilityId": "4005307c62fbf341", "scanner": "scanner-primary", "fingerprint": "b52cca50a9c6aabf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fd1045cd51c65157", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ai-studio/ChatNavigationCard.tsx:53"}, "properties": {"repobilityId": "a9fd34409c35fd01", "scanner": "scanner-primary", "fingerprint": "fd1045cd51c65157", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5b722575a05b0c4f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ai-studio/EnhancedProgramPreview.tsx:861"}, "properties": {"repobilityId": "04dc8f6d9e0de72b", "scanner": "scanner-primary", "fingerprint": "5b722575a05b0c4f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-967cd5c9f37a8a48", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ai-studio/ExercisePicker.tsx:220"}, "properties": {"repobilityId": "e13f76c519168391", "scanner": "scanner-primary", "fingerprint": "967cd5c9f37a8a48", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d3e0482c8266a761", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ai-studio/AIStudioClient.tsx:1184"}, "properties": {"repobilityId": "1f7c2d17d94fb6c9", "scanner": "scanner-primary", "fingerprint": "d3e0482c8266a761", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6ac7e72edeab30fc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/mva/MVAAnalysisClient.tsx:883"}, "properties": {"repobilityId": "f50abfea3ae800c0", "scanner": "scanner-primary", "fingerprint": "6ac7e72edeab30fc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a5af11e22a707241", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/mva/VariableSelector.tsx:348"}, "properties": {"repobilityId": "6703d039309c1e40", "scanner": "scanner-primary", "fingerprint": "a5af11e22a707241", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ee89cb834272d1bc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/admin/ApplicationReviewPanel.tsx:173"}, "properties": {"repobilityId": "6d815494d4eb686b", "scanner": "scanner-primary", "fingerprint": "ee89cb834272d1bc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fa1b764bb8d5a633", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/admin/monitoring/MetricsCharts.tsx:163"}, "properties": {"repobilityId": "a59799505ec6243e", "scanner": "scanner-primary", "fingerprint": "fa1b764bb8d5a633", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ec9a838c17b54067", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/admin/monitoring/LiveErrorStream.tsx:136"}, "properties": {"repobilityId": "ccef098e4b942f62", "scanner": "scanner-primary", "fingerprint": "ec9a838c17b54067", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d1f3defdde94e938", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/admin/data-health/AthleteIntegrityHealthPanel.tsx:260"}, "properties": {"repobilityId": "c9ed7b24b91df442", "scanner": "scanner-primary", "fingerprint": "d1f3defdde94e938", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fc760ad69b46502c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/admin/operator-agents/WeeklyReportsPanel.tsx:208"}, "properties": {"repobilityId": "5f4a70b830c57ada", "scanner": "scanner-primary", "fingerprint": "fc760ad69b46502c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-385b4405a27830bb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/admin/businesses/AIActionHistoryPanel.tsx:323"}, "properties": {"repobilityId": "b3b18680f6e0e7c7", "scanner": "scanner-primary", "fingerprint": "385b4405a27830bb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c840fec8c5d7b9cb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/admin/businesses/BusinessesTable.tsx:225"}, "properties": {"repobilityId": "81065c3e2310f50d", "scanner": "scanner-primary", "fingerprint": "c840fec8c5d7b9cb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-85739f919181433d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/programs/BundleAssignmentsDialog.tsx:226"}, "properties": {"repobilityId": "31c4d641f481280d", "scanner": "scanner-primary", "fingerprint": "85739f919181433d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b39e8fdc88cd8b69", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/programs/ProgramFuelingOverview.tsx:271"}, "properties": {"repobilityId": "1d5b20a9ecb0f57b", "scanner": "scanner-primary", "fingerprint": "b39e8fdc88cd8b69", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8cdc2e8beedb9285", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/programs/import/ExerciseAliasesClient.tsx:155"}, "properties": {"repobilityId": "2a820fe4257268e4", "scanner": "scanner-primary", "fingerprint": "8cdc2e8beedb9285", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c594f85d64ebfb78", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/programs/import/ImportProgramClient.tsx:556"}, "properties": {"repobilityId": "1664c2565fcbaf85", "scanner": "scanner-primary", "fingerprint": "c594f85d64ebfb78", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-19b3b4d453fbd64c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/programs/wizard/configuration-form/ProgramAudienceSelector.tsx:211"}, "properties": {"repobilityId": "2d5f69889370d598", "scanner": "scanner-primary", "fingerprint": "19b3b4d453fbd64c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-910bb9700fc77247", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/PendingCoachRequests.tsx:155"}, "properties": {"repobilityId": "e840ccef1b46c38f", "scanner": "scanner-primary", "fingerprint": "910bb9700fc77247", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ebf215554badcec6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/BusinessAthleteBrowser.tsx:146"}, "properties": {"repobilityId": "da8e714540205093", "scanner": "scanner-primary", "fingerprint": "ebf215554badcec6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-35d0220f97efd82d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/AthleteAttentionCard.tsx:366"}, "properties": {"repobilityId": "19cdb1612b60162d", "scanner": "scanner-primary", "fingerprint": "35d0220f97efd82d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a737cebeb4333b4b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/OrgSwitcher.tsx:94"}, "properties": {"repobilityId": "8f0c71442a636e81", "scanner": "scanner-primary", "fingerprint": "a737cebeb4333b4b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-630e89207da9c9d5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/competitions/CompetitionManager.tsx:362"}, "properties": {"repobilityId": "1b75365249de1865", "scanner": "scanner-primary", "fingerprint": "630e89207da9c9d5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d465de2d9a759f0c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/referrals/ReferralDashboardClient.tsx:407"}, "properties": {"repobilityId": "9c958933bc95adc2", "scanner": "scanner-primary", "fingerprint": "d465de2d9a759f0c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4d67387faf6483ad", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/cardio/CardioSessionLibrary.tsx:367"}, "properties": {"repobilityId": "5cc2adce1a6e71ad", "scanner": "scanner-primary", "fingerprint": "4d67387faf6483ad", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-541bb73dad834190", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/cardio/CardioTemplateLibrary.tsx:426"}, "properties": {"repobilityId": "5e9b56b9b2ffd7af", "scanner": "scanner-primary", "fingerprint": "541bb73dad834190", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-38f6e68a03ab53fb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/cardio/AutoCardioDialog.tsx:526"}, "properties": {"repobilityId": "9dbe85728b026a4d", "scanner": "scanner-primary", "fingerprint": "38f6e68a03ab53fb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bea1dc5edcf76b88", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/cardio/CardioSessionAssignmentDialog.tsx:554"}, "properties": {"repobilityId": "389a039b284bb79c", "scanner": "scanner-primary", "fingerprint": "bea1dc5edcf76b88", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2dfffe617025137b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/exercise-library/ExerciseLibraryBrowser.tsx:407"}, "properties": {"repobilityId": "54b1126de589e3d8", "scanner": "scanner-primary", "fingerprint": "2dfffe617025137b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f8d264dfce7687f9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/TeamCoachActionDialog.tsx:214"}, "properties": {"repobilityId": "78d38f59a2920455", "scanner": "scanner-primary", "fingerprint": "f8d264dfce7687f9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-df11534e6143db2e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/GymClientListCard.tsx:118"}, "properties": {"repobilityId": "2f1e8b213f73c09f", "scanner": "scanner-primary", "fingerprint": "df11534e6143db2e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-95e541aaa96faa7c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/PTDashboardLayout.tsx:115"}, "properties": {"repobilityId": "89f284ae135fe33a", "scanner": "scanner-primary", "fingerprint": "95e541aaa96faa7c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7ac51e4121c05c3c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/DashboardStatCards.tsx:93"}, "properties": {"repobilityId": "a783cef3f8fb0e4b", "scanner": "scanner-primary", "fingerprint": "7ac51e4121c05c3c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a5e7e4f79a9dd4af", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/CoachCommandCenter.tsx:173"}, "properties": {"repobilityId": "b8dcaa412d9c2954", "scanner": "scanner-primary", "fingerprint": "a5e7e4f79a9dd4af", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-335c9937c0b4f2be", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/SocialMediaCard.tsx:246"}, "properties": {"repobilityId": "a7bd6f9592454682", "scanner": "scanner-primary", "fingerprint": "335c9937c0b4f2be", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-87d01193e298d3c4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/GymClientCard.tsx:122"}, "properties": {"repobilityId": "da94d9a897e3d7b4", "scanner": "scanner-primary", "fingerprint": "87d01193e298d3c4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8955afe03eb2cdc2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/TodaysAppointmentsCard.tsx:205"}, "properties": {"repobilityId": "08a96212d119dfdf", "scanner": "scanner-primary", "fingerprint": "8955afe03eb2cdc2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-30e7797bc8f4fc56", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/ClientStatusCard.tsx:170"}, "properties": {"repobilityId": "36aae52acc1ea986", "scanner": "scanner-primary", "fingerprint": "30e7797bc8f4fc56", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a63964c23e251dcf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/CompetitionCard.tsx:160"}, "properties": {"repobilityId": "5f40a230e16169e6", "scanner": "scanner-primary", "fingerprint": "a63964c23e251dcf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cf16038b7a2aa451", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/TeamQuickAccess.tsx:85"}, "properties": {"repobilityId": "43ba995d55d84d0b", "scanner": "scanner-primary", "fingerprint": "cf16038b7a2aa451", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3b35d5c37059b057", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/GymClassesCard.tsx:149"}, "properties": {"repobilityId": "ff36084a47d18758", "scanner": "scanner-primary", "fingerprint": "3b35d5c37059b057", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1b85d6202251c6d3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/TeamPulsePanel.tsx:113"}, "properties": {"repobilityId": "5c083d2e7d2b356d", "scanner": "scanner-primary", "fingerprint": "1b85d6202251c6d3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fd4df6fc34bdea45", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/AthleteDetailSheet.tsx:769"}, "properties": {"repobilityId": "515d6aac10aab80f", "scanner": "scanner-primary", "fingerprint": "fd4df6fc34bdea45", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-641dff9727c72bff", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/TeamTestsAndActivity.tsx:73"}, "properties": {"repobilityId": "9fbb13f3043bf631", "scanner": "scanner-primary", "fingerprint": "641dff9727c72bff", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b089b2a40a1471c4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/dashboard/TeamRosterGrid.tsx:258"}, "properties": {"repobilityId": "0fbfa58458ed2fcc", "scanner": "scanner-primary", "fingerprint": "b089b2a40a1471c4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-677d7d9eea4331a3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/team/WorkoutPickerField.tsx:234"}, "properties": {"repobilityId": "87fafa7ccb0187b6", "scanner": "scanner-primary", "fingerprint": "677d7d9eea4331a3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-105e97395dec02a1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/athlete-profile/AssessmentTimeline.tsx:201"}, "properties": {"repobilityId": "ad16b1e4339b3435", "scanner": "scanner-primary", "fingerprint": "105e97395dec02a1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e84d0bda639e2d3a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/athlete-profile/DevelopmentTab.tsx:198"}, "properties": {"repobilityId": "640617f191a881f3", "scanner": "scanner-primary", "fingerprint": "e84d0bda639e2d3a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-65288799d955f093", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/athlete-profile/ProfileTab.tsx:237"}, "properties": {"repobilityId": "5724e2d3c6a06cec", "scanner": "scanner-primary", "fingerprint": "65288799d955f093", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-05089c0e11005c30", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/athlete-profile/PlanningTab.tsx:114"}, "properties": {"repobilityId": "64490d2032733223", "scanner": "scanner-primary", "fingerprint": "05089c0e11005c30", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7d0642a9c90561e0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/athlete-profile/OverviewTab.tsx:123"}, "properties": {"repobilityId": "0db87069b9dcbfe2", "scanner": "scanner-primary", "fingerprint": "7d0642a9c90561e0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0db52075812d910d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/athlete-profile/RecurringExercises.tsx:86"}, "properties": {"repobilityId": "e8a7758058d3902b", "scanner": "scanner-primary", "fingerprint": "0db52075812d910d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-af0bbc1cbe544f82", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/athlete-profile/ui.tsx:52"}, "properties": {"repobilityId": "3ad3d327a52feb74", "scanner": "scanner-primary", "fingerprint": "af0bbc1cbe544f82", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cfa2e8699484f839", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/drills/InteractiveDrillEditor.tsx:1217"}, "properties": {"repobilityId": "8ebdb46b910587c5", "scanner": "scanner-primary", "fingerprint": "cfa2e8699484f839", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-084e7bc62828d42e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/drills/DrillList.tsx:296"}, "properties": {"repobilityId": "697bee7a22f82913", "scanner": "scanner-primary", "fingerprint": "084e7bc62828d42e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-853bd2e4929edbd6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/drills/DrillTemplateLibrary.tsx:108"}, "properties": {"repobilityId": "dbc1ad35bbf88532", "scanner": "scanner-primary", "fingerprint": "853bd2e4929edbd6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bc3a34ccf046dc30", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/drills/ClubDrillLibrary.tsx:263"}, "properties": {"repobilityId": "3fbe92fe708f549c", "scanner": "scanner-primary", "fingerprint": "bc3a34ccf046dc30", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-aa4680e435777095", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/teams/TeamKioskClient.tsx:147"}, "properties": {"repobilityId": "e183cc1bf2868fe0", "scanner": "scanner-primary", "fingerprint": "aa4680e435777095", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ce6a531b3ca0e266", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/teams/TeamTestManualEntryDialog.tsx:408"}, "properties": {"repobilityId": "6646c2b5cefecfec", "scanner": "scanner-primary", "fingerprint": "ce6a531b3ca0e266", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5b6212d9f0db0b31", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/teams/TeamPlayerDevelopment.tsx:149"}, "properties": {"repobilityId": "0563e9db91d54c66", "scanner": "scanner-primary", "fingerprint": "5b6212d9f0db0b31", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a98a0be5ff2dd896", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/teams/TeamTestProfile.tsx:238"}, "properties": {"repobilityId": "559f38d9a82b91d4", "scanner": "scanner-primary", "fingerprint": "a98a0be5ff2dd896", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-53758d81495713ab", "level": "note", "message": {"text": "\"active\" state uses light bg in a dark theme \u2014 components/coach/teams/TeamTestProfile.tsx:466"}, "properties": {"repobilityId": "a92d7772ff4e38cf", "scanner": "scanner-primary", "fingerprint": "53758d81495713ab", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.active-light-bg"]}}, {"ruleId": "scanner-c3103a0e572bec55", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/teams/AddPlayersDialog.tsx:299"}, "properties": {"repobilityId": "2a4deb41da3a29ed", "scanner": "scanner-primary", "fingerprint": "c3103a0e572bec55", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-70cbedafffd7cff0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/teams/TeamWorkoutMonitor.tsx:612"}, "properties": {"repobilityId": "bdfdbc876d7c3bd6", "scanner": "scanner-primary", "fingerprint": "70cbedafffd7cff0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b9e757bba6406f22", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/teams/TeamTestsClient.tsx:829"}, "properties": {"repobilityId": "1cde5d0a85662b75", "scanner": "scanner-primary", "fingerprint": "b9e757bba6406f22", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5c511fa170acbbe8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/teams/TeamTestImportDialog.tsx:473"}, "properties": {"repobilityId": "9db8b8c916f6e7b9", "scanner": "scanner-primary", "fingerprint": "5c511fa170acbbe8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1055f59657b61ef6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/teams/ImportRosterClient.tsx:388"}, "properties": {"repobilityId": "7325991bb7da3b87", "scanner": "scanner-primary", "fingerprint": "1055f59657b61ef6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-57d35b3ed2c8a3e1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/teams/TeamAnalysisClient.tsx:419"}, "properties": {"repobilityId": "972c090a834dbc47", "scanner": "scanner-primary", "fingerprint": "57d35b3ed2c8a3e1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9c363caa1fba73c3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/teams/kiosk/TeamKioskWorkoutPanel.tsx:193"}, "properties": {"repobilityId": "712bf2a33dd6a62f", "scanner": "scanner-primary", "fingerprint": "9c363caa1fba73c3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-89f314151ac2d540", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/teams/cockpit/TeamRosterRail.tsx:232"}, "properties": {"repobilityId": "921f667f0ffe24ee", "scanner": "scanner-primary", "fingerprint": "89f314151ac2d540", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3a6e662f59cf0789", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/teams/cockpit/TeamPhaseStrip.tsx:60"}, "properties": {"repobilityId": "91070f8c1f242f79", "scanner": "scanner-primary", "fingerprint": "3a6e662f59cf0789", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2aecfedd8a4b66e1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/teams/cockpit/TeamSchedulePane.tsx:377"}, "properties": {"repobilityId": "27741b3615580c60", "scanner": "scanner-primary", "fingerprint": "2aecfedd8a4b66e1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dfeebc38a7c9c137", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/interval-session/LactateEntryPanel.tsx:86"}, "properties": {"repobilityId": "c07b040d688e42a7", "scanner": "scanner-primary", "fingerprint": "dfeebc38a7c9c137", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d670a97f240c6b54", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/interval-session/IntervalSessionList.tsx:173"}, "properties": {"repobilityId": "09c70822052041df", "scanner": "scanner-primary", "fingerprint": "d670a97f240c6b54", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0a6e6ca10ba62d88", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/interval-session/IntervalSessionDashboard.tsx:229"}, "properties": {"repobilityId": "6ad721c39fd4a0b9", "scanner": "scanner-primary", "fingerprint": "0a6e6ca10ba62d88", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e21205be448dd6c7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/admin/BusinessCoachAssignmentsTab.tsx:325"}, "properties": {"repobilityId": "e6072ed78eaa004a", "scanner": "scanner-primary", "fingerprint": "e21205be448dd6c7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3bc096e17fd95bf6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/admin/CustomDomainSection.tsx:204"}, "properties": {"repobilityId": "6becddb382260b00", "scanner": "scanner-primary", "fingerprint": "3bc096e17fd95bf6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6d87306f6acdbe02", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/admin/BusinessAiBudgetsTab.tsx:223"}, "properties": {"repobilityId": "f1acd1b6bb2dbfc7", "scanner": "scanner-primary", "fingerprint": "6d87306f6acdbe02", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-35c652292297588d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/admin/CustomEmailDomainSection.tsx:254"}, "properties": {"repobilityId": "42377422a2b860eb", "scanner": "scanner-primary", "fingerprint": "35c652292297588d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-221714599f358596", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/live-hr/AthleteHRCard.tsx:91"}, "properties": {"repobilityId": "9cf7359ef00471a7", "scanner": "scanner-primary", "fingerprint": "221714599f358596", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a013fad1e7b6cebe", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/live-hr/SessionList.tsx:311"}, "properties": {"repobilityId": "446b3b608d240e2c", "scanner": "scanner-primary", "fingerprint": "a013fad1e7b6cebe", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-affd2d35d8db4a49", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/messages/MessagesClient.tsx:319"}, "properties": {"repobilityId": "ca5e657b441cdfd8", "scanner": "scanner-primary", "fingerprint": "affd2d35d8db4a49", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-76d31ec505b7fb27", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/strength/SortableExerciseItem.tsx:202"}, "properties": {"repobilityId": "85893876e21dbd19", "scanner": "scanner-primary", "fingerprint": "76d31ec505b7fb27", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2581c630a9247e7f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/strength/SessionBuilder.tsx:621"}, "properties": {"repobilityId": "b1089a105e02c661", "scanner": "scanner-primary", "fingerprint": "2581c630a9247e7f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1918584acb7bb4b2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/strength/StrengthPRTable.tsx:388"}, "properties": {"repobilityId": "df3ede00c99551cc", "scanner": "scanner-primary", "fingerprint": "1918584acb7bb4b2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-642cc4469aad6158", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/strength/StrengthSessionLibrary.tsx:560"}, "properties": {"repobilityId": "ff3c161495abe456", "scanner": "scanner-primary", "fingerprint": "642cc4469aad6158", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-012694eb96cc0b09", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/strength/SectionWorkoutBuilder.tsx:1398"}, "properties": {"repobilityId": "129fee1f800ba541", "scanner": "scanner-primary", "fingerprint": "012694eb96cc0b09", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-20226fc22d87e060", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/clients/ExternalAthleteAccessCard.tsx:306"}, "properties": {"repobilityId": "f197cc6c231afde4", "scanner": "scanner-primary", "fingerprint": "20226fc22d87e060", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8d4a2684fecb5f63", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/clients/ClientFuelingSummary.tsx:456"}, "properties": {"repobilityId": "a0cf16272ecda9ec", "scanner": "scanner-primary", "fingerprint": "8d4a2684fecb5f63", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c78bfa9b9faa65e6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/clients/RecentTestsCard.tsx:116"}, "properties": {"repobilityId": "195f4c8d71036163", "scanner": "scanner-primary", "fingerprint": "c78bfa9b9faa65e6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-24c5a82a5d5e8d1f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/video-analysis/VideoUploader.tsx:521"}, "properties": {"repobilityId": "9723ead8a62ed208", "scanner": "scanner-primary", "fingerprint": "24c5a82a5d5e8d1f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c07698356ca606a9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/team-calendar/EditEventDialog.tsx:956"}, "properties": {"repobilityId": "1082bd7e276fa415", "scanner": "scanner-primary", "fingerprint": "c07698356ca606a9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1c332d9ffe4b9e78", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/team-calendar/TeamCalendarView.tsx:907"}, "properties": {"repobilityId": "7a8fb7e5282c75e5", "scanner": "scanner-primary", "fingerprint": "1c332d9ffe4b9e78", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-aa06bf4aa07af18d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/quick-erg/CoachQuickErgWidgets.tsx:367"}, "properties": {"repobilityId": "73d40d7cb6b61e24", "scanner": "scanner-primary", "fingerprint": "aa06bf4aa07af18d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-23b0af7200319639", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/calendar/CoachCalendarClient.tsx:382"}, "properties": {"repobilityId": "b2fd0c3c7eab6fb5", "scanner": "scanner-primary", "fingerprint": "23b0af7200319639", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-eb4664b098d23b68", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/sport-views/HockeyAthleteView.tsx:1232"}, "properties": {"repobilityId": "e92529d80ac70acc", "scanner": "scanner-primary", "fingerprint": "eb4664b098d23b68", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bdeea07e5403177f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/sport-views/HYROXAthleteView.tsx:256"}, "properties": {"repobilityId": "817eef2ef64cc173", "scanner": "scanner-primary", "fingerprint": "bdeea07e5403177f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-afe0dc872f4ab11b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/sport-views/FunctionalFitnessAthleteView.tsx:254"}, "properties": {"repobilityId": "caeba0fcfbf42be5", "scanner": "scanner-primary", "fingerprint": "afe0dc872f4ab11b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ddaf47339765f7a4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coach/sport-views/PadelAthleteView.tsx:231"}, "properties": {"repobilityId": "a22e86d162606eb6", "scanner": "scanner-primary", "fingerprint": "ddaf47339765f7a4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d3d42effd1229848", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/BusinessCoachBrowser.tsx:220"}, "properties": {"repobilityId": "4bc38b9a147f653b", "scanner": "scanner-primary", "fingerprint": "d3d42effd1229848", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8e46c116f13327e6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/UpcomingWorkouts.tsx:77"}, "properties": {"repobilityId": "b525e1d98df83e38", "scanner": "scanner-primary", "fingerprint": "8e46c116f13327e6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-db5481ed47f72225", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/IntegratedRecentActivity.tsx:323"}, "properties": {"repobilityId": "433a9daeacfd654d", "scanner": "scanner-primary", "fingerprint": "db5481ed47f72225", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5548c9754e7692d5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/UpcomingTeamEvents.tsx:140"}, "properties": {"repobilityId": "ad436a8e3c3b6f05", "scanner": "scanner-primary", "fingerprint": "5548c9754e7692d5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8ce5e6fd98bf159c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/WeeklyTrainingSummaryCard.tsx:631"}, "properties": {"repobilityId": "dfda5d5666770d8a", "scanner": "scanner-primary", "fingerprint": "8ce5e6fd98bf159c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f1f1373d8cdf1da3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/MentalPrepCard.tsx:216"}, "properties": {"repobilityId": "8647cd888fc907ce", "scanner": "scanner-primary", "fingerprint": "f1f1373d8cdf1da3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5f37614d1a8c6094", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/AthleteTestProfileCard.tsx:114"}, "properties": {"repobilityId": "f45ed5488b3e6871", "scanner": "scanner-primary", "fingerprint": "5f37614d1a8c6094", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0727290497f0a5a6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/VBTProgressionWidget.tsx:268"}, "properties": {"repobilityId": "59b4ea51feda90ef", "scanner": "scanner-primary", "fingerprint": "0727290497f0a5a6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d353304968173327", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/AthleteDrillList.tsx:152"}, "properties": {"repobilityId": "f754752d4226c64a", "scanner": "scanner-primary", "fingerprint": "d353304968173327", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a0f52b956ecb09ca", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/WODHistorySection.tsx:139"}, "properties": {"repobilityId": "10c9739634abff91", "scanner": "scanner-primary", "fingerprint": "a0f52b956ecb09ca", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b21434e661a1ecac", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/MatchScheduleWidget.tsx:201"}, "properties": {"repobilityId": "e91b9aaf48df4ef8", "scanner": "scanner-primary", "fingerprint": "b21434e661a1ecac", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-30c70e76fb13fc56", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/workout/HeadlessVoiceCoach.tsx:177"}, "properties": {"repobilityId": "0341051c574d6d5b", "scanner": "scanner-primary", "fingerprint": "30c70e76fb13fc56", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ab262e4b8eaa2bca", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/workout/WorkoutLogClient.tsx:418"}, "properties": {"repobilityId": "82b91f7482043ee2", "scanner": "scanner-primary", "fingerprint": "ab262e4b8eaa2bca", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bf255257a98e30f8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/adhoc/WorkoutReview.tsx:484"}, "properties": {"repobilityId": "c14cc3cd20cb6912", "scanner": "scanner-primary", "fingerprint": "bf255257a98e30f8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a5bdf5de5b1b19b6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/ai/ChatCardioWorkoutCard.tsx:42"}, "properties": {"repobilityId": "580199a49a03cb21", "scanner": "scanner-primary", "fingerprint": "a5bdf5de5b1b19b6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0353ee9be81c60ae", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/ai/ChatProgramPreviewCard.tsx:147"}, "properties": {"repobilityId": "6e82e3fb92f906d0", "scanner": "scanner-primary", "fingerprint": "0353ee9be81c60ae", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a52f0755062d6507", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/ai/AthleteFloatingChat.tsx:948"}, "properties": {"repobilityId": "8b61518bf1c9493c", "scanner": "scanner-primary", "fingerprint": "a52f0755062d6507", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9084f06efaab45c9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/ai/ChatWorkoutCard.tsx:111"}, "properties": {"repobilityId": "3f3c30cce9ef7d16", "scanner": "scanner-primary", "fingerprint": "9084f06efaab45c9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6a4ca1650c280693", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/shareable/ShareAchievementButton.tsx:270"}, "properties": {"repobilityId": "2f7d7c3dc2980eb0", "scanner": "scanner-primary", "fingerprint": "6a4ca1650c280693", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3dbc2a70e2a21ab8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/cardio/LiveVoiceCoachButton.tsx:52"}, "properties": {"repobilityId": "5b5291f8446d18f2", "scanner": "scanner-primary", "fingerprint": "3dbc2a70e2a21ab8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-102509c4e6105703", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/hybrid/AthleteHybridClient.tsx:272"}, "properties": {"repobilityId": "0862c761dc04d2db", "scanner": "scanner-primary", "fingerprint": "102509c4e6105703", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-008f6e3d7aee9637", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/fueling/WorkoutFuelingPlanCard.tsx:250"}, "properties": {"repobilityId": "c12ec426d817d295", "scanner": "scanner-primary", "fingerprint": "008f6e3d7aee9637", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3153b6925fe2f20a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/fueling/FuelingTrainingProgressCard.tsx:291"}, "properties": {"repobilityId": "97ae70dbae286373", "scanner": "scanner-primary", "fingerprint": "3153b6925fe2f20a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5788349aea60c470", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/fueling/RaceFuelingPlanDetail.tsx:985"}, "properties": {"repobilityId": "0721e8ec603a432c", "scanner": "scanner-primary", "fingerprint": "5788349aea60c470", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-531dc2f27e6b7e90", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/dashboard/RestDayHeroCard.tsx:566"}, "properties": {"repobilityId": "04f1db2fc9f2dc78", "scanner": "scanner-primary", "fingerprint": "531dc2f27e6b7e90", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-73c322d6cba779e6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/performance/HYROXPerformanceForm.tsx:319"}, "properties": {"repobilityId": "1be9ef9f2354762d", "scanner": "scanner-primary", "fingerprint": "73c322d6cba779e6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e81fd0a3c28314c2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/wod/WODHistorySummary.tsx:98"}, "properties": {"repobilityId": "63b66fc0bb347a7a", "scanner": "scanner-primary", "fingerprint": "e81fd0a3c28314c2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b0dc978acc8dbd6c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/outdoor-run/OutdoorRunCapture.tsx:523"}, "properties": {"repobilityId": "0344d3f33280477b", "scanner": "scanner-primary", "fingerprint": "b0dc978acc8dbd6c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f27236c224b8abba", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/strength/StrengthFocusMode.tsx:619"}, "properties": {"repobilityId": "1b1d8cf43b5f47c2", "scanner": "scanner-primary", "fingerprint": "f27236c224b8abba", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d03a4ffebf318838", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/strength/AthleteStrengthPRTable.tsx:161"}, "properties": {"repobilityId": "0e8d2e4eaf32bcc6", "scanner": "scanner-primary", "fingerprint": "d03a4ffebf318838", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-042043a5a43c15c4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/nutrition/MealInputMethodSelector.tsx:107"}, "properties": {"repobilityId": "39e90c1f6be7cece", "scanner": "scanner-primary", "fingerprint": "042043a5a43c15c4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-53a4af437d7fec8c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/nutrition/IngredientBuilder.tsx:709"}, "properties": {"repobilityId": "ae12a515744d70f4", "scanner": "scanner-primary", "fingerprint": "53a4af437d7fec8c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-eb8638f4a954c234", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/nutrition/QuickMealLog.tsx:950"}, "properties": {"repobilityId": "26d85517b1d4048d", "scanner": "scanner-primary", "fingerprint": "eb8638f4a954c234", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7ddbf953ec632413", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/nutrition/DailyNutritionCard.tsx:396"}, "properties": {"repobilityId": "b20deee025ce6c7b", "scanner": "scanner-primary", "fingerprint": "7ddbf953ec632413", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-94b0d0fc12897a55", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/quick-erg/QuickErgCapture.tsx:490"}, "properties": {"repobilityId": "e83e61a99d03133a", "scanner": "scanner-primary", "fingerprint": "94b0d0fc12897a55", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3144add7a459c352", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/athlete/browse-workouts/WorkoutTemplateCard.tsx:87"}, "properties": {"repobilityId": "d31585af6b3dc9c9", "scanner": "scanner-primary", "fingerprint": "3144add7a459c352", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-69fa60268b8f6d82", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/documents/DocumentUploader.tsx:360"}, "properties": {"repobilityId": "cfa944accc59b34d", "scanner": "scanner-primary", "fingerprint": "69fa60268b8f6d82", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d5054345e8bc7ab5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/documents/DocumentsClient.tsx:450"}, "properties": {"repobilityId": "363fdb3fd134445f", "scanner": "scanner-primary", "fingerprint": "d5054345e8bc7ab5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2e8740d1f4eb7f74", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/documents/DocumentPreview.tsx:137"}, "properties": {"repobilityId": "2f2d8efcaefb9b90", "scanner": "scanner-primary", "fingerprint": "2e8740d1f4eb7f74", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6f31fce9b08918b1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/physio/MultiExercisePicker.tsx:121"}, "properties": {"repobilityId": "6cfbb37dce785468", "scanner": "scanner-primary", "fingerprint": "6f31fce9b08918b1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-27fd38bfd9befa1d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/coaches/CoachDirectoryClient.tsx:218"}, "properties": {"repobilityId": "b8cc29edab723975", "scanner": "scanner-primary", "fingerprint": "27fd38bfd9befa1d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9ef232f5dd521990", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/nutrition/NutritionTipCard.tsx:165"}, "properties": {"repobilityId": "b7554d11da167f11", "scanner": "scanner-primary", "fingerprint": "9ef232f5dd521990", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3e65c9f2ea9b7a17", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/nutrition/FoodPhotoScanner.tsx:1149"}, "properties": {"repobilityId": "41c2dd454d40d1dc", "scanner": "scanner-primary", "fingerprint": "3e65c9f2ea9b7a17", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-347474c7a0ca1bb2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/nutrition/FoodHistoryPage.tsx:361"}, "properties": {"repobilityId": "3d483a3f72db7adf", "scanner": "scanner-primary", "fingerprint": "347474c7a0ca1bb2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9c06f561ae2e27c0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/hybrid-studio/WorkoutAssignmentDialog.tsx:345"}, "properties": {"repobilityId": "fa3b32b54dba94e1", "scanner": "scanner-primary", "fingerprint": "9c06f561ae2e27c0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-815320a2c5f72a6d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/hybrid-studio/HybridStudioClient.tsx:1007"}, "properties": {"repobilityId": "16a7808e017baf04", "scanner": "scanner-primary", "fingerprint": "815320a2c5f72a6d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2c5b646743beb6c0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/calendar/UnifiedCalendar.tsx:1623"}, "properties": {"repobilityId": "6b1d03b74eb409b0", "scanner": "scanner-primary", "fingerprint": "2c5b646743beb6c0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7574786f812e79bd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/calendar/MonthViewDraggable.tsx:657"}, "properties": {"repobilityId": "45b4e903174723ba", "scanner": "scanner-primary", "fingerprint": "7574786f812e79bd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b27bfc8f57b04036", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/calendar/MonthView.tsx:341"}, "properties": {"repobilityId": "c22ae7f2d1da7b02", "scanner": "scanner-primary", "fingerprint": "b27bfc8f57b04036", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d41b44a7cac06dd5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/calendar/DayActionMenu.tsx:149"}, "properties": {"repobilityId": "52b9fcdc50061003", "scanner": "scanner-primary", "fingerprint": "d41b44a7cac06dd5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-61ce2776d23f9d0d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/calendar/day-sidebar/item-cards.tsx:252"}, "properties": {"repobilityId": "4b1dcd21395b5253", "scanner": "scanner-primary", "fingerprint": "61ce2776d23f9d0d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c0159732fa30b90a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/feedback/BetaFeedbackWidget.tsx:411"}, "properties": {"repobilityId": "830a80ca165f9355", "scanner": "scanner-primary", "fingerprint": "c0159732fa30b90a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c23ee5bfdd24bd1d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/forms/SmartTestImportDialog.tsx:316"}, "properties": {"repobilityId": "ccd4478b331cf569", "scanner": "scanner-primary", "fingerprint": "c23ee5bfdd24bd1d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1cfa6a88e1d0e329", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/workouts/WorkoutPreview.tsx:337"}, "properties": {"repobilityId": "74507456808a1c0b", "scanner": "scanner-primary", "fingerprint": "1cfa6a88e1d0e329", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c74375357fde3915", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/workouts/print/PrintableWorkoutSheet.tsx:75"}, "properties": {"repobilityId": "7654ae240fbca67f", "scanner": "scanner-primary", "fingerprint": "c74375357fde3915", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-857a3ef2342bc6b1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/workouts/import/ImportWorkoutDialog.tsx:501"}, "properties": {"repobilityId": "2ce9bea6e83b8488", "scanner": "scanner-primary", "fingerprint": "857a3ef2342bc6b1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4454f986c08d94e5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/external/athlete/[token]/page.tsx:439"}, "properties": {"repobilityId": "be6045986b7b3618", "scanner": "scanner-primary", "fingerprint": "4454f986c08d94e5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-13ee5b23a223dc99", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 app/api/calendar/external/[id]/sync/route.ts:578"}, "properties": {"repobilityId": "93cd4241164b4c71", "scanner": "scanner-primary", "fingerprint": "13ee5b23a223dc99", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-c2b52a75e83c7ea4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(business)/[businessSlug]/coach/clients/page.tsx:370"}, "properties": {"repobilityId": "e79054cfe984d9cf", "scanner": "scanner-primary", "fingerprint": "c2b52a75e83c7ea4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a1fa3ede7c48d465", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(business)/[businessSlug]/athlete/ad-hoc/[id]/page.tsx:426"}, "properties": {"repobilityId": "184e0b6ace31298b", "scanner": "scanner-primary", "fingerprint": "a1fa3ede7c48d465", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f2e3837cba07d0e7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(business)/[businessSlug]/physio/messages/page.tsx:238"}, "properties": {"repobilityId": "2e0f2aa2a04f3523", "scanner": "scanner-primary", "fingerprint": "f2e3837cba07d0e7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-30c62805d1417245", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(business)/[businessSlug]/physio/rehab-programs/page.tsx:224"}, "properties": {"repobilityId": "fe7ab6abe871865e", "scanner": "scanner-primary", "fingerprint": "30c62805d1417245", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b6b50598d14c56ca", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/athlete/wod/history/WODHistoryClient.tsx:271"}, "properties": {"repobilityId": "c16958c4ddc37b03", "scanner": "scanner-primary", "fingerprint": "b6b50598d14c56ca", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-40c9b13a196c0ac0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/athlete/ad-hoc/[id]/page.tsx:493"}, "properties": {"repobilityId": "03ef1e8f579b70c6", "scanner": "scanner-primary", "fingerprint": "40c9b13a196c0ac0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-efc0c7de9d7a7d21", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/athlete/log-workout/import/garmin/page.tsx:218"}, "properties": {"repobilityId": "6ad63fe78a023c1d", "scanner": "scanner-primary", "fingerprint": "efc0c7de9d7a7d21", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-76080ca5a66f8b15", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/athlete/log-workout/import/strava/page.tsx:213"}, "properties": {"repobilityId": "25a008e7cac46e3f", "scanner": "scanner-primary", "fingerprint": "76080ca5a66f8b15", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a682b6049db62adb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/my/calendar/UnifiedCalendarClient.tsx:424"}, "properties": {"repobilityId": "ede9b989776d32d6", "scanner": "scanner-primary", "fingerprint": "a682b6049db62adb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-175c4a2a12ea361a", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 lib/rate-limit-redis.ts:15"}, "properties": {"repobilityId": "fd5799fae9cff219", "scanner": "scanner-primary", "fingerprint": "175c4a2a12ea361a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-e6bd50fdbace0eb9", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 lib/managed-agents/shadow-mode.ts:168"}, "properties": {"repobilityId": "00ef71d2ec172076", "scanner": "scanner-primary", "fingerprint": "e6bd50fdbace0eb9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-f0554739a0f14ea0", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 lib/operator-agents/tools/platform-health.ts:31"}, "properties": {"repobilityId": "67ac2afec3912b21", "scanner": "scanner-primary", "fingerprint": "f0554739a0f14ea0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-04297a3fb9534b67", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 pitch-deck/generate-pptx.js:1008"}, "properties": {"repobilityId": "64e49ad93f30eda2", "scanner": "scanner-primary", "fingerprint": "04297a3fb9534b67", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c811bd80dbcabc0f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 load-tests/k6/run.test.ts:64"}, "properties": {"repobilityId": "acaa24b4b27f3eb5", "scanner": "scanner-primary", "fingerprint": "c811bd80dbcabc0f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-79f94bcc0bd5ae30", "level": "warning", "message": {"text": "Dockerfile runs as root: apps/garmin-webhook/Dockerfile"}, "properties": {"repobilityId": "817c4eafff4a9ba1", "scanner": "scanner-primary", "fingerprint": "79f94bcc0bd5ae30", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-e39e0c5bb936a070", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-bookworm-slim"}, "properties": {"repobilityId": "9d46e82d29eb6962", "scanner": "scanner-primary", "fingerprint": "e39e0c5bb936a070", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/garmin-webhook/Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"ruleId": "scanner-6b37a6f0cc55804a", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/qa-hockey-browser-env.cjs:5"}, "properties": {"repobilityId": "489b64acf934a482", "scanner": "scanner-primary", "fingerprint": "6b37a6f0cc55804a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/qa-hockey-browser-env.cjs"}, "region": {"startLine": 5}}}]}, {"ruleId": "scanner-d8365d93a6931de3", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/hockey-pilot-evidence.test.ts:4"}, "properties": {"repobilityId": "c8d30748cb29f48e", "scanner": "scanner-primary", "fingerprint": "d8365d93a6931de3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/hockey-pilot-evidence.test.ts"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-afe8f87357f3b600", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/qa-hockey-pilot-readiness.cjs:2"}, "properties": {"repobilityId": "0082707afdda5dfc", "scanner": "scanner-primary", "fingerprint": "afe8f87357f3b600", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/qa-hockey-pilot-readiness.cjs"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-d3e5309d362ff6cc", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/qa-hockey-pilot-gates.cjs:2"}, "properties": {"repobilityId": "b14dd9da1486798e", "scanner": "scanner-primary", "fingerprint": "d3e5309d362ff6cc", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/qa-hockey-pilot-gates.cjs"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-1dca9b3e072c52d9", "level": "error", "message": {"text": "Possible secret in scripts/create-athlete-for-client.ts"}, "properties": {"repobilityId": "817105cd4447360c", "scanner": "scanner-primary", "fingerprint": "1dca9b3e072c52d9", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/create-athlete-for-client.ts"}, "region": {"startLine": 11}}}]}, {"ruleId": "scanner-720dbe257e98525c", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/qa-hockey-pilot-env.cjs:8"}, "properties": {"repobilityId": "6d2509298ce2efbf", "scanner": "scanner-primary", "fingerprint": "720dbe257e98525c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/qa-hockey-pilot-env.cjs"}, "region": {"startLine": 8}}}]}, {"ruleId": "scanner-a0fa1a68a87f30c0", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/qa-hockey-deployment-commit.cjs:2"}, "properties": {"repobilityId": "da1a48718e4f6628", "scanner": "scanner-primary", "fingerprint": "a0fa1a68a87f30c0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/qa-hockey-deployment-commit.cjs"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-1981613a991784c7", "level": "error", "message": {"text": "Insecure pattern 'eval_used' in scripts/chrome-debug.cjs:181"}, "properties": {"repobilityId": "0ad9ce7f6c12b623", "scanner": "scanner-primary", "fingerprint": "1981613a991784c7", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "eval_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/chrome-debug.cjs"}, "region": {"startLine": 181}}}]}, {"ruleId": "scanner-75dcb86c05a47944", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/qa-hockey-evidence-commands.cjs:2"}, "properties": {"repobilityId": "dbda1e29d44123d8", "scanner": "scanner-primary", "fingerprint": "75dcb86c05a47944", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/qa-hockey-evidence-commands.cjs"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-f3b1e4b344f69084", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/qa-hockey-pilot-env.test.ts:4"}, "properties": {"repobilityId": "789bcc2ea36a3c13", "scanner": "scanner-primary", "fingerprint": "f3b1e4b344f69084", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/qa-hockey-pilot-env.test.ts"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-490b17a54ccf1454", "level": "note", "message": {"text": "Insecure pattern 'document_write' in components/ai-studio/ResearchResultViewer.tsx:162"}, "properties": {"repobilityId": "4bd3ec69b34410c4", "scanner": "scanner-primary", "fingerprint": "490b17a54ccf1454", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "components/ai-studio/ResearchResultViewer.tsx"}, "region": {"startLine": 162}}}]}, {"ruleId": "scanner-605ca79a6accf114", "level": "note", "message": {"text": "Insecure pattern 'document_write' in components/coach/drills/PracticePlanner.tsx:392"}, "properties": {"repobilityId": "17146fda4aa8b6b6", "scanner": "scanner-primary", "fingerprint": "605ca79a6accf114", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "components/coach/drills/PracticePlanner.tsx"}, "region": {"startLine": 392}}}]}, {"ruleId": "scanner-1f98f7e358d28381", "level": "note", "message": {"text": "Insecure pattern 'document_write' in components/coach/video-analysis/ClientVideoAnalyses.tsx:176"}, "properties": {"repobilityId": "d5b2d47e04c37c02", "scanner": "scanner-primary", "fingerprint": "1f98f7e358d28381", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "components/coach/video-analysis/ClientVideoAnalyses.tsx"}, "region": {"startLine": 176}}}]}, {"ruleId": "scanner-31c36154a969ed58", "level": "note", "message": {"text": "Insecure pattern 'document_write' in components/coach/video-analysis/VideoAnalysisCard.tsx:720"}, "properties": {"repobilityId": "bf9becdc3311c311", "scanner": "scanner-primary", "fingerprint": "31c36154a969ed58", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "components/coach/video-analysis/VideoAnalysisCard.tsx"}, "region": {"startLine": 720}}}]}, {"ruleId": "scanner-b334f519343762d4", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "731e43a324dc0284", "scanner": "scanner-primary", "fingerprint": "b334f519343762d4", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/npm-audit.yml"}, "region": {"startLine": 14}}}]}, {"ruleId": "scanner-b334f519343762d4", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "4d68f1945d214922", "scanner": "scanner-primary", "fingerprint": "b334f519343762d4", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/npm-audit.yml"}, "region": {"startLine": 17}}}]}, {"ruleId": "scanner-1a50467f36b413ec", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "aecc3f31ca3f42da", "scanner": "scanner-primary", "fingerprint": "1a50467f36b413ec", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/tests.yml"}, "region": {"startLine": 19}}}]}, {"ruleId": "scanner-1a50467f36b413ec", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "fc166fcb4bb93c1b", "scanner": "scanner-primary", "fingerprint": "1a50467f36b413ec", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/tests.yml"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-1a50467f36b413ec", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "aecc3f31ca3f42da", "scanner": "scanner-primary", "fingerprint": "1a50467f36b413ec", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/tests.yml"}, "region": {"startLine": 46}}}]}, {"ruleId": "scanner-1a50467f36b413ec", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "fc166fcb4bb93c1b", "scanner": "scanner-primary", "fingerprint": "1a50467f36b413ec", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/tests.yml"}, "region": {"startLine": 49}}}]}, {"ruleId": "scanner-1a50467f36b413ec", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "aecc3f31ca3f42da", "scanner": "scanner-primary", "fingerprint": "1a50467f36b413ec", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/tests.yml"}, "region": {"startLine": 82}}}]}, {"ruleId": "scanner-1a50467f36b413ec", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "fc166fcb4bb93c1b", "scanner": "scanner-primary", "fingerprint": "1a50467f36b413ec", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/tests.yml"}, "region": {"startLine": 85}}}]}, {"ruleId": "scanner-1a50467f36b413ec", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "b34e143cdd267736", "scanner": "scanner-primary", "fingerprint": "1a50467f36b413ec", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/tests.yml"}, "region": {"startLine": 101}}}]}, {"ruleId": "scanner-cb639d9a10a47b23", "level": "note", "message": {"text": "package.json defines install-time lifecycle scripts"}, "properties": {"repobilityId": "714673743ff59cef", "scanner": "scanner-primary", "fingerprint": "cb639d9a10a47b23", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "npm", "install-scripts"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-802ad68136bbee65", "level": "note", "message": {"text": "Very large file: scripts/build-exercise-image-frame-prompts.ts (1246 lines)"}, "properties": {"repobilityId": "c0a14db03df5ffd0", "scanner": "scanner-primary", "fingerprint": "802ad68136bbee65", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-fb2a935ce59c118b", "level": "note", "message": {"text": "Very large file: prisma/seed-exercises.ts (2055 lines)"}, "properties": {"repobilityId": "a522934bbefd9f42", "scanner": "scanner-primary", "fingerprint": "fb2a935ce59c118b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-667c556b73e2b0ce", "level": "note", "message": {"text": "Very large file: prisma/seed-hybrid-movements.ts (2073 lines)"}, "properties": {"repobilityId": "d8a1d8037df75304", "scanner": "scanner-primary", "fingerprint": "667c556b73e2b0ce", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-027dd558bb38ea67", "level": "note", "message": {"text": "Very large file: prisma/seed-workout-templates.ts (1553 lines)"}, "properties": {"repobilityId": "276733da19eceeca", "scanner": "scanner-primary", "fingerprint": "027dd558bb38ea67", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3cde17ba3223d0e1", "level": "note", "message": {"text": "Very large file: prisma/seed-unified-exercises.ts (1507 lines)"}, "properties": {"repobilityId": "78e585f988fbcbca", "scanner": "scanner-primary", "fingerprint": "3cde17ba3223d0e1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-956c4b6fa4af33b9", "level": "note", "message": {"text": "Very large file: prisma/seed-agility-drills.ts (1839 lines)"}, "properties": {"repobilityId": "10e49a3cbe89f483", "scanner": "scanner-primary", "fingerprint": "956c4b6fa4af33b9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-98d40fffd5b75c48", "level": "note", "message": {"text": "Very large file: components/ai-canvas/AICanvasClient.tsx (1515 lines)"}, "properties": {"repobilityId": "42eb65542a17a21d", "scanner": "scanner-primary", "fingerprint": "98d40fffd5b75c48", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ee1cd9c93000946a", "level": "note", "message": {"text": "Very large file: components/ai-studio/FloatingAIChat.tsx (2405 lines)"}, "properties": {"repobilityId": "0eb17952df756f88", "scanner": "scanner-primary", "fingerprint": "ee1cd9c93000946a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ae56769e0fd90369", "level": "note", "message": {"text": "Very large file: components/ai-studio/DraftWorkoutEditor.tsx (1200 lines)"}, "properties": {"repobilityId": "2163bce4287e5835", "scanner": "scanner-primary", "fingerprint": "ae56769e0fd90369", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-8bd05a7b4d8692e7", "level": "note", "message": {"text": "Very large file: components/ai-studio/EnhancedProgramPreview.tsx (1452 lines)"}, "properties": {"repobilityId": "8163c89c13dcada5", "scanner": "scanner-primary", "fingerprint": "8bd05a7b4d8692e7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-570c3ec735fb22f6", "level": "note", "message": {"text": "Very large file: components/ai-studio/AIStudioClient.tsx (1810 lines)"}, "properties": {"repobilityId": "8767d138b34f5513", "scanner": "scanner-primary", "fingerprint": "570c3ec735fb22f6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a37a4a7d77671e2d", "level": "note", "message": {"text": "Very large file: components/mva/MVAAnalysisClient.tsx (1672 lines)"}, "properties": {"repobilityId": "075897b88351ac7a", "scanner": "scanner-primary", "fingerprint": "a37a4a7d77671e2d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-023b2a6749b41648", "level": "note", "message": {"text": "Very large file: components/programs/wizard/ConfigurationForm.tsx (1425 lines)"}, "properties": {"repobilityId": "56d8922c6fa84f68", "scanner": "scanner-primary", "fingerprint": "023b2a6749b41648", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-531bf24cbcbbad1d", "level": "note", "message": {"text": "Very large file: components/coach/cardio/CardioSessionBuilder.tsx (1872 lines)"}, "properties": {"repobilityId": "cd679882fce850a0", "scanner": "scanner-primary", "fingerprint": "531bf24cbcbbad1d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-62a63d70805176ac", "level": "note", "message": {"text": "Very large file: components/coach/drills/InteractiveDrillEditor.tsx (1548 lines)"}, "properties": {"repobilityId": "c1ae80a90487d084", "scanner": "scanner-primary", "fingerprint": "62a63d70805176ac", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-906c42497243cba8", "level": "note", "message": {"text": "Very large file: components/coach/teams/TeamTestsClient.tsx (1590 lines)"}, "properties": {"repobilityId": "8bb75e9d3bea0f8d", "scanner": "scanner-primary", "fingerprint": "906c42497243cba8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-5752e9169ec85697", "level": "note", "message": {"text": "Very large file: components/coach/strength/SectionWorkoutBuilder.tsx (1560 lines)"}, "properties": {"repobilityId": "5ac790edc5bb9c58", "scanner": "scanner-primary", "fingerprint": "5752e9169ec85697", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-2228e4b98320273e", "level": "note", "message": {"text": "Very large file: components/coach/video-analysis/PoseAnalyzer.tsx (1978 lines)"}, "properties": {"repobilityId": "7cb68591c7eec551", "scanner": "scanner-primary", "fingerprint": "2228e4b98320273e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c09ff6ce13132a97", "level": "note", "message": {"text": "Very large file: components/coach/video-analysis/VideoAnalysisCard.tsx (1508 lines)"}, "properties": {"repobilityId": "4df46f3297d730be", "scanner": "scanner-primary", "fingerprint": "c09ff6ce13132a97", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e5f32f71019f732d", "level": "note", "message": {"text": "Very large file: components/coach/hockey-tests/HockeyTestForm.tsx (1042 lines)"}, "properties": {"repobilityId": "ed6b4e1f50e4d31b", "scanner": "scanner-primary", "fingerprint": "e5f32f71019f732d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-718d9119b24df4b0", "level": "note", "message": {"text": "Very large file: components/coach/team-calendar/EditEventDialog.tsx (1458 lines)"}, "properties": {"repobilityId": "0e41e769cf5847e1", "scanner": "scanner-primary", "fingerprint": "718d9119b24df4b0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-16a7d3d981e29252", "level": "note", "message": {"text": "Very large file: components/coach/team-calendar/TeamCalendarView.tsx (1612 lines)"}, "properties": {"repobilityId": "2b91b107c98339c2", "scanner": "scanner-primary", "fingerprint": "16a7d3d981e29252", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-eb21e8f7a1fe9cce", "level": "note", "message": {"text": "Very large file: components/coach/sport-views/HockeyAthleteView.tsx (1674 lines)"}, "properties": {"repobilityId": "1f18513653e2cdff", "scanner": "scanner-primary", "fingerprint": "eb21e8f7a1fe9cce", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-eb1294fa4c1c998a", "level": "note", "message": {"text": "Very large file: components/athlete/DailyCheckInForm.tsx (1181 lines)"}, "properties": {"repobilityId": "cc97560607b52622", "scanner": "scanner-primary", "fingerprint": "eb1294fa4c1c998a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b8514fec827d1ce6", "level": "note", "message": {"text": "Very large file: components/athlete/WorkoutLoggingForm.tsx (1503 lines)"}, "properties": {"repobilityId": "5b6bab7a8619c41f", "scanner": "scanner-primary", "fingerprint": "b8514fec827d1ce6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-27b5e64d05e98cdd", "level": "note", "message": {"text": "Very large file: components/athlete/ai/AthleteFloatingChat.tsx (1584 lines)"}, "properties": {"repobilityId": "789c139164b0e9b0", "scanner": "scanner-primary", "fingerprint": "27b5e64d05e98cdd", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6fed6ae982e688c7", "level": "note", "message": {"text": "Very large file: components/athlete/cardio/CardioFocusModeWorkout.tsx (1290 lines)"}, "properties": {"repobilityId": "7ec3e8d231f84814", "scanner": "scanner-primary", "fingerprint": "6fed6ae982e688c7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-de387a4440451816", "level": "note", "message": {"text": "Very large file: components/athlete/fueling/RaceFuelingPlanDetail.tsx (1407 lines)"}, "properties": {"repobilityId": "2edc62670e003b8a", "scanner": "scanner-primary", "fingerprint": "de387a4440451816", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-558661732ccb90d5", "level": "note", "message": {"text": "Very large file: components/nutrition/FoodPhotoScanner.tsx (1972 lines)"}, "properties": {"repobilityId": "d383b9bf5f656667", "scanner": "scanner-primary", "fingerprint": "558661732ccb90d5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c744e62180e35bdf", "level": "note", "message": {"text": "Very large file: components/hybrid-studio/HybridWorkoutBuilder.tsx (1345 lines)"}, "properties": {"repobilityId": "f48772e45d8c70e9", "scanner": "scanner-primary", "fingerprint": "c744e62180e35bdf", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b30e4f6940298df6", "level": "note", "message": {"text": "Very large file: components/calendar/UnifiedCalendar.tsx (1627 lines)"}, "properties": {"repobilityId": "b2616ff98377bdda", "scanner": "scanner-primary", "fingerprint": "b30e4f6940298df6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6ba0005addfbab1b", "level": "note", "message": {"text": "Very large file: components/calendar/CalendarWorkoutDetailSheet.tsx (1433 lines)"}, "properties": {"repobilityId": "769c335443813a68", "scanner": "scanner-primary", "fingerprint": "6ba0005addfbab1b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f3d308ce78386d64", "level": "note", "message": {"text": "Very large file: components/forms/TestDataForm.tsx (1678 lines)"}, "properties": {"repobilityId": "5934ae8629b00309", "scanner": "scanner-primary", "fingerprint": "f3d308ce78386d64", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-73a229d85a551da9", "level": "note", "message": {"text": "Very large file: lib/ai/athlete-context-builder.ts (1552 lines)"}, "properties": {"repobilityId": "4c547242f9a9ce60", "scanner": "scanner-primary", "fingerprint": "73a229d85a551da9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-7ec039cdf6055b66", "level": "note", "message": {"text": "Very large file: lib/ai/program-prompts.ts (1683 lines)"}, "properties": {"repobilityId": "56ff2e36be23bb0a", "scanner": "scanner-primary", "fingerprint": "7ec039cdf6055b66", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-7b20d2de43a8b880", "level": "note", "message": {"text": "Very large file: lib/ai/wod-prompts.ts (1629 lines)"}, "properties": {"repobilityId": "6793edb0311d84fc", "scanner": "scanner-primary", "fingerprint": "7b20d2de43a8b880", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-630a05eb78f9b248", "level": "note", "message": {"text": "Very large file: lib/ai/chat-tools.ts (1054 lines)"}, "properties": {"repobilityId": "66038731ced745f2", "scanner": "scanner-primary", "fingerprint": "630a05eb78f9b248", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ea3b5e389d8c9c0f", "level": "note", "message": {"text": "Low test-to-source ratio"}, "properties": {"repobilityId": "ef7b2552cc00a375", "scanner": "scanner-primary", "fingerprint": "ea3b5e389d8c9c0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["tests"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "3b0ecb9193b1c769", "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": "ec978b1bf2cd480a", "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": "395463787c72bda8", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "45c6f0a47d8c5b8f", "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": "640a568694f308b9", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "00a07b71a1755e83", "scanner": "scanner-primary", "fingerprint": "ea8f3013f588db25", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-8424db9c75e04ba4", "level": "none", "message": {"text": "Very short observed git history"}, "properties": {"repobilityId": "a372ba5a77ae02ec", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-e725d2ab884fbd49", "level": "note", "message": {"text": "Multiple root agent instruction files without precedence"}, "properties": {"repobilityId": "1953db6c89508d22", "scanner": "scanner-primary", "fingerprint": "e725d2ab884fbd49", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["agent-instructions", "governance"]}}, {"ruleId": "scanner-1cb1c1ff6705d8b2", "level": "none", "message": {"text": "Commented-code block (5 lines) in eslint.config.mjs:28"}, "properties": {"repobilityId": "4f239111feb27eef", "scanner": "scanner-primary", "fingerprint": "1cb1c1ff6705d8b2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-17dd40c6f2bfe31a", "level": "none", "message": {"text": "Commented-code block (5 lines) in proxy.ts:430"}, "properties": {"repobilityId": "00adba9406b02b02", "scanner": "scanner-primary", "fingerprint": "17dd40c6f2bfe31a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-11c4d6f19b1c23e9", "level": "none", "message": {"text": "Commented-code block (6 lines) in next.config.ts:7"}, "properties": {"repobilityId": "1fb5614f556f397f", "scanner": "scanner-primary", "fingerprint": "11c4d6f19b1c23e9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f4df2edf63a89ea8", "level": "none", "message": {"text": "Commented-code block (5 lines) in types/ai-models.ts:381"}, "properties": {"repobilityId": "c25969f67ed32660", "scanner": "scanner-primary", "fingerprint": "f4df2edf63a89ea8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-00b4f5e042542e17", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/verify-percent-resolution.ts:110"}, "properties": {"repobilityId": "4eefa56c6658ae30", "scanner": "scanner-primary", "fingerprint": "00b4f5e042542e17", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-14fb46071e016ee4", "level": "note", "message": {"text": "Legacy-named symbol `totalLegacy` in scripts/audit-legacy-routes.ts:164"}, "properties": {"repobilityId": "c99c2a252940e801", "scanner": "scanner-primary", "fingerprint": "14fb46071e016ee4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-9c256d27f959dfa8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/qa-hockey-cockpit.ts:177"}, "properties": {"repobilityId": "10ab14991b1d2ad6", "scanner": "scanner-primary", "fingerprint": "9c256d27f959dfa8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2cf643148d4dc139", "level": "note", "message": {"text": "Legacy-named symbol `embedding_v2` in scripts/seed-hockey-knowledge-skill.ts:10"}, "properties": {"repobilityId": "3c939d3a1ca31b57", "scanner": "scanner-primary", "fingerprint": "2cf643148d4dc139", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-3b8d0992905a119a", "level": "note", "message": {"text": "Legacy-named symbol `embedding_v2` in scripts/migrate-embeddings-v2.ts:2"}, "properties": {"repobilityId": "93dfea241b9115d4", "scanner": "scanner-primary", "fingerprint": "3b8d0992905a119a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-aa49d6bc1ad243ee", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/import-livsmedelsverket.ts:75"}, "properties": {"repobilityId": "8e3af8c8ee03a67e", "scanner": "scanner-primary", "fingerprint": "aa49d6bc1ad243ee", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c50d6b8155175b31", "level": "note", "message": {"text": "Legacy-named symbol `embedding_v2` in scripts/seed-platform-help.ts:8"}, "properties": {"repobilityId": "8e891504fe8637dc", "scanner": "scanner-primary", "fingerprint": "c50d6b8155175b31", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-86ae155ab76b9a9a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/ai/performance-analysis/AnalyzeTestButton.tsx:97"}, "properties": {"repobilityId": "d5e694361b427a18", "scanner": "scanner-primary", "fingerprint": "86ae155ab76b9a9a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-10ef9c1efd8bf662", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/test/TestPageContent.tsx:243"}, "properties": {"repobilityId": "2b6677614645da58", "scanner": "scanner-primary", "fingerprint": "10ef9c1efd8bf662", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4a42e6abdf471096", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/data-moat/CoachDecisionModal.tsx:375"}, "properties": {"repobilityId": "4e26ce6a6ca9d6d6", "scanner": "scanner-primary", "fingerprint": "4a42e6abdf471096", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3d03c315da344485", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/ai-studio/FloatingAIChat.tsx:1010"}, "properties": {"repobilityId": "840d65a63553cbae", "scanner": "scanner-primary", "fingerprint": "3d03c315da344485", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5f420839bc43d04f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/ai-studio/ResearchHistory.tsx:194"}, "properties": {"repobilityId": "9a7e122e3f672d21", "scanner": "scanner-primary", "fingerprint": "5f420839bc43d04f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5ab0137fca97977f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/ai-studio/AIContextButton.tsx:134"}, "properties": {"repobilityId": "9b08b340ec264248", "scanner": "scanner-primary", "fingerprint": "5ab0137fca97977f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a42ce8712c575f1d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/mva/MVAAnalysisClient.tsx:534"}, "properties": {"repobilityId": "5749e9c6a9e99407", "scanner": "scanner-primary", "fingerprint": "a42ce8712c575f1d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6c9e807d4465f0c6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/admin/businesses/PartnerReferralsTab.tsx:109"}, "properties": {"repobilityId": "c986b691989ce77c", "scanner": "scanner-primary", "fingerprint": "6c9e807d4465f0c6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b5a4119be5cecf9e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/admin/businesses/AIActionHistoryPanel.tsx:80"}, "properties": {"repobilityId": "b590cbbdad8290c4", "scanner": "scanner-primary", "fingerprint": "b5a4119be5cecf9e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7275751fbc6929fb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/admin/businesses/BusinessForm.tsx:59"}, "properties": {"repobilityId": "1e81b3af277221f7", "scanner": "scanner-primary", "fingerprint": "7275751fbc6929fb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d9f57df79a8e5e02", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/admin/contracts/ContractsTable.tsx:81"}, "properties": {"repobilityId": "198fc99e8667f52a", "scanner": "scanner-primary", "fingerprint": "d9f57df79a8e5e02", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-dda2d91409ab280b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/programs/import/ExerciseAliasesClient.tsx:55"}, "properties": {"repobilityId": "1e9902e66c7c6946", "scanner": "scanner-primary", "fingerprint": "dda2d91409ab280b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8655f301529acdb0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/programs/import/ImportProgramClient.tsx:294"}, "properties": {"repobilityId": "87a09feb55832473", "scanner": "scanner-primary", "fingerprint": "8655f301529acdb0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f4fac47ba31b86d1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/programs/wizard/ConfigurationForm.tsx:329"}, "properties": {"repobilityId": "463018d0cff750b3", "scanner": "scanner-primary", "fingerprint": "f4fac47ba31b86d1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5494625e3a11fe82", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/programs/wizard/ProgramWizard.tsx:405"}, "properties": {"repobilityId": "d8936da1d30ce7d8", "scanner": "scanner-primary", "fingerprint": "5494625e3a11fe82", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6dfc53861acd8cd9", "level": "none", "message": {"text": "Commented-code block (6 lines) in components/programs/wizard/configuration-form/schema.ts:45"}, "properties": {"repobilityId": "64a5271deb581cef", "scanner": "scanner-primary", "fingerprint": "6dfc53861acd8cd9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d07929d9fa1bf66d", "level": "none", "message": {"text": "Commented-code block (6 lines) in components/agility-studio/AgilityWorkoutBuilder.tsx:164"}, "properties": {"repobilityId": "1cd47860d234fabc", "scanner": "scanner-primary", "fingerprint": "d07929d9fa1bf66d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5071ab51f017bc53", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/agility-studio/AgilityStudioClient.tsx:133"}, "properties": {"repobilityId": "689c92e252279e0e", "scanner": "scanner-primary", "fingerprint": "5071ab51f017bc53", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5293a5b43fc78af1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/agility-studio/TimingGateImport.tsx:191"}, "properties": {"repobilityId": "d37f9106199ebc0a", "scanner": "scanner-primary", "fingerprint": "5293a5b43fc78af1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e497bc832e8034b7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/WorkoutFeedbackModal.tsx:193"}, "properties": {"repobilityId": "136bd96a32084915", "scanner": "scanner-primary", "fingerprint": "e497bc832e8034b7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4e54d482c4a26318", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/CoachAIAssistantPanel.tsx:73"}, "properties": {"repobilityId": "ff057a2bf7052346", "scanner": "scanner-primary", "fingerprint": "4e54d482c4a26318", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4298d70ec5c821c9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/AthleteModeToggle.tsx:126"}, "properties": {"repobilityId": "8d85bb9e78866987", "scanner": "scanner-primary", "fingerprint": "4298d70ec5c821c9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-534b3d0757bf9da2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/BusinessCoachGlassHeader.tsx:143"}, "properties": {"repobilityId": "87f4747c3c64e2a5", "scanner": "scanner-primary", "fingerprint": "534b3d0757bf9da2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-45b1a92fecd2efcd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/settings/ai/DefaultModelSelector.tsx:73"}, "properties": {"repobilityId": "02b52b3b96a532a4", "scanner": "scanner-primary", "fingerprint": "45b1a92fecd2efcd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-58b7e8c9eb1839fa", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/settings/ai/ApiKeySettingsClient.tsx:181"}, "properties": {"repobilityId": "6fea6ae73a482ff2", "scanner": "scanner-primary", "fingerprint": "58b7e8c9eb1839fa", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-159527dab7d5e56c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/settings/athlete-dashboards/AthleteDashboardTemplatesClient.tsx:246"}, "properties": {"repobilityId": "214e063895f570e2", "scanner": "scanner-primary", "fingerprint": "159527dab7d5e56c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-910b88d9ee887da9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/voice-workout/VoiceWorkoutCreator.tsx:248"}, "properties": {"repobilityId": "fcac4f6bdef644b2", "scanner": "scanner-primary", "fingerprint": "910b88d9ee887da9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9fe887f0e487dc1f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/voice-workout/TargetSelector.tsx:76"}, "properties": {"repobilityId": "962affc75dc7a0f7", "scanner": "scanner-primary", "fingerprint": "9fe887f0e487dc1f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1317fc1ac20f78bb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/cardio/CardioSessionLibrary.tsx:195"}, "properties": {"repobilityId": "8bc9233d4176a3af", "scanner": "scanner-primary", "fingerprint": "1317fc1ac20f78bb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5e317fb4d4c8d8ea", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/cardio/CardioTemplateLibrary.tsx:163"}, "properties": {"repobilityId": "23a9299cdefac10a", "scanner": "scanner-primary", "fingerprint": "5e317fb4d4c8d8ea", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3ff47e471675b8cb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/cardio/CardioSessionAssignmentDialog.tsx:145"}, "properties": {"repobilityId": "37e50872309b0998", "scanner": "scanner-primary", "fingerprint": "3ff47e471675b8cb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-dc02add7116ab06c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/cardio/CardioSessionBuilder.tsx:412"}, "properties": {"repobilityId": "b6b60457fb5172ad", "scanner": "scanner-primary", "fingerprint": "dc02add7116ab06c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2ef8003df1425f95", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/exercise-library/ExerciseLibraryBrowser.tsx:173"}, "properties": {"repobilityId": "f990bdf3fb70026b", "scanner": "scanner-primary", "fingerprint": "2ef8003df1425f95", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7dfeb676a719999f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/exercise-library/CustomExerciseCreator.tsx:184"}, "properties": {"repobilityId": "c5bbf3b9db9b6be4", "scanner": "scanner-primary", "fingerprint": "7dfeb676a719999f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-677c4d1223dcf040", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/dashboard/TeamCoachActionDialog.tsx:149"}, "properties": {"repobilityId": "555fd97374c77848", "scanner": "scanner-primary", "fingerprint": "677c4d1223dcf040", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f8e8367987258166", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/dashboard/AthleteAttentionList.tsx:176"}, "properties": {"repobilityId": "6f2c2484683e0f92", "scanner": "scanner-primary", "fingerprint": "f8e8367987258166", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f9ac7522b7267923", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/dashboard/GymClientListCard.tsx:63"}, "properties": {"repobilityId": "e21e37b06b38d96e", "scanner": "scanner-primary", "fingerprint": "f9ac7522b7267923", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9ee9d39b7146417a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/dashboard/ClientStatusGrid.tsx:116"}, "properties": {"repobilityId": "287c40a9a7d66512", "scanner": "scanner-primary", "fingerprint": "9ee9d39b7146417a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-22b027c2c897c2d8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/dashboard/GymClassesCard.tsx:67"}, "properties": {"repobilityId": "df79dfdf676c10b3", "scanner": "scanner-primary", "fingerprint": "22b027c2c897c2d8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a985ea87c956fcb7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/agent/AgentPerformanceMetrics.tsx:107"}, "properties": {"repobilityId": "8825dd37f7c2bc11", "scanner": "scanner-primary", "fingerprint": "a985ea87c956fcb7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5036b3620c02397e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/agent/AgentOversightSummaryCard.tsx:37"}, "properties": {"repobilityId": "eeadf3546ba574a1", "scanner": "scanner-primary", "fingerprint": "5036b3620c02397e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-508f849dec08602a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/agent/AgentOversightQueue.tsx:56"}, "properties": {"repobilityId": "9f26706e11bf9af2", "scanner": "scanner-primary", "fingerprint": "508f849dec08602a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7e60cd83a29f4165", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/agent/ManagedAgentsMonitor.tsx:69"}, "properties": {"repobilityId": "a2c8911bbf1271fc", "scanner": "scanner-primary", "fingerprint": "7e60cd83a29f4165", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-67d3c49637f848ad", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/team/WorkoutPickerField.tsx:82"}, "properties": {"repobilityId": "1529eb3cdd7eaca4", "scanner": "scanner-primary", "fingerprint": "67d3c49637f848ad", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-236914e58cf47acc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/team/TeamWorkoutAssignmentDialog.tsx:363"}, "properties": {"repobilityId": "b1a87a68bd8ddaff", "scanner": "scanner-primary", "fingerprint": "236914e58cf47acc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-34a3c43b7b74c8f1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/athlete-profile/AssessmentTimeline.tsx:86"}, "properties": {"repobilityId": "37001058e2486c86", "scanner": "scanner-primary", "fingerprint": "34a3c43b7b74c8f1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3c5e7b0a8678b38d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/teams/TeamTestManualEntryDialog.tsx:106"}, "properties": {"repobilityId": "fcfa98cb0019e75b", "scanner": "scanner-primary", "fingerprint": "3c5e7b0a8678b38d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-544ac108365e2e98", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/teams/AddPlayersDialog.tsx:196"}, "properties": {"repobilityId": "b18482b2683224cc", "scanner": "scanner-primary", "fingerprint": "544ac108365e2e98", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ddac22f678f040c7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/teams/TeamWorkoutMonitor.tsx:316"}, "properties": {"repobilityId": "ab085a1408bf8759", "scanner": "scanner-primary", "fingerprint": "ddac22f678f040c7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-df104b940a61d0a7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/teams/TeamTestImportDialog.tsx:175"}, "properties": {"repobilityId": "89ac125466221072", "scanner": "scanner-primary", "fingerprint": "df104b940a61d0a7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f82083b55f515525", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/teams/TeamChatPanel.tsx:78"}, "properties": {"repobilityId": "4480c0e2375ef9c1", "scanner": "scanner-primary", "fingerprint": "f82083b55f515525", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c734db3e972d8db8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/teams/ImportRosterClient.tsx:213"}, "properties": {"repobilityId": "278bb496159fd5da", "scanner": "scanner-primary", "fingerprint": "c734db3e972d8db8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3928ce5c316df948", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/teams/kiosk/TeamKioskWorkoutPanel.tsx:144"}, "properties": {"repobilityId": "84a0b7e86a746b9b", "scanner": "scanner-primary", "fingerprint": "3928ce5c316df948", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-776cb1c6e8a228d2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/teams/kiosk/KioskSetLogger.tsx:110"}, "properties": {"repobilityId": "1b62b0b1b415524e", "scanner": "scanner-primary", "fingerprint": "776cb1c6e8a228d2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0839cd3184e3e88a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/interval-session/CreateIntervalSessionDialog.tsx:163"}, "properties": {"repobilityId": "c199312f2c5f3488", "scanner": "scanner-primary", "fingerprint": "0839cd3184e3e88a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-92efc61feef36a2c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/admin/BusinessBrandingTab.tsx:217"}, "properties": {"repobilityId": "8aedea73e03b1094", "scanner": "scanner-primary", "fingerprint": "92efc61feef36a2c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-aaaf9eeb2987208f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/admin/BusinessReferralsTab.tsx:107"}, "properties": {"repobilityId": "34c461f9fa58d4d2", "scanner": "scanner-primary", "fingerprint": "aaaf9eeb2987208f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4b0432b6a3999ee4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/injury/InjuryProgressTimeline.tsx:254"}, "properties": {"repobilityId": "490258405579e723", "scanner": "scanner-primary", "fingerprint": "4b0432b6a3999ee4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-530cdbcd0730d97c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/injury/AutoModifiedWorkoutsView.tsx:78"}, "properties": {"repobilityId": "c3a3c37a6c4496bc", "scanner": "scanner-primary", "fingerprint": "530cdbcd0730d97c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-db3bbfed309bf78b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/injury/ACWRRiskMonitor.tsx:214"}, "properties": {"repobilityId": "5c82a0fcf0fc8cb3", "scanner": "scanner-primary", "fingerprint": "db3bbfed309bf78b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3315ac39a43accb5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/injury/InjuryAlertCenter.tsx:208"}, "properties": {"repobilityId": "f8cddc4efb58bc3a", "scanner": "scanner-primary", "fingerprint": "3315ac39a43accb5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-921b3a56007281b9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/programs/ProgramExportButton.tsx:132"}, "properties": {"repobilityId": "489bf15b81162f41", "scanner": "scanner-primary", "fingerprint": "921b3a56007281b9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c42cecdd86264eea", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/live-hr/LiveHRDashboard.tsx:153"}, "properties": {"repobilityId": "b271089d77adbcb3", "scanner": "scanner-primary", "fingerprint": "c42cecdd86264eea", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e33df64cf9e0652c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/live-hr/MachineCapturePanel.tsx:159"}, "properties": {"repobilityId": "628550ec3423b357", "scanner": "scanner-primary", "fingerprint": "e33df64cf9e0652c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-469b832df23eea9e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/strength/SessionBuilder.tsx:389"}, "properties": {"repobilityId": "3ce11c157a707377", "scanner": "scanner-primary", "fingerprint": "469b832df23eea9e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-faa387afe188918d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/strength/StrengthSessionLibrary.tsx:246"}, "properties": {"repobilityId": "f78f5733b58d8ae2", "scanner": "scanner-primary", "fingerprint": "faa387afe188918d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0c479f134bd5178b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/strength/SectionWorkoutBuilder.tsx:473"}, "properties": {"repobilityId": "331a3a07012076fc", "scanner": "scanner-primary", "fingerprint": "0c479f134bd5178b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ee7075c5ba0b6d19", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/strength/StrengthDashboard.tsx:592"}, "properties": {"repobilityId": "8b04b64516bf5e1a", "scanner": "scanner-primary", "fingerprint": "ee7075c5ba0b6d19", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-221b69fd3d6cb11f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/strength/BulkPRImportDialog.tsx:222"}, "properties": {"repobilityId": "946347f0b2a9fdb3", "scanner": "scanner-primary", "fingerprint": "221b69fd3d6cb11f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-28d6bdf5ff36056a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/strength/StrengthSessionAssignmentDialog.tsx:143"}, "properties": {"repobilityId": "83af04bc37821962", "scanner": "scanner-primary", "fingerprint": "28d6bdf5ff36056a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1c68bca2a3622f06", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/onboarding/ClubOnboardingWizard.tsx:144"}, "properties": {"repobilityId": "5a118585f73492a8", "scanner": "scanner-primary", "fingerprint": "1c68bca2a3622f06", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3395b0b12d36598b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/clients/SportProfileEditor.tsx:337"}, "properties": {"repobilityId": "f122453414552b5a", "scanner": "scanner-primary", "fingerprint": "3395b0b12d36598b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a0bbad790ef62696", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/video-analysis/VideoUploader.tsx:243"}, "properties": {"repobilityId": "00ee3aea244e3352", "scanner": "scanner-primary", "fingerprint": "a0bbad790ef62696", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7efaa62b021386c9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/video-analysis/VideoAnalysisList.tsx:112"}, "properties": {"repobilityId": "102245d5065b5c1a", "scanner": "scanner-primary", "fingerprint": "7efaa62b021386c9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-dda3a4c5c909c60d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/video-analysis/PoseAnalyzer.tsx:716"}, "properties": {"repobilityId": "3e7e9ec70270ca5f", "scanner": "scanner-primary", "fingerprint": "dda3a4c5c909c60d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8592086b657f0fa9", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/coach/video-analysis/pose-analyzer/calculate-joint-angles.ts:47"}, "properties": {"repobilityId": "9e1cd91320ffeb2b", "scanner": "scanner-primary", "fingerprint": "8592086b657f0fa9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-083fec5c6b789fa0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/team-calendar/EditEventDialog.tsx:561"}, "properties": {"repobilityId": "5e329d658d5c21fe", "scanner": "scanner-primary", "fingerprint": "083fec5c6b789fa0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-919bfefda128e765", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/team-calendar/TeamCalendarView.tsx:297"}, "properties": {"repobilityId": "2bb1c58d7fb3934a", "scanner": "scanner-primary", "fingerprint": "919bfefda128e765", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4f5a9b75bac1754a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/team-calendar/CreateEventDialog.tsx:133"}, "properties": {"repobilityId": "35a2c1f9108bebe6", "scanner": "scanner-primary", "fingerprint": "4f5a9b75bac1754a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-746b685a48e67a89", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/team-calendar/PlanTeamWorkoutDialog.tsx:183"}, "properties": {"repobilityId": "cedfb01d37bd4a9b", "scanner": "scanner-primary", "fingerprint": "746b685a48e67a89", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c48d0490d0b9987d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/calculators/VDOTCalculator.tsx:68"}, "properties": {"repobilityId": "e756d4e7ee37b66e", "scanner": "scanner-primary", "fingerprint": "c48d0490d0b9987d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0c94850de20b20ef", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/cross-training/SubstitutionSchedule.tsx:49"}, "properties": {"repobilityId": "4518e52a71e8ec24", "scanner": "scanner-primary", "fingerprint": "0c94850de20b20ef", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d3999c1796bde601", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/cross-training/FitnessProjection.tsx:53"}, "properties": {"repobilityId": "e0daf155ead76607", "scanner": "scanner-primary", "fingerprint": "d3999c1796bde601", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4aa81f4b0376b73f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/cross-training/ModalityPreferences.tsx:43"}, "properties": {"repobilityId": "f33cd6fed3d2c739", "scanner": "scanner-primary", "fingerprint": "4aa81f4b0376b73f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7198f24ccfd23266", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/goal-based/GoalZoneWizard.tsx:151"}, "properties": {"repobilityId": "6a21ffea58571e5b", "scanner": "scanner-primary", "fingerprint": "7198f24ccfd23266", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-eb4ec3df807e3903", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/sport-views/HockeyAthleteView.tsx:756"}, "properties": {"repobilityId": "ae09781529e83941", "scanner": "scanner-primary", "fingerprint": "eb4ec3df807e3903", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-327e7c8f18e35542", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coach/sport-views/ErgometerAthleteView.tsx:137"}, "properties": {"repobilityId": "8a0b1b5500d4b3d9", "scanner": "scanner-primary", "fingerprint": "327e7c8f18e35542", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-efb95acd8332e365", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/ChangeSportDialog.tsx:112"}, "properties": {"repobilityId": "b20611615fb5119a", "scanner": "scanner-primary", "fingerprint": "efb95acd8332e365", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a05c9164ae1d64e2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/VBTUploadWidget.tsx:130"}, "properties": {"repobilityId": "5d83949916e34a16", "scanner": "scanner-primary", "fingerprint": "a05c9164ae1d64e2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-635b5f44a9255b07", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/MorningBriefingCard.tsx:69"}, "properties": {"repobilityId": "5337da50d232ac2d", "scanner": "scanner-primary", "fingerprint": "635b5f44a9255b07", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-23b248ceddeee79e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/AgilityWorkoutExecution.tsx:185"}, "properties": {"repobilityId": "a4d7926efa594af2", "scanner": "scanner-primary", "fingerprint": "23b248ceddeee79e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7832b1ec0db456e0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/PostWorkoutCheckCard.tsx:97"}, "properties": {"repobilityId": "6b6675683e27cf03", "scanner": "scanner-primary", "fingerprint": "7832b1ec0db456e0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1ab983e7a34c0b93", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/athlete/AthleteTestProfileCard.tsx:3"}, "properties": {"repobilityId": "27396e8efb9ee8e7", "scanner": "scanner-primary", "fingerprint": "1ab983e7a34c0b93", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a553dad0c1987096", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/ErgometerDashboard.tsx:208"}, "properties": {"repobilityId": "7221234ba349a19d", "scanner": "scanner-primary", "fingerprint": "a553dad0c1987096", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1b2ecc064f128fcc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/PreWorkoutNudgeCard.tsx:70"}, "properties": {"repobilityId": "95cc4f330fb52934", "scanner": "scanner-primary", "fingerprint": "1b2ecc064f128fcc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a642332dd52cbc15", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/PatternAlertCard.tsx:90"}, "properties": {"repobilityId": "135a6c712aa18e4e", "scanner": "scanner-primary", "fingerprint": "a642332dd52cbc15", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b15646b482c2c943", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/MilestoneCelebrationCard.tsx:78"}, "properties": {"repobilityId": "37ebab0fc5de22f2", "scanner": "scanner-primary", "fingerprint": "b15646b482c2c943", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fa41ba56af8b06c1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/DailyCheckInForm.tsx:312"}, "properties": {"repobilityId": "fc4c79b78c1b8162", "scanner": "scanner-primary", "fingerprint": "fa41ba56af8b06c1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-48a55fadbe9d5c4c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/RacePredictionWidget.tsx:155"}, "properties": {"repobilityId": "b0c1b5a7e042ae70", "scanner": "scanner-primary", "fingerprint": "48a55fadbe9d5c4c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a93a3d0875fed5aa", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/WorkoutLoggingForm.tsx:240"}, "properties": {"repobilityId": "04df1bef11147bd3", "scanner": "scanner-primary", "fingerprint": "a93a3d0875fed5aa", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b4c30fceecf6ddce", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/workout/HeadlessVoiceCoach.tsx:50"}, "properties": {"repobilityId": "7af07f1b74ca1a03", "scanner": "scanner-primary", "fingerprint": "b4c30fceecf6ddce", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cf9a207e92d54ed8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/workout/WorkoutFocusMode.tsx:188"}, "properties": {"repobilityId": "9f7f16ff0e8643e3", "scanner": "scanner-primary", "fingerprint": "cf9a207e92d54ed8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2c4c7a9d717d57da", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/workout/FocusModeWorkout.tsx:368"}, "properties": {"repobilityId": "6694245ba48ca6c9", "scanner": "scanner-primary", "fingerprint": "2c4c7a9d717d57da", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-346e44536a616dea", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/workout/NewProgramDialog.tsx:93"}, "properties": {"repobilityId": "a925dee028c4efe6", "scanner": "scanner-primary", "fingerprint": "346e44536a616dea", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f7f73365e7a1ccf0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/settings/MacroSplitEditor.tsx:281"}, "properties": {"repobilityId": "d38e0552dbef73fc", "scanner": "scanner-primary", "fingerprint": "f7f73365e7a1ccf0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0f6304cff6b6c005", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/settings/AIContextSettings.tsx:267"}, "properties": {"repobilityId": "44029ce3b365a7e7", "scanner": "scanner-primary", "fingerprint": "0f6304cff6b6c005", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e925b4b9cfc468fb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/adhoc/VoiceCapture.tsx:188"}, "properties": {"repobilityId": "70dc66b850620835", "scanner": "scanner-primary", "fingerprint": "e925b4b9cfc468fb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fd4e28bab13041f2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/adhoc/PhotoCapture.tsx:94"}, "properties": {"repobilityId": "99d302bc873c1ba6", "scanner": "scanner-primary", "fingerprint": "fd4e28bab13041f2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cca96519e629dd97", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/ai/MemoryIndicator.tsx:80"}, "properties": {"repobilityId": "95dfef6956860f01", "scanner": "scanner-primary", "fingerprint": "cca96519e629dd97", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e79a2a61cf21e942", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/ai/AthleteFloatingChat.tsx:634"}, "properties": {"repobilityId": "29880ded4a79b0d3", "scanner": "scanner-primary", "fingerprint": "e79a2a61cf21e942", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-85b6706354482955", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/ai/useAthleteChatVoice.ts:576"}, "properties": {"repobilityId": "309b08885e44d8c9", "scanner": "scanner-primary", "fingerprint": "85b6706354482955", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3cf1f69069a70717", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/shareable/ShareAchievementButton.tsx:102"}, "properties": {"repobilityId": "9e02371411102b5d", "scanner": "scanner-primary", "fingerprint": "3cf1f69069a70717", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-71faa1697f0d65f8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/cardio/AthleteCardioClient.tsx:283"}, "properties": {"repobilityId": "daab92043e5579ea", "scanner": "scanner-primary", "fingerprint": "71faa1697f0d65f8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5d0cd34843f31cc4", "level": "none", "message": {"text": "Commented-code block (7 lines) in components/athlete/cardio/IntervalTimer.tsx:189"}, "properties": {"repobilityId": "7f29379ec92b8204", "scanner": "scanner-primary", "fingerprint": "5d0cd34843f31cc4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-64037215618529e8", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/athlete/cardio/CardioFocusModeWorkout.tsx:220"}, "properties": {"repobilityId": "c7bb5cf7e0af03a1", "scanner": "scanner-primary", "fingerprint": "64037215618529e8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-69a8e380a028253a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/hybrid/HybridWorkoutDetail.tsx:624"}, "properties": {"repobilityId": "0ada8dc9fe34a268", "scanner": "scanner-primary", "fingerprint": "69a8e380a028253a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d652050ba7d6c085", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/dashboard/AccountabilityStreakWidget.tsx:32"}, "properties": {"repobilityId": "5e76e08f07b86bba", "scanner": "scanner-primary", "fingerprint": "d652050ba7d6c085", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c5851364a4c232aa", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/agent/AgentRecommendationsPanel.tsx:73"}, "properties": {"repobilityId": "a6597525aa8bb829", "scanner": "scanner-primary", "fingerprint": "c5851364a4c232aa", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8602c4aed5f5e028", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/pacing/RacePacingCard.tsx:184"}, "properties": {"repobilityId": "28cb1841cc90a6ca", "scanner": "scanner-primary", "fingerprint": "8602c4aed5f5e028", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ea3b7dd09615cb10", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/interval-results/IntervalResultsHistory.tsx:82"}, "properties": {"repobilityId": "258a44a6bb7cbd1d", "scanner": "scanner-primary", "fingerprint": "ea3b7dd09615cb10", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9b123f1130464e03", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/audio-journal/AudioRecorder.tsx:309"}, "properties": {"repobilityId": "769a0e73a0f79d7b", "scanner": "scanner-primary", "fingerprint": "9b123f1130464e03", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d3926ffdf6f58cd6", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/athlete/strength/StrengthFocusMode.tsx:149"}, "properties": {"repobilityId": "472e78fb3835929e", "scanner": "scanner-primary", "fingerprint": "d3926ffdf6f58cd6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9b1c539da633a478", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/strength/StrengthFocusMode.tsx:505"}, "properties": {"repobilityId": "0619664b1d9b7f6d", "scanner": "scanner-primary", "fingerprint": "9b1c539da633a478", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b6205f25f3f3262d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/strength/StrengthTemplateSelector.tsx:121"}, "properties": {"repobilityId": "dddcbed94afd1e17", "scanner": "scanner-primary", "fingerprint": "b6205f25f3f3262d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-430bef2f38243dde", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/nutrition/VoiceMealCapture.tsx:71"}, "properties": {"repobilityId": "9dd2c3dd2469e847", "scanner": "scanner-primary", "fingerprint": "430bef2f38243dde", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-73dc575e22012aab", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/athlete/nutrition/QuickMealLog.tsx:464"}, "properties": {"repobilityId": "38a004e3053ab828", "scanner": "scanner-primary", "fingerprint": "73dc575e22012aab", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-73442c0166731a36", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/nutrition/QuickMealLog.tsx:424"}, "properties": {"repobilityId": "59967deadc9ade7a", "scanner": "scanner-primary", "fingerprint": "73442c0166731a36", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b7afc6ea33441d18", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/nutrition/DailyNutritionCard.tsx:239"}, "properties": {"repobilityId": "e8a3d6afd1126ab8", "scanner": "scanner-primary", "fingerprint": "b7afc6ea33441d18", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9829d856dab0b52d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/browse-workouts/BrowseWorkoutsClient.tsx:56"}, "properties": {"repobilityId": "46b3ed84b2cb9cb9", "scanner": "scanner-primary", "fingerprint": "9829d856dab0b52d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-607242f4b795272d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/video/AthleteVideoUploader.tsx:243"}, "properties": {"repobilityId": "5dfe887ebbce7ef3", "scanner": "scanner-primary", "fingerprint": "607242f4b795272d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1ca3c3764d21522f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/injury-prevention/InjuryPreventionDashboard.tsx:66"}, "properties": {"repobilityId": "7e05f1acf680c4f2", "scanner": "scanner-primary", "fingerprint": "1ca3c3764d21522f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bcd439fa48c1ba17", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/athlete/injury-prevention/InjuryPreventionWidget.tsx:70"}, "properties": {"repobilityId": "c477cb1a63647ee0", "scanner": "scanner-primary", "fingerprint": "bcd439fa48c1ba17", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2c0978f01fc50672", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/strength/MuscleGroupDashboard.tsx:96"}, "properties": {"repobilityId": "1566e2c804fc51c0", "scanner": "scanner-primary", "fingerprint": "2c0978f01fc50672", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ea7bc7e07b1daf1a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/onboarding/OnboardingWizard.tsx:362"}, "properties": {"repobilityId": "f4af2988894f99d6", "scanner": "scanner-primary", "fingerprint": "ea7bc7e07b1daf1a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-dfa062cc00679aa9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/auto-optimize/AutoOptimizeDashboard.tsx:269"}, "properties": {"repobilityId": "1e0e8417774a428c", "scanner": "scanner-primary", "fingerprint": "dfa062cc00679aa9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-024ada8e55488a8e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/reports/EmailReportButton.tsx:82"}, "properties": {"repobilityId": "bff97c47287457d9", "scanner": "scanner-primary", "fingerprint": "024ada8e55488a8e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a90d3aa9231716bc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/documents/DocumentUploader.tsx:46"}, "properties": {"repobilityId": "f9ae12b16e071c45", "scanner": "scanner-primary", "fingerprint": "a90d3aa9231716bc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-21bc0a240972722c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/physio/AcuteReportDetailClient.tsx:272"}, "properties": {"repobilityId": "78d0f6bc41e911d8", "scanner": "scanner-primary", "fingerprint": "21bc0a240972722c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ea820466e73eff69", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/physio/AcuteReportsClient.tsx:151"}, "properties": {"repobilityId": "b04f49fe74b8ebcf", "scanner": "scanner-primary", "fingerprint": "ea820466e73eff69", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-31c68e8be3208fb6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/coaches/CoachDirectoryClient.tsx:93"}, "properties": {"repobilityId": "8eb54de29dd499eb", "scanner": "scanner-primary", "fingerprint": "31c68e8be3208fb6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-295f6af93b0caaba", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/nutrition/FoodPhotoScanner.test.tsx:79"}, "properties": {"repobilityId": "8a28ee7ec3fc83e7", "scanner": "scanner-primary", "fingerprint": "295f6af93b0caaba", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-001b9811ffc5116c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/nutrition/NutritionDashboard.tsx:116"}, "properties": {"repobilityId": "db8e457ef7b4cdd0", "scanner": "scanner-primary", "fingerprint": "001b9811ffc5116c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-80fbd4b93d42c667", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/nutrition/FoodPhotoScanner.tsx:285"}, "properties": {"repobilityId": "2f48163a66c62d0f", "scanner": "scanner-primary", "fingerprint": "80fbd4b93d42c667", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a6d28dab7f24bf58", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/nutrition/FoodPhotoScanner.tsx:661"}, "properties": {"repobilityId": "8a6ddac16c71fc56", "scanner": "scanner-primary", "fingerprint": "a6d28dab7f24bf58", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9a380b0fabf890a8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/nutrition/FoodHistoryPage.tsx:142"}, "properties": {"repobilityId": "fd1429cd2ac1798f", "scanner": "scanner-primary", "fingerprint": "9a380b0fabf890a8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f1fb04dde42ff493", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/nutrition/wrapped/NutritionWrappedPage.tsx:126"}, "properties": {"repobilityId": "bf00c560b5cf7e4d", "scanner": "scanner-primary", "fingerprint": "f1fb04dde42ff493", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b74b5820ba94ed4b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/hybrid-studio/HybridWorkoutBuilder.tsx:476"}, "properties": {"repobilityId": "f9a1827b21b9881b", "scanner": "scanner-primary", "fingerprint": "b74b5820ba94ed4b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4d9b5e6ef3ef3124", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/hybrid-studio/WorkoutAssignmentDialog.tsx:168"}, "properties": {"repobilityId": "6aa38d8209f3a37f", "scanner": "scanner-primary", "fingerprint": "4d9b5e6ef3ef3124", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1577afa5344845e6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/hybrid-studio/HybridStudioClient.tsx:448"}, "properties": {"repobilityId": "2a693a7da28f66da", "scanner": "scanner-primary", "fingerprint": "1577afa5344845e6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f8fb91f2faa2365d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/calendar/UnifiedCalendar.tsx:61"}, "properties": {"repobilityId": "0451e5310ffa004f", "scanner": "scanner-primary", "fingerprint": "f8fb91f2faa2365d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9df8e507a5b87691", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/calendar/CalendarAssignDialog.tsx:131"}, "properties": {"repobilityId": "b786a422d7207ccd", "scanner": "scanner-primary", "fingerprint": "9df8e507a5b87691", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d1e5c5c6d22e9626", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/calendar/CalendarWorkoutDetailSheet.tsx:273"}, "properties": {"repobilityId": "b85dbe7b26f603ba", "scanner": "scanner-primary", "fingerprint": "d1e5c5c6d22e9626", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0d2103b0ec288488", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/calendar/NotificationsPanel.tsx:50"}, "properties": {"repobilityId": "8811523faf987812", "scanner": "scanner-primary", "fingerprint": "0d2103b0ec288488", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-15590bf350ce7a2a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/calendar/EventFormDialog.tsx:208"}, "properties": {"repobilityId": "0349f116c25bd9bb", "scanner": "scanner-primary", "fingerprint": "15590bf350ce7a2a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ba481758d6cd3268", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/calendar/day-sidebar/detail-panels/workout.tsx:133"}, "properties": {"repobilityId": "400647e471e7efaa", "scanner": "scanner-primary", "fingerprint": "ba481758d6cd3268", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-313a98e82c090cc9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/feedback/BetaFeedbackWidget.tsx:219"}, "properties": {"repobilityId": "1ebc3950c8e60cce", "scanner": "scanner-primary", "fingerprint": "313a98e82c090cc9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2e31be61a1a0f3d5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/forms/TestDataForm.tsx:280"}, "properties": {"repobilityId": "b2f3150c0150f021", "scanner": "scanner-primary", "fingerprint": "2e31be61a1a0f3d5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ebdb0b65e1a5b118", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/workouts/CardioWorkoutPreview.tsx:297"}, "properties": {"repobilityId": "ba091212d881365c", "scanner": "scanner-primary", "fingerprint": "ebdb0b65e1a5b118", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a5d54025caf5b90c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/workouts/StrengthWorkoutPreview.tsx:83"}, "properties": {"repobilityId": "bbb293352083242c", "scanner": "scanner-primary", "fingerprint": "a5d54025caf5b90c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-41dec72d1ae853be", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/workouts/AgilityWorkoutPreview.tsx:152"}, "properties": {"repobilityId": "dc60a53916d691e0", "scanner": "scanner-primary", "fingerprint": "41dec72d1ae853be", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f343b6cc681a231b", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/workouts/import/ImportWorkoutDialog.tsx:392"}, "properties": {"repobilityId": "ac0e45cde20eca86", "scanner": "scanner-primary", "fingerprint": "f343b6cc681a231b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-aa931edb90c21d9d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/workouts/import/ImportWorkoutDialog.tsx:303"}, "properties": {"repobilityId": "cd2640e1d17937f1", "scanner": "scanner-primary", "fingerprint": "aa931edb90c21d9d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6cd140990bcd0ebe", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/settings/api-keys/route.ts:194"}, "properties": {"repobilityId": "c2837ef9a7f73d23", "scanner": "scanner-primary", "fingerprint": "6cd140990bcd0ebe", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3d7ec77317ee423f", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/settings/default-model/route.ts:96"}, "properties": {"repobilityId": "0840da3dd3dd1557", "scanner": "scanner-primary", "fingerprint": "3d7ec77317ee423f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a73f7d90d5ca3a79", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/ai/food-scan/recipe/route.ts:50"}, "properties": {"repobilityId": "5c9087bbf980881e", "scanner": "scanner-primary", "fingerprint": "a73f7d90d5ca3a79", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1504616ea804ee92", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/ai/chat/realtime-call/route.ts:473"}, "properties": {"repobilityId": "d9b816bde8c6b9b7", "scanner": "scanner-primary", "fingerprint": "1504616ea804ee92", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-29e8e58eeedacb13", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/ai/test-import/route.ts:486"}, "properties": {"repobilityId": "7f9b87bca3636946", "scanner": "scanner-primary", "fingerprint": "29e8e58eeedacb13", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-55a212e72fd61fc6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/auth/google/callback/route.ts:137"}, "properties": {"repobilityId": "f13cdfbfadb830c2", "scanner": "scanner-primary", "fingerprint": "55a212e72fd61fc6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5f86f4d04d47c055", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/auth/callback/route.ts:36"}, "properties": {"repobilityId": "17f2ea2620c61aec", "scanner": "scanner-primary", "fingerprint": "5f86f4d04d47c055", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b23397be1a07fc90", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/strength-pr/from-set/route.ts:128"}, "properties": {"repobilityId": "39518f4c61336c04", "scanner": "scanner-primary", "fingerprint": "b23397be1a07fc90", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-632a6e242da82b03", "level": "note", "message": {"text": "Legacy-named symbol `embedding_v2` in app/api/admin/ai-skills/audit/route.ts:55"}, "properties": {"repobilityId": "b8604a0498619c5c", "scanner": "scanner-primary", "fingerprint": "632a6e242da82b03", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-948ae9feaa8ebc5e", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/programs/import-parse/route.ts:62"}, "properties": {"repobilityId": "3b5ee00d58e8de1e", "scanner": "scanner-primary", "fingerprint": "948ae9feaa8ebc5e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-96c30ee75bf301cd", "level": "none", "message": {"text": "Commented-code block (7 lines) in app/api/exports/program-pdf/route.ts:75"}, "properties": {"repobilityId": "88848340216c95b3", "scanner": "scanner-primary", "fingerprint": "96c30ee75bf301cd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3ec3428eaa83f562", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/coach/admin/ai-keys/route.ts:125"}, "properties": {"repobilityId": "25f0136e98c8adbe", "scanner": "scanner-primary", "fingerprint": "3ec3428eaa83f562", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3558aff356c10809", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/coach/admin/branding/custom-email-domain/route.ts:5"}, "properties": {"repobilityId": "268c46cdb2ee67f5", "scanner": "scanner-primary", "fingerprint": "3558aff356c10809", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-932c547e704f319e", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/api/strength-sessions/[id]/focus-mode/route.ts:231"}, "properties": {"repobilityId": "b6de9117a054759b", "scanner": "scanner-primary", "fingerprint": "932c547e704f319e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cc3c4ac1a530b91b", "level": "none", "message": {"text": "Commented-code block (9 lines) in app/api/webhooks/resend/route.ts:8"}, "properties": {"repobilityId": "73676c0859d19163", "scanner": "scanner-primary", "fingerprint": "cc3c4ac1a530b91b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a856770ff455a78b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/calendar/external/[id]/sync/route.ts:346"}, "properties": {"repobilityId": "c81f3b7d4b9d24f0", "scanner": "scanner-primary", "fingerprint": "a856770ff455a78b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-72516e05dee9445b", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/meals/[mealId]/route.ts:180"}, "properties": {"repobilityId": "5b7043322a793edd", "scanner": "scanner-primary", "fingerprint": "72516e05dee9445b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-141e0a77333d8258", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/workouts/create/route.ts:78"}, "properties": {"repobilityId": "70212bba8e29fde7", "scanner": "scanner-primary", "fingerprint": "141e0a77333d8258", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-39a52bc45120b6e9", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/(business)/[businessSlug]/coach/referrals/page.tsx:84"}, "properties": {"repobilityId": "299712e744276ef3", "scanner": "scanner-primary", "fingerprint": "39a52bc45120b6e9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d17439119364f5a4", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/(business)/[businessSlug]/coach/subscription/page.tsx:39"}, "properties": {"repobilityId": "7b3e61176f886fb7", "scanner": "scanner-primary", "fingerprint": "d17439119364f5a4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-62b56e3498e321ae", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/(business)/[businessSlug]/coach/teams/[teamId]/page.tsx:3"}, "properties": {"repobilityId": "aa7ce9cd39157713", "scanner": "scanner-primary", "fingerprint": "62b56e3498e321ae", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4b32d61e414c5484", "level": "none", "message": {"text": "Commented-code block (7 lines) in app/(business)/[businessSlug]/coach/teams/[teamId]/uppfoljning/page.tsx:15"}, "properties": {"repobilityId": "0395c415f4601670", "scanner": "scanner-primary", "fingerprint": "4b32d61e414c5484", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b8a4b70649a6aa2d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(business)/[businessSlug]/physio/dashboard/page.tsx:76"}, "properties": {"repobilityId": "6b3b2cbd2749c739", "scanner": "scanner-primary", "fingerprint": "b8a4b70649a6aa2d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-db817fc19b032f8a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(business)/[businessSlug]/physio/athletes/page.tsx:87"}, "properties": {"repobilityId": "011c428da912681c", "scanner": "scanner-primary", "fingerprint": "db817fc19b032f8a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-378068667f4b327e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(business)/[businessSlug]/physio/messages/page.tsx:90"}, "properties": {"repobilityId": "8e6eee51bde72a2e", "scanner": "scanner-primary", "fingerprint": "378068667f4b327e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6b131776ea3fc767", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(business)/[businessSlug]/physio/rehab-programs/page.tsx:103"}, "properties": {"repobilityId": "ef3ca68d00dbe2d2", "scanner": "scanner-primary", "fingerprint": "6b131776ea3fc767", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-83bae32255e7c4ff", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(business)/[businessSlug]/physio/treatments/page.tsx:81"}, "properties": {"repobilityId": "dbce61f24081a7cd", "scanner": "scanner-primary", "fingerprint": "83bae32255e7c4ff", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ea29556a44d14ab9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/signup/coach/page.tsx:181"}, "properties": {"repobilityId": "aae46469dafed516", "scanner": "scanner-primary", "fingerprint": "ea29556a44d14ab9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8e9e4214425c7595", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/signup/physio/page.tsx:124"}, "properties": {"repobilityId": "939781054602575e", "scanner": "scanner-primary", "fingerprint": "8e9e4214425c7595", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-940e87fb7681ab73", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/AdminDashboardClient.tsx:288"}, "properties": {"repobilityId": "1c4d6a575f56d7c6", "scanner": "scanner-primary", "fingerprint": "940e87fb7681ab73", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-64b0a7e81feec282", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/athlete/wod/[id]/page.tsx:132"}, "properties": {"repobilityId": "e903f7b77f4206b1", "scanner": "scanner-primary", "fingerprint": "64b0a7e81feec282", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3f8da05758324be8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/athlete/rehab/[id]/AthleteRehabProgram.tsx:253"}, "properties": {"repobilityId": "4195b9ab4843e5a0", "scanner": "scanner-primary", "fingerprint": "3f8da05758324be8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cf774d46c3863d0f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/athlete/log-workout/text/page.tsx:56"}, "properties": {"repobilityId": "565fb164d81977d4", "scanner": "scanner-primary", "fingerprint": "cf774d46c3863d0f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a1d5befdf7e80c9a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/athlete/log-workout/voice/page.tsx:56"}, "properties": {"repobilityId": "16e5163d9c7f9849", "scanner": "scanner-primary", "fingerprint": "a1d5befdf7e80c9a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-250f5ea7aafb4c0a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/athlete/log-workout/photo/page.tsx:56"}, "properties": {"repobilityId": "ce281e291c778a6f", "scanner": "scanner-primary", "fingerprint": "250f5ea7aafb4c0a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a4a752511d89953d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/athlete/log-workout/manual/page.tsx:56"}, "properties": {"repobilityId": "8fab7c25edf8c21c", "scanner": "scanner-primary", "fingerprint": "a4a752511d89953d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5378e15bb7095d6e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/my/calendar/UnifiedCalendarClient.tsx:223"}, "properties": {"repobilityId": "02262de9a562f69d", "scanner": "scanner-primary", "fingerprint": "5378e15bb7095d6e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f7dfbfe885d7e16e", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/integrations/vbt/calculations.ts:125"}, "properties": {"repobilityId": "0ce8b0c06971ca27", "scanner": "scanner-primary", "fingerprint": "f7dfbfe885d7e16e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-99eb45b81a205ce8", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/__tests__/sanitize.test.ts:122"}, "properties": {"repobilityId": "0c5d068c5e3622de", "scanner": "scanner-primary", "fingerprint": "99eb45b81a205ce8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7d3ec21f9b00626b", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/email/branding.ts:97"}, "properties": {"repobilityId": "eb41947e0c36085a", "scanner": "scanner-primary", "fingerprint": "7d3ec21f9b00626b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7aeec70ef5ca7a40", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/email/branding.test.ts:67"}, "properties": {"repobilityId": "666217b501bc92d2", "scanner": "scanner-primary", "fingerprint": "7aeec70ef5ca7a40", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5194360cab59ee8d", "level": "note", "message": {"text": "Legacy-named symbol `embedding_v2` in lib/ai/embeddings.ts:8"}, "properties": {"repobilityId": "a65a1c11c25debcc", "scanner": "scanner-primary", "fingerprint": "5194360cab59ee8d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-c261b51b509d8cc9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/ai/document-processor.ts:582"}, "properties": {"repobilityId": "b72d93f4a67b56fd", "scanner": "scanner-primary", "fingerprint": "c261b51b509d8cc9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-be8c425c25a5ad4a", "level": "note", "message": {"text": "Legacy-named symbol `embedding_v2` in lib/ai/knowledge-skills.ts:402"}, "properties": {"repobilityId": "96dd5e7f28a64574", "scanner": "scanner-primary", "fingerprint": "be8c425c25a5ad4a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-4f24661072aa70b2", "level": "none", "message": {"text": "Commented-code block (6 lines) in lib/ai/user-ai-config.ts:118"}, "properties": {"repobilityId": "1c3ea1feb4a0b09b", "scanner": "scanner-primary", "fingerprint": "4f24661072aa70b2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a41790f74ebf91cc", "level": "note", "message": {"text": "Legacy-named symbol `embedding_v2` in lib/ai/__tests__/knowledge-skills.test.ts:23"}, "properties": {"repobilityId": "c33d3ae59e66b957", "scanner": "scanner-primary", "fingerprint": "a41790f74ebf91cc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-907eebaad5aa4c9e", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/managed-agents/agent-client.ts:466"}, "properties": {"repobilityId": "d998e2f52f71fdaa", "scanner": "scanner-primary", "fingerprint": "907eebaad5aa4c9e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ccef0e7154cdbbcd", "level": "note", "message": {"text": "Legacy-named symbol `daysOld` in lib/athlete-profile/freshness-calculator.ts:17"}, "properties": {"repobilityId": "56e3aa49331842d3", "scanner": "scanner-primary", "fingerprint": "ccef0e7154cdbbcd", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-faeb1d09d6bbaf04", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/operator-agents/job-queue.ts:93"}, "properties": {"repobilityId": "8414080d706a6f99", "scanner": "scanner-primary", "fingerprint": "faeb1d09d6bbaf04", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b785682eb398ff42", "level": "note", "message": {"text": "Legacy-named symbol `tooOld` in lib/operator-agents/tools/data-quality.ts:78"}, "properties": {"repobilityId": "aa22ba748c3784da", "scanner": "scanner-primary", "fingerprint": "b785682eb398ff42", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-0c46b39b9db28d61", "level": "none", "message": {"text": "Commented-code block (6 lines) in lib/chat/push.ts:3"}, "properties": {"repobilityId": "7ddb74a0d2ed861f", "scanner": "scanner-primary", "fingerprint": "0c46b39b9db28d61", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-29cd61eae0c57067", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/chat/push.ts:75"}, "properties": {"repobilityId": "47bc2ea03db63706", "scanner": "scanner-primary", "fingerprint": "29cd61eae0c57067", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5a5ac3edce293ca9", "level": "none", "message": {"text": "Commented-code block (6 lines) in lib/chat/membership.ts:7"}, "properties": {"repobilityId": "7c4dd55222ca6262", "scanner": "scanner-primary", "fingerprint": "5a5ac3edce293ca9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b2a6ed42d2ba9b3b", "level": "none", "message": {"text": "Commented-code block (6 lines) in lib/training-engine/index.ts:129"}, "properties": {"repobilityId": "03007cc5cb893d1b", "scanner": "scanner-primary", "fingerprint": "b2a6ed42d2ba9b3b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cfad0a375e70fa01", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/training-engine/monitoring/synced-strength-fatigue.ts:146"}, "properties": {"repobilityId": "866b3dce4c8cfd65", "scanner": "scanner-primary", "fingerprint": "cfad0a375e70fa01", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-69eaae93d4dd4186", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/training-engine/progression/setlog-rollup.ts:3"}, "properties": {"repobilityId": "e3a6c99acddae9b5", "scanner": "scanner-primary", "fingerprint": "69eaae93d4dd4186", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-22a1922c90665222", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/nutrition-timing/index.ts:137"}, "properties": {"repobilityId": "3decec7bdef9c824", "scanner": "scanner-primary", "fingerprint": "22a1922c90665222", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ca613e941d0c1dca", "level": "none", "message": {"text": "Commented-code block (6 lines) in lib/strength/last-performance.ts:3"}, "properties": {"repobilityId": "df68224d2e25be5b", "scanner": "scanner-primary", "fingerprint": "ca613e941d0c1dca", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0d36dc98d2c19b14", "level": "none", "message": {"text": "Commented-code block (6 lines) in lib/calculations/goal-estimation.ts:330"}, "properties": {"repobilityId": "5efd9718d7a692ab", "scanner": "scanner-primary", "fingerprint": "0d36dc98d2c19b14", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-610b3ee57d253e78", "level": "none", "message": {"text": "Commented-code block (6 lines) in lib/calculations/thresholds.ts:1059"}, "properties": {"repobilityId": "3f2fb6817a4f36bb", "scanner": "scanner-primary", "fingerprint": "610b3ee57d253e78", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f92bc985cf5f4ee5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/team-calendar/use-team-calendar-workout-link.ts:30"}, "properties": {"repobilityId": "cf6c8be8ddcbeaec", "scanner": "scanner-primary", "fingerprint": "f92bc985cf5f4ee5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-db2bdbd2421ad574", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/slack/github-code-tools.ts:29"}, "properties": {"repobilityId": "9640fe19c6529ef9", "scanner": "scanner-primary", "fingerprint": "db2bdbd2421ad574", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-243c05ee0db40f6b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 hooks/use-live-power-push.ts:72"}, "properties": {"repobilityId": "69b382adf59e9dce", "scanner": "scanner-primary", "fingerprint": "243c05ee0db40f6b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9e1b3489c5f3e70c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 hooks/use-live-voice-coach.ts:458"}, "properties": {"repobilityId": "0c6aeb90eaf58dc6", "scanner": "scanner-primary", "fingerprint": "9e1b3489c5f3e70c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cf83263767206b79", "level": "note", "message": {"text": "102 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "4779cc8caf27947d", "scanner": "scanner-primary", "fingerprint": "cf83263767206b79", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}]}]}