{"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-d3f0e2ef69485d26", "name": "`truncate` class without `title=` for hover reveal \u2014 components/water/WaterPresetChips.tsx:46", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/water/WaterPresetChips.tsx:46"}, "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-ce42ea5b9f39ed62", "name": "`truncate` class without `title=` for hover reveal \u2014 components/exercises/ExerciseCard.tsx:45", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/exercises/ExerciseCard.tsx:45"}, "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-90c3689f64b6f67d", "name": "`truncate` class without `title=` for hover reveal \u2014 components/exercises/ExerciseImageViewer.tsx:67", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/exercises/ExerciseImageViewer.tsx:67"}, "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-fdf6d7dc692ce3cb", "name": "`truncate` class without `title=` for hover reveal \u2014 components/today/TodayView.tsx:106", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/today/TodayView.tsx:106"}, "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-10fc25299c2e6f91", "name": "`truncate` class without `title=` for hover reveal \u2014 components/today/ActiveWorkoutResumeCard.tsx:58", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/today/ActiveWorkoutResumeCard.tsx:58"}, "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-5ab7d876d180d680", "name": "`truncate` class without `title=` for hover reveal \u2014 components/access/BetaAccountSection.tsx:110", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/access/BetaAccountSection.tsx:110"}, "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-4262115bd9b013f5", "name": "`truncate` class without `title=` for hover reveal \u2014 components/access/BetaAccessDenied.tsx:108", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/access/BetaAccessDenied.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-38a5b882150633f8", "name": "`truncate` class without `title=` for hover reveal \u2014 components/progress/ProgressView.tsx:500", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/progress/ProgressView.tsx:500"}, "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-bbe600795c9a4cc0", "name": "`truncate` class without `title=` for hover reveal \u2014 components/more/BetaAdminHubLink.tsx:32", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/more/BetaAdminHubLink.tsx:32"}, "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-1c6e95e30cba1aef", "name": "`truncate` class without `title=` for hover reveal \u2014 components/more/SystemHubView.tsx:257", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/more/SystemHubView.tsx:257"}, "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-9a70ef6230dbf5d7", "name": "`truncate` class without `title=` for hover reveal \u2014 components/supplements/SupplementsCard.tsx:197", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/supplements/SupplementsCard.tsx:197"}, "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-883a4423703aa7c7", "name": "`truncate` class without `title=` for hover reveal \u2014 components/supplements/SupplementLibrary.tsx:244", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/supplements/SupplementLibrary.tsx:244"}, "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-66a4a9174b2b2cce", "name": "`truncate` class without `title=` for hover reveal \u2014 components/supplements/SupplementsTracker.tsx:158", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/supplements/SupplementsTracker.tsx:158"}, "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-d3f2e3a8ebe27baf", "name": "`truncate` class without `title=` for hover reveal \u2014 components/supplements/SupplementForm.tsx:250", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/supplements/SupplementForm.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-09c96fc1d7973f56", "name": "`truncate` class without `title=` for hover reveal \u2014 components/admin/BetaAdminView.tsx:345", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/admin/BetaAdminView.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-9d2b43c3c17ecbe8", "name": "`truncate` class without `title=` for hover reveal \u2014 components/nutrition/PhotoScanCard.tsx:347", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/nutrition/PhotoScanCard.tsx:347"}, "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-b9e726ac3795122f", "name": "`truncate` class without `title=` for hover reveal \u2014 components/nutrition/FoodLogForm.tsx:231", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/nutrition/FoodLogForm.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-7e2e38266869333d", "name": "`truncate` class without `title=` for hover reveal \u2014 components/nutrition/FoodLibrary.tsx:160", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/nutrition/FoodLibrary.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-6e06a5b68ae43c67", "name": "`truncate` class without `title=` for hover reveal \u2014 components/nutrition/NutritionView.tsx:191", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/nutrition/NutritionView.tsx:191"}, "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-8ec97ad1d82bc3e8", "name": "`truncate` class without `title=` for hover reveal \u2014 components/workouts/TemplateCard.tsx:55", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/workouts/TemplateCard.tsx:55"}, "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-61a15a2d07adda1f", "name": "`truncate` class without `title=` for hover reveal \u2014 components/workouts/WorkoutsView.tsx:250", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/workouts/WorkoutsView.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-d994591e91a04702", "name": "`truncate` class without `title=` for hover reveal \u2014 components/workouts/TemplateEditor.tsx:99", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/workouts/TemplateEditor.tsx:99"}, "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-3ffef836528fd602", "name": "`truncate` class without `title=` for hover reveal \u2014 components/workouts/DraftRestoreCard.tsx:93", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/workouts/DraftRestoreCard.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-be01dea34cb5c874", "name": "`truncate` class without `title=` for hover reveal \u2014 components/workouts/WorkoutBuilder.tsx:461", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/workouts/WorkoutBuilder.tsx:461"}, "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-45d5c27691a3e40d", "name": "`truncate` class without `title=` for hover reveal \u2014 components/workouts/ExercisePicker.tsx:154", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/workouts/ExercisePicker.tsx:154"}, "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-ac21a8abf40263fb", "name": "`truncate` class without `title=` for hover reveal \u2014 components/workouts/WorkoutHistory.tsx:77", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/workouts/WorkoutHistory.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-6f2d51ed763ded9e", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/layout.tsx:54", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/layout.tsx:54"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c75892434ce8c5ee", "name": "`truncate` class without `title=` for hover reveal \u2014 app/learn/page.tsx:27", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/learn/page.tsx:27"}, "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-166dff3c3df6a10e", "name": "ORM models found but no DB engine detected", "shortDescription": {"text": "ORM models found but no DB engine detected"}, "fullDescription": {"text": "The repo defines tables/models but no DB connection string was found. Likely lives in env vars or a config file the scanner didn't read."}, "properties": {"scanner": "scanner-primary", "layer": "data", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ec5285b449bf1238", "name": "Insecure pattern 'local_storage_auth_token' in qa/verify-fixes.mjs:11", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in qa/verify-fixes.mjs:11"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9b559e8681f1d25e", "name": "Insecure pattern 'local_storage_auth_token' in qa/add-food-flow-check.mjs:18", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in qa/add-food-flow-check.mjs:18"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3189d854dac860af", "name": "Insecure pattern 'local_storage_auth_token' in qa/check360.mjs:11", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in qa/check360.mjs:11"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-07ea9127aed59691", "name": "Insecure pattern 'local_storage_auth_token' in qa/nutrition-helpers.mjs:13", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in qa/nutrition-helpers.mjs:13"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a13360a971a662ca", "name": "Insecure pattern 'local_storage_auth_token' in qa/workouts-color-identity-check.mjs:36", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in qa/workouts-color-identity-check.mjs:36"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4d9ab6644f899169", "name": "Insecure pattern 'local_storage_auth_token' in qa/today-dashboard-check.mjs:20", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in qa/today-dashboard-check.mjs:20"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3929967d0758fe3d", "name": "Insecure pattern 'local_storage_auth_token' in qa/beta-welcome-check.mjs:60", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in qa/beta-welcome-check.mjs:60"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dfced0c8938f90f9", "name": "Insecure pattern 'local_storage_auth_token' in qa/learn-check.mjs:48", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in qa/learn-check.mjs:48"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-08b440f48de7c9bd", "name": "Insecure pattern 'local_storage_auth_token' in qa/admin-access-check.mjs:49", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in qa/admin-access-check.mjs:49"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a6bea4c08f9ca386", "name": "Insecure pattern 'local_storage_auth_token' in qa/dark-mode-identity-check.mjs:40", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in qa/dark-mode-identity-check.mjs:40"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ddce0be556704043", "name": "Insecure pattern 'local_storage_auth_token' in qa/exercise-picker-check.mjs:33", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in qa/exercise-picker-check.mjs:33"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5933fefb60969ade", "name": "Insecure pattern 'local_storage_auth_token' in qa/welcome-check.mjs:30", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in qa/welcome-check.mjs:30"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-112b8f00ad5021d8", "name": "Insecure pattern 'local_storage_auth_token' in qa/qa.mjs:69", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in qa/qa.mjs:69"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ac2d2adc9e542e96", "name": "Insecure pattern 'local_storage_auth_token' in qa/console-check.mjs:12", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in qa/console-check.mjs:12"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-62f264d97c12e6d5", "name": "Insecure pattern 'node_child_process' in scripts/dev.mjs:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/dev.mjs: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-5f772ea577ecd206", "name": "Insecure pattern 'local_storage_auth_token' in scripts/qa-nutrition-smoke.mjs:12", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in scripts/qa-nutrition-smoke.mjs:12"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4509b39c5607f75a", "name": "Insecure pattern 'local_storage_auth_token' in scripts/qa-supplements.mjs:46", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in scripts/qa-supplements.mjs:46"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c72e95928e31f0c8", "name": "Insecure pattern 'local_storage_auth_token' in scripts/qa-settings.mjs:39", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in scripts/qa-settings.mjs:39"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d3262293a4dd026", "name": "Insecure pattern 'local_storage_auth_token' in scripts/qa-workout-reorder.mjs:95", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in scripts/qa-workout-reorder.mjs:95"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3033a3e94497c833", "name": "Insecure pattern 'local_storage_auth_token' in scripts/qa-backup-restore.mjs:45", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in scripts/qa-backup-restore.mjs:45"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8bf06b00ba2f44e0", "name": "Insecure pattern 'local_storage_auth_token' in scripts/qa-nutrition-reuse.mjs:82", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in scripts/qa-nutrition-reuse.mjs:82"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-314e9de15a59dd85", "name": "Insecure pattern 'local_storage_auth_token' in scripts/qa-gym-check-in.mjs:47", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in scripts/qa-gym-check-in.mjs:47"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-22333964a92fdfa9", "name": "Insecure pattern 'local_storage_auth_token' in scripts/qa-navigation.mjs:62", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in scripts/qa-navigation.mjs:62"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f77cf5e20bdd049e", "name": "Insecure pattern 'node_child_process' in scripts/qa-beta-access.mjs:22", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/qa-beta-access.mjs:22"}, "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-576f578ed50bb6f6", "name": "Insecure pattern 'local_storage_auth_token' in scripts/qa-beta-access.mjs:51", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in scripts/qa-beta-access.mjs:51"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c1266dd576b7ad4b", "name": "Insecure pattern 'local_storage_auth_token' in scripts/qa-workout-draft.mjs:70", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in scripts/qa-workout-draft.mjs:70"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d710aef800f994a4", "name": "Insecure pattern 'local_storage_auth_token' in scripts/qa-workout-session.mjs:47", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in scripts/qa-workout-session.mjs:47"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-49e531ea5c12d39e", "name": "Insecure pattern 'local_storage_auth_token' in scripts/qa-image-viewer.mjs:31", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in scripts/qa-image-viewer.mjs:31"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d2e9aa395bc88b1e", "name": "Insecure pattern 'local_storage_auth_token' in scripts/qa-exercises.mjs:49", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in scripts/qa-exercises.mjs:49"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a46e5dc1eb309602", "name": "Insecure pattern 'local_storage_auth_token' in scripts/qa-favorites.mjs:41", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in scripts/qa-favorites.mjs:41"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-91e415c83c08cce5", "name": "Insecure pattern 'node_child_process' in scripts/e2e.mjs:9", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/e2e.mjs:9"}, "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-30823a23d517b091", "name": "Insecure pattern 'local_storage_auth_token' in scripts/qa-saved-values.mjs:56", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in scripts/qa-saved-values.mjs:56"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-21742136765c8d8f", "name": "Insecure pattern 'local_storage_auth_token' in scripts/qa-progress-insights.mjs:40", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in scripts/qa-progress-insights.mjs:40"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-94935737597e589b", "name": "Insecure pattern 'local_storage_auth_token' in scripts/qa-water.mjs:50", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in scripts/qa-water.mjs:50"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5370e8e81bde7e6b", "name": "Insecure pattern 'local_storage_auth_token' in scripts/qa-workout-collapse.mjs:77", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in scripts/qa-workout-collapse.mjs:77"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-46cee331fa816516", "name": "Insecure pattern 'local_storage_auth_token' in scripts/qa-water-presets.mjs:50", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in scripts/qa-water-presets.mjs:50"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5a962511c4cdf0bf", "name": "Insecure pattern 'local_storage_auth_token' in scripts/qa-today-command-center.mjs:56", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in scripts/qa-today-command-center.mjs:56"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-eb59e1c14bf02ff6", "name": "Insecure pattern 'dangerous_innerhtml' in app/layout.tsx:54", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/layout.tsx:54"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cff9d4542b7f8146", "name": "Very large file: components/workouts/WorkoutBuilder.tsx (1231 lines)", "shortDescription": {"text": "Very large file: components/workouts/WorkoutBuilder.tsx (1231 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-d06dcccfe1e95227", "name": "Very large file: lib/seed-exercises.ts (3198 lines)", "shortDescription": {"text": "Very large file: lib/seed-exercises.ts (3198 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "0 test file(s) for 181 source file(s) (ratio 0.00). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 162 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 67 placeholder/mock markers across 29 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9d79c4077342a7d0", "name": "Runtime service client appears to use placeholder configuration", "shortDescription": {"text": "Runtime service client appears to use placeholder configuration"}, "fullDescription": {"text": "A runtime source file appears to wire Supabase/Firebase/AI/payment-style clients to placeholder URLs, keys, or fallback values. In the Fable corpus this often means the UI/API shape is present while the backend service is not actually configured."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci. 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-efeadd861a7499e9", "name": "Commented-code block (8 lines) in playwright.config.ts:3", "shortDescription": {"text": "Commented-code block (8 lines) in playwright.config.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-53e50ac3b0cacfed", "name": "`fetch()` without try/.catch or AbortSignal \u2014 qa/pwa-check.mjs:30", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 qa/pwa-check.mjs: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-1a8072146903b862", "name": "Commented-code block (8 lines) in qa/fats-food-check.mjs:3", "shortDescription": {"text": "Commented-code block (8 lines) in qa/fats-food-check.mjs: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-47b897e2d33beb48", "name": "Commented-code block (8 lines) in qa/fruits-food-check.mjs:3", "shortDescription": {"text": "Commented-code block (8 lines) in qa/fruits-food-check.mjs: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-38896aa73014cea3", "name": "Commented-code block (6 lines) in qa/workouts-color-identity-check.mjs:1", "shortDescription": {"text": "Commented-code block (6 lines) in qa/workouts-color-identity-check.mjs:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-efd1bdeb473964ac", "name": "Commented-code block (15 lines) in qa/beta-welcome-check.mjs:4", "shortDescription": {"text": "Commented-code block (15 lines) in qa/beta-welcome-check.mjs:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1da6ef9022e1d4d6", "name": "Commented-code block (9 lines) in qa/food-library-check.mjs:3", "shortDescription": {"text": "Commented-code block (9 lines) in qa/food-library-check.mjs: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-7e87afb173ff3061", "name": "Commented-code block (9 lines) in qa/admin-access-check.mjs:1", "shortDescription": {"text": "Commented-code block (9 lines) in qa/admin-access-check.mjs:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d3cde0241b867b4e", "name": "Commented-code block (6 lines) in qa/dark-mode-identity-check.mjs:1", "shortDescription": {"text": "Commented-code block (6 lines) in qa/dark-mode-identity-check.mjs:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1a96eaf5eea39b86", "name": "Commented-code block (9 lines) in qa/vegetables-food-check.mjs:3", "shortDescription": {"text": "Commented-code block (9 lines) in qa/vegetables-food-check.mjs: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-e1773d12af14879a", "name": "Commented-code block (7 lines) in qa/welcome-check.mjs:1", "shortDescription": {"text": "Commented-code block (7 lines) in qa/welcome-check.mjs:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fadd3dc116d9b3e3", "name": "Commented-code block (8 lines) in qa/carbs-food-check.mjs:3", "shortDescription": {"text": "Commented-code block (8 lines) in qa/carbs-food-check.mjs: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-073b3c103c9c383e", "name": "Commented-code block (6 lines) in scripts/qa-exercise-videos.mjs:1", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/qa-exercise-videos.mjs:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5daec07c77146189", "name": "Commented-code block (6 lines) in scripts/import-food-images.mjs:6", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/import-food-images.mjs:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2712925cb0f8f310", "name": "Commented-code block (5 lines) in scripts/qa-supplements.mjs:4", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/qa-supplements.mjs:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4738bd999b3ca67a", "name": "Commented-code block (7 lines) in scripts/qa-settings.mjs:4", "shortDescription": {"text": "Commented-code block (7 lines) in scripts/qa-settings.mjs:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-42d86a0d982fc877", "name": "Commented-code block (16 lines) in scripts/qa-workout-reorder.mjs:4", "shortDescription": {"text": "Commented-code block (16 lines) in scripts/qa-workout-reorder.mjs:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b8ca1f3456200b4f", "name": "Commented-code block (6 lines) in scripts/qa-nutrition-reuse.mjs:4", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/qa-nutrition-reuse.mjs:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-05b1256a76e618da", "name": "Commented-code block (15 lines) in scripts/qa-gym-check-in.mjs:4", "shortDescription": {"text": "Commented-code block (15 lines) in scripts/qa-gym-check-in.mjs:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c961364c91821f95", "name": "Commented-code block (5 lines) in scripts/qa-navigation.mjs:4", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/qa-navigation.mjs:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-51ae650788e3c848", "name": "Commented-code block (6 lines) in scripts/qa-beta-access.mjs:4", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/qa-beta-access.mjs:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d71e29c7cd24e235", "name": "Commented-code block (13 lines) in scripts/qa-workout-draft.mjs:4", "shortDescription": {"text": "Commented-code block (13 lines) in scripts/qa-workout-draft.mjs:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0ddfa628a3610203", "name": "Commented-code block (6 lines) in scripts/qa-workout-session.mjs:4", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/qa-workout-session.mjs:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-21a0382000ee4c47", "name": "Commented-code block (6 lines) in scripts/qa-exercises.mjs:1", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/qa-exercises.mjs:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bf5a3e99e3965163", "name": "Commented-code block (6 lines) in scripts/e2e.mjs:3", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/e2e.mjs: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-a5fe7cd5eff8f3e1", "name": "Commented-code block (6 lines) in scripts/qa-progress-insights.mjs:4", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/qa-progress-insights.mjs:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-559340d75b8502b2", "name": "Commented-code block (5 lines) in scripts/qa-workout-collapse.mjs:4", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/qa-workout-collapse.mjs:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5677cdea547e5033", "name": "Commented-code block (6 lines) in scripts/qa-water-presets.mjs:4", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/qa-water-presets.mjs:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bbfaafbecec515e6", "name": "Commented-code block (13 lines) in scripts/qa-today-command-center.mjs:8", "shortDescription": {"text": "Commented-code block (13 lines) in scripts/qa-today-command-center.mjs: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-4c85617ba606e8c2", "name": "Commented-code block (5 lines) in scripts/brand/generate-brand.mjs:3", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/brand/generate-brand.mjs: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-1180bf12ef41be05", "name": "Commented-code block (7 lines) in components/today/TodayView.tsx:322", "shortDescription": {"text": "Commented-code block (7 lines) in components/today/TodayView.tsx:322"}, "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-246e917b3c1ef5d1", "name": "Commented-code block (5 lines) in components/access/BetaWelcomeNotice.tsx:91", "shortDescription": {"text": "Commented-code block (5 lines) in components/access/BetaWelcomeNotice.tsx:91"}, "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-ee8b10e3b1ed8622", "name": "Commented-code block (6 lines) in components/ui/icons.tsx:271", "shortDescription": {"text": "Commented-code block (6 lines) in components/ui/icons.tsx:271"}, "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-27beba5b28122d45", "name": "Commented-code block (9 lines) in components/gym/GymTodayCard.tsx:3", "shortDescription": {"text": "Commented-code block (9 lines) in components/gym/GymTodayCard.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-0a1841f5382b4242", "name": "Commented-code block (9 lines) in components/supplements/supplement-catalog.ts:5", "shortDescription": {"text": "Commented-code block (9 lines) in components/supplements/supplement-catalog.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-1d6904e9c261aac1", "name": "Commented-code block (6 lines) in components/nutrition/PhotoScanCard.tsx:13", "shortDescription": {"text": "Commented-code block (6 lines) in components/nutrition/PhotoScanCard.tsx:13"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f608439cb4aad69b", "name": "Commented-code block (5 lines) in components/nutrition/PhotoDraftReview.tsx:5", "shortDescription": {"text": "Commented-code block (5 lines) in components/nutrition/PhotoDraftReview.tsx: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-bd9ebad1dac045f9", "name": "Commented-code block (5 lines) in components/workouts/WorkoutBuilder.tsx:290", "shortDescription": {"text": "Commented-code block (5 lines) in components/workouts/WorkoutBuilder.tsx:290"}, "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-5f6280746a2fc9e4", "name": "Commented-code block (5 lines) in components/workouts/ExercisePicker.tsx:129", "shortDescription": {"text": "Commented-code block (5 lines) in components/workouts/ExercisePicker.tsx: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-ac19264f517f3348", "name": "Commented-code block (5 lines) in app/api/nutrition/analyze-photo/route.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/nutrition/analyze-photo/route.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-8eed920785a4313f", "name": "Commented-code block (5 lines) in app/nutrition/page.tsx:5", "shortDescription": {"text": "Commented-code block (5 lines) in app/nutrition/page.tsx: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-651b4a38f106f90d", "name": "Commented-code block (6 lines) in lib/beta-access.ts:13", "shortDescription": {"text": "Commented-code block (6 lines) in lib/beta-access.ts:13"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7260fbd33da56078", "name": "Commented-code block (6 lines) in lib/beta-welcome.ts:5", "shortDescription": {"text": "Commented-code block (6 lines) in lib/beta-welcome.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-7cadcf69ec8e72aa", "name": "Commented-code block (5 lines) in lib/storage.ts:299", "shortDescription": {"text": "Commented-code block (5 lines) in lib/storage.ts:299"}, "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-fcca66da7ae4fcf0", "name": "Commented-code block (7 lines) in lib/nutrition-ai.ts:7", "shortDescription": {"text": "Commented-code block (7 lines) in lib/nutrition-ai.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-30cb715b176d689c", "name": "Commented-code block (7 lines) in lib/guest-session.ts:5", "shortDescription": {"text": "Commented-code block (7 lines) in lib/guest-session.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-e273a257bdffa40e", "name": "Commented-code block (6 lines) in lib/admin-access.ts:5", "shortDescription": {"text": "Commented-code block (6 lines) in lib/admin-access.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-20688f8dfd2ae78b", "name": "Commented-code block (5 lines) in lib/gym-attendance.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in lib/gym-attendance.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-4ff9aa7c0c707266", "name": "Commented-code block (8 lines) in lib/backup.ts:8", "shortDescription": {"text": "Commented-code block (8 lines) in lib/backup.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-386ef6cfd7faba95", "name": "Commented-code block (5 lines) in lib/nutrition-reuse.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in lib/nutrition-reuse.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6c281ca6f5d69f8f", "name": "Commented-code block (6 lines) in lib/nutrition-photo.ts:7", "shortDescription": {"text": "Commented-code block (6 lines) in lib/nutrition-photo.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-ed6e9939457bde25", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/nutrition-photo.ts:112", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/nutrition-photo.ts: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-435f76d46e817f44", "name": "Commented-code block (6 lines) in lib/food-library.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in lib/food-library.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-e517a79db71c96b1", "name": "Commented-code block (5 lines) in lib/supabase/client.ts:15", "shortDescription": {"text": "Commented-code block (5 lines) in lib/supabase/client.ts: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}}]}}, "automationDetails": {"id": "repobility/23456"}, "properties": {"repository": "yuvalzakay26-ship-it/yuval-fit-os", "repoUrl": "https://github.com/yuvalzakay26-ship-it/yuval-fit-os", "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-d3f0e2ef69485d26", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/water/WaterPresetChips.tsx:46"}, "properties": {"repobilityId": "ef19f1e71a47ee7c", "scanner": "scanner-primary", "fingerprint": "d3f0e2ef69485d26", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ce42ea5b9f39ed62", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/exercises/ExerciseCard.tsx:45"}, "properties": {"repobilityId": "d92a83ca6d4098fe", "scanner": "scanner-primary", "fingerprint": "ce42ea5b9f39ed62", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-90c3689f64b6f67d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/exercises/ExerciseImageViewer.tsx:67"}, "properties": {"repobilityId": "8268777db077dc85", "scanner": "scanner-primary", "fingerprint": "90c3689f64b6f67d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fdf6d7dc692ce3cb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/today/TodayView.tsx:106"}, "properties": {"repobilityId": "3bbc1e92f545b3ad", "scanner": "scanner-primary", "fingerprint": "fdf6d7dc692ce3cb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-10fc25299c2e6f91", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/today/ActiveWorkoutResumeCard.tsx:58"}, "properties": {"repobilityId": "7ae19eb33b688941", "scanner": "scanner-primary", "fingerprint": "10fc25299c2e6f91", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5ab7d876d180d680", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/access/BetaAccountSection.tsx:110"}, "properties": {"repobilityId": "a2ca54d4cf14b175", "scanner": "scanner-primary", "fingerprint": "5ab7d876d180d680", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4262115bd9b013f5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/access/BetaAccessDenied.tsx:108"}, "properties": {"repobilityId": "0842046c08e8ee50", "scanner": "scanner-primary", "fingerprint": "4262115bd9b013f5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-38a5b882150633f8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/progress/ProgressView.tsx:500"}, "properties": {"repobilityId": "e8e90b6ea53932ab", "scanner": "scanner-primary", "fingerprint": "38a5b882150633f8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bbe600795c9a4cc0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/more/BetaAdminHubLink.tsx:32"}, "properties": {"repobilityId": "3186aa1b9f1f945c", "scanner": "scanner-primary", "fingerprint": "bbe600795c9a4cc0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1c6e95e30cba1aef", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/more/SystemHubView.tsx:257"}, "properties": {"repobilityId": "e7d9f207ae1e74fa", "scanner": "scanner-primary", "fingerprint": "1c6e95e30cba1aef", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9a70ef6230dbf5d7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/supplements/SupplementsCard.tsx:197"}, "properties": {"repobilityId": "3500a31b249c4cf0", "scanner": "scanner-primary", "fingerprint": "9a70ef6230dbf5d7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-883a4423703aa7c7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/supplements/SupplementLibrary.tsx:244"}, "properties": {"repobilityId": "e7f0914e091ac090", "scanner": "scanner-primary", "fingerprint": "883a4423703aa7c7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-66a4a9174b2b2cce", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/supplements/SupplementsTracker.tsx:158"}, "properties": {"repobilityId": "450b6ccb91514531", "scanner": "scanner-primary", "fingerprint": "66a4a9174b2b2cce", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d3f2e3a8ebe27baf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/supplements/SupplementForm.tsx:250"}, "properties": {"repobilityId": "fe1a6a4933f0984c", "scanner": "scanner-primary", "fingerprint": "d3f2e3a8ebe27baf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-09c96fc1d7973f56", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/admin/BetaAdminView.tsx:345"}, "properties": {"repobilityId": "e33916c54f8f2ab2", "scanner": "scanner-primary", "fingerprint": "09c96fc1d7973f56", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9d2b43c3c17ecbe8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/nutrition/PhotoScanCard.tsx:347"}, "properties": {"repobilityId": "639beeb2cbef5a72", "scanner": "scanner-primary", "fingerprint": "9d2b43c3c17ecbe8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b9e726ac3795122f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/nutrition/FoodLogForm.tsx:231"}, "properties": {"repobilityId": "24b588806899a6ba", "scanner": "scanner-primary", "fingerprint": "b9e726ac3795122f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7e2e38266869333d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/nutrition/FoodLibrary.tsx:160"}, "properties": {"repobilityId": "d9a9256239151973", "scanner": "scanner-primary", "fingerprint": "7e2e38266869333d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6e06a5b68ae43c67", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/nutrition/NutritionView.tsx:191"}, "properties": {"repobilityId": "f8f7c020f23305ed", "scanner": "scanner-primary", "fingerprint": "6e06a5b68ae43c67", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8ec97ad1d82bc3e8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/workouts/TemplateCard.tsx:55"}, "properties": {"repobilityId": "ce4052c16ef90067", "scanner": "scanner-primary", "fingerprint": "8ec97ad1d82bc3e8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-61a15a2d07adda1f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/workouts/WorkoutsView.tsx:250"}, "properties": {"repobilityId": "3666e7a9413240da", "scanner": "scanner-primary", "fingerprint": "61a15a2d07adda1f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d994591e91a04702", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/workouts/TemplateEditor.tsx:99"}, "properties": {"repobilityId": "8921a7eb1b389ba2", "scanner": "scanner-primary", "fingerprint": "d994591e91a04702", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3ffef836528fd602", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/workouts/DraftRestoreCard.tsx:93"}, "properties": {"repobilityId": "0f6c027307a5f560", "scanner": "scanner-primary", "fingerprint": "3ffef836528fd602", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-be01dea34cb5c874", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/workouts/WorkoutBuilder.tsx:461"}, "properties": {"repobilityId": "54592f047e255342", "scanner": "scanner-primary", "fingerprint": "be01dea34cb5c874", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-45d5c27691a3e40d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/workouts/ExercisePicker.tsx:154"}, "properties": {"repobilityId": "3d95b798735e39be", "scanner": "scanner-primary", "fingerprint": "45d5c27691a3e40d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ac21a8abf40263fb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/workouts/WorkoutHistory.tsx:77"}, "properties": {"repobilityId": "3766cb19dd4c301b", "scanner": "scanner-primary", "fingerprint": "ac21a8abf40263fb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6f2d51ed763ded9e", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/layout.tsx:54"}, "properties": {"repobilityId": "6f16eb9b82a2dcd6", "scanner": "scanner-primary", "fingerprint": "6f2d51ed763ded9e", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-c75892434ce8c5ee", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/learn/page.tsx:27"}, "properties": {"repobilityId": "3d48ec0ae9ef5e3c", "scanner": "scanner-primary", "fingerprint": "c75892434ce8c5ee", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-166dff3c3df6a10e", "level": "warning", "message": {"text": "ORM models found but no DB engine detected"}, "properties": {"repobilityId": "cda36de65e114635", "scanner": "scanner-primary", "fingerprint": "166dff3c3df6a10e", "layer": "data", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-ec5285b449bf1238", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in qa/verify-fixes.mjs:11"}, "properties": {"repobilityId": "d5e3ba5990e15f93", "scanner": "scanner-primary", "fingerprint": "ec5285b449bf1238", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "qa/verify-fixes.mjs"}, "region": {"startLine": 11}}}]}, {"ruleId": "scanner-9b559e8681f1d25e", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in qa/add-food-flow-check.mjs:18"}, "properties": {"repobilityId": "a05cfce64c0a86b8", "scanner": "scanner-primary", "fingerprint": "9b559e8681f1d25e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "qa/add-food-flow-check.mjs"}, "region": {"startLine": 18}}}]}, {"ruleId": "scanner-3189d854dac860af", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in qa/check360.mjs:11"}, "properties": {"repobilityId": "5cf3100ba866094d", "scanner": "scanner-primary", "fingerprint": "3189d854dac860af", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "qa/check360.mjs"}, "region": {"startLine": 11}}}]}, {"ruleId": "scanner-07ea9127aed59691", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in qa/nutrition-helpers.mjs:13"}, "properties": {"repobilityId": "0e9239ab8a1dc532", "scanner": "scanner-primary", "fingerprint": "07ea9127aed59691", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "qa/nutrition-helpers.mjs"}, "region": {"startLine": 13}}}]}, {"ruleId": "scanner-a13360a971a662ca", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in qa/workouts-color-identity-check.mjs:36"}, "properties": {"repobilityId": "52fa3dcd7f1b9379", "scanner": "scanner-primary", "fingerprint": "a13360a971a662ca", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "qa/workouts-color-identity-check.mjs"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-4d9ab6644f899169", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in qa/today-dashboard-check.mjs:20"}, "properties": {"repobilityId": "210b2ba530c16577", "scanner": "scanner-primary", "fingerprint": "4d9ab6644f899169", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "qa/today-dashboard-check.mjs"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-3929967d0758fe3d", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in qa/beta-welcome-check.mjs:60"}, "properties": {"repobilityId": "6d3719197c2bdf96", "scanner": "scanner-primary", "fingerprint": "3929967d0758fe3d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "qa/beta-welcome-check.mjs"}, "region": {"startLine": 60}}}]}, {"ruleId": "scanner-dfced0c8938f90f9", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in qa/learn-check.mjs:48"}, "properties": {"repobilityId": "bc9b78985292b7c6", "scanner": "scanner-primary", "fingerprint": "dfced0c8938f90f9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "qa/learn-check.mjs"}, "region": {"startLine": 48}}}]}, {"ruleId": "scanner-08b440f48de7c9bd", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in qa/admin-access-check.mjs:49"}, "properties": {"repobilityId": "aa09eb205c1350e3", "scanner": "scanner-primary", "fingerprint": "08b440f48de7c9bd", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "qa/admin-access-check.mjs"}, "region": {"startLine": 49}}}]}, {"ruleId": "scanner-a6bea4c08f9ca386", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in qa/dark-mode-identity-check.mjs:40"}, "properties": {"repobilityId": "2d7a0e26a27a13fd", "scanner": "scanner-primary", "fingerprint": "a6bea4c08f9ca386", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "qa/dark-mode-identity-check.mjs"}, "region": {"startLine": 40}}}]}, {"ruleId": "scanner-ddce0be556704043", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in qa/exercise-picker-check.mjs:33"}, "properties": {"repobilityId": "5513beaa8b94e663", "scanner": "scanner-primary", "fingerprint": "ddce0be556704043", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "qa/exercise-picker-check.mjs"}, "region": {"startLine": 33}}}]}, {"ruleId": "scanner-5933fefb60969ade", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in qa/welcome-check.mjs:30"}, "properties": {"repobilityId": "3775c8d63c6b33be", "scanner": "scanner-primary", "fingerprint": "5933fefb60969ade", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "qa/welcome-check.mjs"}, "region": {"startLine": 30}}}]}, {"ruleId": "scanner-112b8f00ad5021d8", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in qa/qa.mjs:69"}, "properties": {"repobilityId": "cdcf9de93a0d3b77", "scanner": "scanner-primary", "fingerprint": "112b8f00ad5021d8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "qa/qa.mjs"}, "region": {"startLine": 69}}}]}, {"ruleId": "scanner-ac2d2adc9e542e96", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in qa/console-check.mjs:12"}, "properties": {"repobilityId": "f28ab91e9227a7e6", "scanner": "scanner-primary", "fingerprint": "ac2d2adc9e542e96", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "qa/console-check.mjs"}, "region": {"startLine": 12}}}]}, {"ruleId": "scanner-62f264d97c12e6d5", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/dev.mjs:2"}, "properties": {"repobilityId": "ccf61f89afbd7b7b", "scanner": "scanner-primary", "fingerprint": "62f264d97c12e6d5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/dev.mjs"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-5f772ea577ecd206", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in scripts/qa-nutrition-smoke.mjs:12"}, "properties": {"repobilityId": "5c572362b947a1ae", "scanner": "scanner-primary", "fingerprint": "5f772ea577ecd206", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/qa-nutrition-smoke.mjs"}, "region": {"startLine": 12}}}]}, {"ruleId": "scanner-4509b39c5607f75a", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in scripts/qa-supplements.mjs:46"}, "properties": {"repobilityId": "a12af229fb84a75e", "scanner": "scanner-primary", "fingerprint": "4509b39c5607f75a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/qa-supplements.mjs"}, "region": {"startLine": 46}}}]}, {"ruleId": "scanner-c72e95928e31f0c8", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in scripts/qa-settings.mjs:39"}, "properties": {"repobilityId": "48642027737322c4", "scanner": "scanner-primary", "fingerprint": "c72e95928e31f0c8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/qa-settings.mjs"}, "region": {"startLine": 39}}}]}, {"ruleId": "scanner-2d3262293a4dd026", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in scripts/qa-workout-reorder.mjs:95"}, "properties": {"repobilityId": "c9a8c81d5f8a090c", "scanner": "scanner-primary", "fingerprint": "2d3262293a4dd026", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/qa-workout-reorder.mjs"}, "region": {"startLine": 95}}}]}, {"ruleId": "scanner-3033a3e94497c833", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in scripts/qa-backup-restore.mjs:45"}, "properties": {"repobilityId": "7a0a1d5585f07df5", "scanner": "scanner-primary", "fingerprint": "3033a3e94497c833", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/qa-backup-restore.mjs"}, "region": {"startLine": 45}}}]}, {"ruleId": "scanner-8bf06b00ba2f44e0", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in scripts/qa-nutrition-reuse.mjs:82"}, "properties": {"repobilityId": "1da965f9f6312a54", "scanner": "scanner-primary", "fingerprint": "8bf06b00ba2f44e0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/qa-nutrition-reuse.mjs"}, "region": {"startLine": 82}}}]}, {"ruleId": "scanner-314e9de15a59dd85", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in scripts/qa-gym-check-in.mjs:47"}, "properties": {"repobilityId": "c8918f46ceca6d4f", "scanner": "scanner-primary", "fingerprint": "314e9de15a59dd85", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/qa-gym-check-in.mjs"}, "region": {"startLine": 47}}}]}, {"ruleId": "scanner-22333964a92fdfa9", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in scripts/qa-navigation.mjs:62"}, "properties": {"repobilityId": "ead51cd13a17d1d4", "scanner": "scanner-primary", "fingerprint": "22333964a92fdfa9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/qa-navigation.mjs"}, "region": {"startLine": 62}}}]}, {"ruleId": "scanner-f77cf5e20bdd049e", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/qa-beta-access.mjs:22"}, "properties": {"repobilityId": "d6dcfd103c0f7910", "scanner": "scanner-primary", "fingerprint": "f77cf5e20bdd049e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/qa-beta-access.mjs"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-576f578ed50bb6f6", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in scripts/qa-beta-access.mjs:51"}, "properties": {"repobilityId": "15670cc7d44a6c92", "scanner": "scanner-primary", "fingerprint": "576f578ed50bb6f6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/qa-beta-access.mjs"}, "region": {"startLine": 51}}}]}, {"ruleId": "scanner-c1266dd576b7ad4b", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in scripts/qa-workout-draft.mjs:70"}, "properties": {"repobilityId": "3abe37531b69a4e5", "scanner": "scanner-primary", "fingerprint": "c1266dd576b7ad4b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/qa-workout-draft.mjs"}, "region": {"startLine": 70}}}]}, {"ruleId": "scanner-d710aef800f994a4", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in scripts/qa-workout-session.mjs:47"}, "properties": {"repobilityId": "3c750764e2c2065c", "scanner": "scanner-primary", "fingerprint": "d710aef800f994a4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/qa-workout-session.mjs"}, "region": {"startLine": 47}}}]}, {"ruleId": "scanner-49e531ea5c12d39e", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in scripts/qa-image-viewer.mjs:31"}, "properties": {"repobilityId": "16555cbc3269ee80", "scanner": "scanner-primary", "fingerprint": "49e531ea5c12d39e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/qa-image-viewer.mjs"}, "region": {"startLine": 31}}}]}, {"ruleId": "scanner-d2e9aa395bc88b1e", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in scripts/qa-exercises.mjs:49"}, "properties": {"repobilityId": "0b3869e3726d3de4", "scanner": "scanner-primary", "fingerprint": "d2e9aa395bc88b1e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/qa-exercises.mjs"}, "region": {"startLine": 49}}}]}, {"ruleId": "scanner-a46e5dc1eb309602", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in scripts/qa-favorites.mjs:41"}, "properties": {"repobilityId": "d642787ea092ff6d", "scanner": "scanner-primary", "fingerprint": "a46e5dc1eb309602", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/qa-favorites.mjs"}, "region": {"startLine": 41}}}]}, {"ruleId": "scanner-91e415c83c08cce5", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/e2e.mjs:9"}, "properties": {"repobilityId": "696f417a0526487c", "scanner": "scanner-primary", "fingerprint": "91e415c83c08cce5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/e2e.mjs"}, "region": {"startLine": 9}}}]}, {"ruleId": "scanner-30823a23d517b091", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in scripts/qa-saved-values.mjs:56"}, "properties": {"repobilityId": "df24d82dc1be02ef", "scanner": "scanner-primary", "fingerprint": "30823a23d517b091", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/qa-saved-values.mjs"}, "region": {"startLine": 56}}}]}, {"ruleId": "scanner-21742136765c8d8f", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in scripts/qa-progress-insights.mjs:40"}, "properties": {"repobilityId": "a5a87fc1e8d5f986", "scanner": "scanner-primary", "fingerprint": "21742136765c8d8f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/qa-progress-insights.mjs"}, "region": {"startLine": 40}}}]}, {"ruleId": "scanner-94935737597e589b", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in scripts/qa-water.mjs:50"}, "properties": {"repobilityId": "4f3e341ca5df72bb", "scanner": "scanner-primary", "fingerprint": "94935737597e589b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/qa-water.mjs"}, "region": {"startLine": 50}}}]}, {"ruleId": "scanner-5370e8e81bde7e6b", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in scripts/qa-workout-collapse.mjs:77"}, "properties": {"repobilityId": "fbeb9a7900814be0", "scanner": "scanner-primary", "fingerprint": "5370e8e81bde7e6b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/qa-workout-collapse.mjs"}, "region": {"startLine": 77}}}]}, {"ruleId": "scanner-46cee331fa816516", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in scripts/qa-water-presets.mjs:50"}, "properties": {"repobilityId": "83d619b27f9ea1de", "scanner": "scanner-primary", "fingerprint": "46cee331fa816516", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/qa-water-presets.mjs"}, "region": {"startLine": 50}}}]}, {"ruleId": "scanner-5a962511c4cdf0bf", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in scripts/qa-today-command-center.mjs:56"}, "properties": {"repobilityId": "108117b79743e49a", "scanner": "scanner-primary", "fingerprint": "5a962511c4cdf0bf", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/qa-today-command-center.mjs"}, "region": {"startLine": 56}}}]}, {"ruleId": "scanner-eb59e1c14bf02ff6", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/layout.tsx:54"}, "properties": {"repobilityId": "69d4743587f721a0", "scanner": "scanner-primary", "fingerprint": "eb59e1c14bf02ff6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/layout.tsx"}, "region": {"startLine": 54}}}]}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-cff9d4542b7f8146", "level": "note", "message": {"text": "Very large file: components/workouts/WorkoutBuilder.tsx (1231 lines)"}, "properties": {"repobilityId": "0e715727c759daf5", "scanner": "scanner-primary", "fingerprint": "cff9d4542b7f8146", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d06dcccfe1e95227", "level": "note", "message": {"text": "Very large file: lib/seed-exercises.ts (3198 lines)"}, "properties": {"repobilityId": "9968100b0c1c9b22", "scanner": "scanner-primary", "fingerprint": "d06dcccfe1e95227", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "a2208bb3ec41639f", "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": "ed55d8975ffca28a", "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": "0fcc168745bd2b3a", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-9d79c4077342a7d0", "level": "warning", "message": {"text": "Runtime service client appears to use placeholder configuration"}, "properties": {"repobilityId": "464e404ce0c12e4b", "scanner": "scanner-primary", "fingerprint": "9d79c4077342a7d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "runtime-config", "service-client", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "a441632d0f76c80f", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "88a55c07a2eaf18c", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "33554336031f9c73", "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": "c5dd328aa5e496f2", "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": "5eb00395ca03d87b", "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-efeadd861a7499e9", "level": "none", "message": {"text": "Commented-code block (8 lines) in playwright.config.ts:3"}, "properties": {"repobilityId": "be06b728ed039215", "scanner": "scanner-primary", "fingerprint": "efeadd861a7499e9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-53e50ac3b0cacfed", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 qa/pwa-check.mjs:30"}, "properties": {"repobilityId": "ebe040fa824ddc47", "scanner": "scanner-primary", "fingerprint": "53e50ac3b0cacfed", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1a8072146903b862", "level": "none", "message": {"text": "Commented-code block (8 lines) in qa/fats-food-check.mjs:3"}, "properties": {"repobilityId": "a7828cf0cabe3018", "scanner": "scanner-primary", "fingerprint": "1a8072146903b862", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-47b897e2d33beb48", "level": "none", "message": {"text": "Commented-code block (8 lines) in qa/fruits-food-check.mjs:3"}, "properties": {"repobilityId": "82471c468798f207", "scanner": "scanner-primary", "fingerprint": "47b897e2d33beb48", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-38896aa73014cea3", "level": "none", "message": {"text": "Commented-code block (6 lines) in qa/workouts-color-identity-check.mjs:1"}, "properties": {"repobilityId": "036c8e43ce8f2859", "scanner": "scanner-primary", "fingerprint": "38896aa73014cea3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-efd1bdeb473964ac", "level": "none", "message": {"text": "Commented-code block (15 lines) in qa/beta-welcome-check.mjs:4"}, "properties": {"repobilityId": "27b8047a806db757", "scanner": "scanner-primary", "fingerprint": "efd1bdeb473964ac", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1da6ef9022e1d4d6", "level": "none", "message": {"text": "Commented-code block (9 lines) in qa/food-library-check.mjs:3"}, "properties": {"repobilityId": "b6451e7104b7317e", "scanner": "scanner-primary", "fingerprint": "1da6ef9022e1d4d6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7e87afb173ff3061", "level": "none", "message": {"text": "Commented-code block (9 lines) in qa/admin-access-check.mjs:1"}, "properties": {"repobilityId": "c001c7e5241f23e5", "scanner": "scanner-primary", "fingerprint": "7e87afb173ff3061", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d3cde0241b867b4e", "level": "none", "message": {"text": "Commented-code block (6 lines) in qa/dark-mode-identity-check.mjs:1"}, "properties": {"repobilityId": "05077a3a870d05e1", "scanner": "scanner-primary", "fingerprint": "d3cde0241b867b4e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1a96eaf5eea39b86", "level": "none", "message": {"text": "Commented-code block (9 lines) in qa/vegetables-food-check.mjs:3"}, "properties": {"repobilityId": "ee26eec9a7e95796", "scanner": "scanner-primary", "fingerprint": "1a96eaf5eea39b86", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e1773d12af14879a", "level": "none", "message": {"text": "Commented-code block (7 lines) in qa/welcome-check.mjs:1"}, "properties": {"repobilityId": "4e3e816e4a888d96", "scanner": "scanner-primary", "fingerprint": "e1773d12af14879a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fadd3dc116d9b3e3", "level": "none", "message": {"text": "Commented-code block (8 lines) in qa/carbs-food-check.mjs:3"}, "properties": {"repobilityId": "e8424b106db12cde", "scanner": "scanner-primary", "fingerprint": "fadd3dc116d9b3e3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-073b3c103c9c383e", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/qa-exercise-videos.mjs:1"}, "properties": {"repobilityId": "c6f49d0c8756d302", "scanner": "scanner-primary", "fingerprint": "073b3c103c9c383e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5daec07c77146189", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/import-food-images.mjs:6"}, "properties": {"repobilityId": "0dfca557a636399e", "scanner": "scanner-primary", "fingerprint": "5daec07c77146189", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2712925cb0f8f310", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/qa-supplements.mjs:4"}, "properties": {"repobilityId": "e5e585404eed644f", "scanner": "scanner-primary", "fingerprint": "2712925cb0f8f310", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4738bd999b3ca67a", "level": "none", "message": {"text": "Commented-code block (7 lines) in scripts/qa-settings.mjs:4"}, "properties": {"repobilityId": "2884d1def21e1351", "scanner": "scanner-primary", "fingerprint": "4738bd999b3ca67a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-42d86a0d982fc877", "level": "none", "message": {"text": "Commented-code block (16 lines) in scripts/qa-workout-reorder.mjs:4"}, "properties": {"repobilityId": "4cd614224c902bae", "scanner": "scanner-primary", "fingerprint": "42d86a0d982fc877", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b8ca1f3456200b4f", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/qa-nutrition-reuse.mjs:4"}, "properties": {"repobilityId": "14d53a2dd8791aad", "scanner": "scanner-primary", "fingerprint": "b8ca1f3456200b4f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-05b1256a76e618da", "level": "none", "message": {"text": "Commented-code block (15 lines) in scripts/qa-gym-check-in.mjs:4"}, "properties": {"repobilityId": "38a09e503214a7b1", "scanner": "scanner-primary", "fingerprint": "05b1256a76e618da", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c961364c91821f95", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/qa-navigation.mjs:4"}, "properties": {"repobilityId": "d3c7f5dbd4743503", "scanner": "scanner-primary", "fingerprint": "c961364c91821f95", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-51ae650788e3c848", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/qa-beta-access.mjs:4"}, "properties": {"repobilityId": "da13fb804c439e99", "scanner": "scanner-primary", "fingerprint": "51ae650788e3c848", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d71e29c7cd24e235", "level": "none", "message": {"text": "Commented-code block (13 lines) in scripts/qa-workout-draft.mjs:4"}, "properties": {"repobilityId": "aad3db5e5a15baf3", "scanner": "scanner-primary", "fingerprint": "d71e29c7cd24e235", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0ddfa628a3610203", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/qa-workout-session.mjs:4"}, "properties": {"repobilityId": "ba6e67ddc1dcb063", "scanner": "scanner-primary", "fingerprint": "0ddfa628a3610203", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-21a0382000ee4c47", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/qa-exercises.mjs:1"}, "properties": {"repobilityId": "5bae511a8d6a7b96", "scanner": "scanner-primary", "fingerprint": "21a0382000ee4c47", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bf5a3e99e3965163", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/e2e.mjs:3"}, "properties": {"repobilityId": "0d4ca91a3c34a87b", "scanner": "scanner-primary", "fingerprint": "bf5a3e99e3965163", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a5fe7cd5eff8f3e1", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/qa-progress-insights.mjs:4"}, "properties": {"repobilityId": "88f3ee53dbda3083", "scanner": "scanner-primary", "fingerprint": "a5fe7cd5eff8f3e1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-559340d75b8502b2", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/qa-workout-collapse.mjs:4"}, "properties": {"repobilityId": "b9b65ff35d60b7d3", "scanner": "scanner-primary", "fingerprint": "559340d75b8502b2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5677cdea547e5033", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/qa-water-presets.mjs:4"}, "properties": {"repobilityId": "e7414cb450ab4abc", "scanner": "scanner-primary", "fingerprint": "5677cdea547e5033", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bbfaafbecec515e6", "level": "none", "message": {"text": "Commented-code block (13 lines) in scripts/qa-today-command-center.mjs:8"}, "properties": {"repobilityId": "29214c881d91b6de", "scanner": "scanner-primary", "fingerprint": "bbfaafbecec515e6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4c85617ba606e8c2", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/brand/generate-brand.mjs:3"}, "properties": {"repobilityId": "4a901e29da5ad7d3", "scanner": "scanner-primary", "fingerprint": "4c85617ba606e8c2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1180bf12ef41be05", "level": "none", "message": {"text": "Commented-code block (7 lines) in components/today/TodayView.tsx:322"}, "properties": {"repobilityId": "3f87ea377dca536a", "scanner": "scanner-primary", "fingerprint": "1180bf12ef41be05", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-246e917b3c1ef5d1", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/access/BetaWelcomeNotice.tsx:91"}, "properties": {"repobilityId": "d4744d9e0936e5bd", "scanner": "scanner-primary", "fingerprint": "246e917b3c1ef5d1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ee8b10e3b1ed8622", "level": "none", "message": {"text": "Commented-code block (6 lines) in components/ui/icons.tsx:271"}, "properties": {"repobilityId": "fa075630dc81b3c3", "scanner": "scanner-primary", "fingerprint": "ee8b10e3b1ed8622", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-27beba5b28122d45", "level": "none", "message": {"text": "Commented-code block (9 lines) in components/gym/GymTodayCard.tsx:3"}, "properties": {"repobilityId": "1c91c0f41d7a3561", "scanner": "scanner-primary", "fingerprint": "27beba5b28122d45", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0a1841f5382b4242", "level": "none", "message": {"text": "Commented-code block (9 lines) in components/supplements/supplement-catalog.ts:5"}, "properties": {"repobilityId": "fe4e593918a77856", "scanner": "scanner-primary", "fingerprint": "0a1841f5382b4242", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1d6904e9c261aac1", "level": "none", "message": {"text": "Commented-code block (6 lines) in components/nutrition/PhotoScanCard.tsx:13"}, "properties": {"repobilityId": "af3ad9b050117710", "scanner": "scanner-primary", "fingerprint": "1d6904e9c261aac1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f608439cb4aad69b", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/nutrition/PhotoDraftReview.tsx:5"}, "properties": {"repobilityId": "5c5718f6bcae5df4", "scanner": "scanner-primary", "fingerprint": "f608439cb4aad69b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bd9ebad1dac045f9", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/workouts/WorkoutBuilder.tsx:290"}, "properties": {"repobilityId": "025a52b69ce6fa47", "scanner": "scanner-primary", "fingerprint": "bd9ebad1dac045f9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5f6280746a2fc9e4", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/workouts/ExercisePicker.tsx:129"}, "properties": {"repobilityId": "26eee77632c86f34", "scanner": "scanner-primary", "fingerprint": "5f6280746a2fc9e4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ac19264f517f3348", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/nutrition/analyze-photo/route.ts:3"}, "properties": {"repobilityId": "58eb5992ead6048e", "scanner": "scanner-primary", "fingerprint": "ac19264f517f3348", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8eed920785a4313f", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/nutrition/page.tsx:5"}, "properties": {"repobilityId": "8eb4f4dc7f74f5b6", "scanner": "scanner-primary", "fingerprint": "8eed920785a4313f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-651b4a38f106f90d", "level": "none", "message": {"text": "Commented-code block (6 lines) in lib/beta-access.ts:13"}, "properties": {"repobilityId": "d0c55028814dece9", "scanner": "scanner-primary", "fingerprint": "651b4a38f106f90d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7260fbd33da56078", "level": "none", "message": {"text": "Commented-code block (6 lines) in lib/beta-welcome.ts:5"}, "properties": {"repobilityId": "8d918af62de50989", "scanner": "scanner-primary", "fingerprint": "7260fbd33da56078", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7cadcf69ec8e72aa", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/storage.ts:299"}, "properties": {"repobilityId": "e17ac69a4c801120", "scanner": "scanner-primary", "fingerprint": "7cadcf69ec8e72aa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fcca66da7ae4fcf0", "level": "none", "message": {"text": "Commented-code block (7 lines) in lib/nutrition-ai.ts:7"}, "properties": {"repobilityId": "44d569dfb827ce9b", "scanner": "scanner-primary", "fingerprint": "fcca66da7ae4fcf0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-30cb715b176d689c", "level": "none", "message": {"text": "Commented-code block (7 lines) in lib/guest-session.ts:5"}, "properties": {"repobilityId": "15e4e374bbe9f9de", "scanner": "scanner-primary", "fingerprint": "30cb715b176d689c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e273a257bdffa40e", "level": "none", "message": {"text": "Commented-code block (6 lines) in lib/admin-access.ts:5"}, "properties": {"repobilityId": "5baee88ff66fe881", "scanner": "scanner-primary", "fingerprint": "e273a257bdffa40e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-20688f8dfd2ae78b", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/gym-attendance.ts:5"}, "properties": {"repobilityId": "19ba55461ee79c96", "scanner": "scanner-primary", "fingerprint": "20688f8dfd2ae78b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4ff9aa7c0c707266", "level": "none", "message": {"text": "Commented-code block (8 lines) in lib/backup.ts:8"}, "properties": {"repobilityId": "9077a58caa510de0", "scanner": "scanner-primary", "fingerprint": "4ff9aa7c0c707266", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-386ef6cfd7faba95", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/nutrition-reuse.ts:1"}, "properties": {"repobilityId": "48d84f9b53974e0b", "scanner": "scanner-primary", "fingerprint": "386ef6cfd7faba95", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6c281ca6f5d69f8f", "level": "none", "message": {"text": "Commented-code block (6 lines) in lib/nutrition-photo.ts:7"}, "properties": {"repobilityId": "a245f90cf31f63ae", "scanner": "scanner-primary", "fingerprint": "6c281ca6f5d69f8f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ed6e9939457bde25", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/nutrition-photo.ts:112"}, "properties": {"repobilityId": "d2eef795a5981a0b", "scanner": "scanner-primary", "fingerprint": "ed6e9939457bde25", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-435f76d46e817f44", "level": "none", "message": {"text": "Commented-code block (6 lines) in lib/food-library.ts:3"}, "properties": {"repobilityId": "e21a2cdf9a246f5d", "scanner": "scanner-primary", "fingerprint": "435f76d46e817f44", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e517a79db71c96b1", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/supabase/client.ts:15"}, "properties": {"repobilityId": "164fcfb0f03bd5e4", "scanner": "scanner-primary", "fingerprint": "e517a79db71c96b1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}]}]}