{"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-d5973741fbb478fd", "name": "Stray `console.log` in TS/JS \u2014 _chk.js:7", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 _chk.js:7"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6be938c57325b7fe", "name": "Stray `console.log` in TS/JS \u2014 tests/planGenerator.test.js:1422", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/planGenerator.test.js:1422"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f6399920ff3d0a58", "name": "Stray `console.log` in TS/JS \u2014 tests/workoutExport.test.js:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/workoutExport.test.js:12"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8e2cbb079252b1ed", "name": "Stray `console.log` in TS/JS \u2014 tests/exportSigning.test.js:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/exportSigning.test.js:13"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d5fdeba4646c71c7", "name": "Stray `console.log` in TS/JS \u2014 tests/checkinSafety.test.js:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/checkinSafety.test.js:12"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a683397537c6c774", "name": "Stray `console.log` in TS/JS \u2014 tests/bikeSwap.test.js:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/bikeSwap.test.js:19"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-635ed7cb55343137", "name": "Stray `console.log` in TS/JS \u2014 tests/sessionStructure.test.js:36", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/sessionStructure.test.js:36"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ca09f035259d61be", "name": "Stray `console.log` in TS/JS \u2014 tests/piiRedaction.test.js:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/piiRedaction.test.js:12"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-81f24a58dfe78960", "name": "Stray `console.log` in TS/JS \u2014 tests/rideSpeedRules.test.js:45", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/rideSpeedRules.test.js:45"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4e20345a08c62309", "name": "Stray `console.log` in TS/JS \u2014 tests/mergeMarkers.test.js:69", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/mergeMarkers.test.js:69"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-81a0dc46054172ed", "name": "Stray `console.log` in TS/JS \u2014 tests/rideTips.test.js:28", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/rideTips.test.js:28"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-397c4893b307733c", "name": "Stray `console.log` in TS/JS \u2014 tests/slack.test.js:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/slack.test.js:12"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-acb8aa1a6b1143dd", "name": "Stray `console.log` in TS/JS \u2014 tests/sessionReference.test.js:26", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/sessionReference.test.js:26"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e6fc03f1d92e461b", "name": "Stray `console.log` in TS/JS \u2014 tests/dashboard/src/app/api/run-tests/route.js:566", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/dashboard/src/app/api/run-tests/route.js:566"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-67d7b442be685480", "name": "Stray `console.log` in TS/JS \u2014 tests/harness/mocks/anthropic.js:378", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/harness/mocks/anthropic.js:378"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7d6c3723ab933a63", "name": "Stray `console.log` in TS/JS \u2014 scripts/migrate-all-riders-to-v2.js:83", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate-all-riders-to-v2.js:83"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5ea875875354b1b0", "name": "Stray `console.log` in TS/JS \u2014 scripts/remote-first-audit.js:141", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/remote-first-audit.js:141"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0fb7fc247b182698", "name": "Stray `console.log` in TS/JS \u2014 scripts/learning-images-snapshot.js:169", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/learning-images-snapshot.js:169"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4ef10fc17ab4f990", "name": "Stray `console.log` in TS/JS \u2014 mcp-server/src/index.js:117", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 mcp-server/src/index.js:117"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d0fb0f9726078e85", "name": "TODO/FIXME marker in shipping code \u2014 server/__tests__/feedback-notifications.test.js:25", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 server/__tests__/feedback-notifications.test.js:25"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d6f4d471da667095", "name": "TODO/FIXME marker in shipping code \u2014 server/__tests__/routes/find-goal.test.js:84", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 server/__tests__/routes/find-goal.test.js:84"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5cc87056c1d71ee9", "name": "TODO/FIXME marker in shipping code \u2014 server/__tests__/routes/subscription-and-webhooks.test.js:77", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 server/__tests__/routes/subscription-and-webhooks.test.js:77"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-39f148ec358a243f", "name": "Stray `console.log` in TS/JS \u2014 server/scripts/boot-smoke-test.js:54", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/scripts/boot-smoke-test.js:54"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-54d092cc710bc951", "name": "Stray `console.log` in TS/JS \u2014 server/scripts/seed-events-cache.js:36", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/scripts/seed-events-cache.js:36"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2ccc787b71ec9a33", "name": "Stray `console.log` in TS/JS \u2014 server/scripts/run-event-search-scenarios.js:497", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/scripts/run-event-search-scenarios.js:497"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d88735e672641e23", "name": "Stray `console.log` in TS/JS \u2014 server/src/index.js:916", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/index.js:916"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5559fee0977c74a7", "name": "Stray `console.log` in TS/JS \u2014 server/src/lib/pushService.js:31", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/lib/pushService.js:31"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7c0d40ffd4515d86", "name": "Stray `console.log` in TS/JS \u2014 server/src/lib/eventEnricher.js:261", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/lib/eventEnricher.js:261"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0bfbc231327fd2c1", "name": "Stray `console.log` in TS/JS \u2014 server/src/lib/slack.js:112", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/lib/slack.js:112"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a3ee3b30854671d0", "name": "Stray `console.log` in TS/JS \u2014 server/src/lib/coachChatReaper.js:85", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/lib/coachChatReaper.js:85"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b0a7a9511997814a", "name": "Stray `console.log` in TS/JS \u2014 server/src/lib/claudeLogger.js:148", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/lib/claudeLogger.js:148"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7bbfaafd9e276691", "name": "Stray `console.log` in TS/JS \u2014 server/src/lib/planGenReaper.js:108", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/lib/planGenReaper.js:108"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-02c8740634934947", "name": "Stray `console.log` in TS/JS \u2014 server/src/routes/appConfig.js:144", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/routes/appConfig.js:144"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-59d684c2ba0a2092", "name": "Stray `console.log` in TS/JS \u2014 server/src/routes/retentionCron.js:152", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/routes/retentionCron.js:152"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5aefa9318288370d", "name": "Stray `console.log` in TS/JS \u2014 server/src/routes/admin.js:2079", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/routes/admin.js:2079"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-29802584180ce373", "name": "Stray `console.log` in TS/JS \u2014 server/src/routes/eventsCacheCron.js:432", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/routes/eventsCacheCron.js:432"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c6e94f866593a543", "name": "Stray `console.log` in TS/JS \u2014 server/src/routes/feedback.js:156", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/routes/feedback.js:156"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e6f3cd6e153fab57", "name": "Stray `console.log` in TS/JS \u2014 server/src/routes/ai.js:5940", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/routes/ai.js:5940"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c0bfc367b4e5f06c", "name": "Stray `console.log` in TS/JS \u2014 server/src/routes/coupons.js:145", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/routes/coupons.js:145"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-73baba55719581e5", "name": "Stray `console.log` in TS/JS \u2014 server/src/routes/revenueCatWebhook.js:166", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/routes/revenueCatWebhook.js:166"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e15de2ac9a8f9572", "name": "Stray `console.log` in TS/JS \u2014 server/src/routes/support.js:48", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/routes/support.js:48"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-eb5131ed720005e9", "name": "Stray `console.log` in TS/JS \u2014 server/src/routes/findGoal.js:1160", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/routes/findGoal.js:1160"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fbc980e79acae713", "name": "Stray `console.log` in TS/JS \u2014 server/src/routes/checkins.js:1225", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/routes/checkins.js:1225"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea4e8deb3f5a6e0c", "name": "Stray `console.log` in TS/JS \u2014 server/src/routes/users.js:105", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/routes/users.js:105"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-62c902f1cf7832d3", "name": "`truncate` class without `title=` for hover reveal \u2014 admin-dashboard/src/app/dashboard/layout.tsx:150", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 admin-dashboard/src/app/dashboard/layout.tsx:150"}, "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-10f5f2137e6b8657", "name": "Icon-only button without accessible name \u2014 admin-dashboard/src/app/dashboard/activity/page.tsx:516", "shortDescription": {"text": "Icon-only button without accessible name \u2014 admin-dashboard/src/app/dashboard/activity/page.tsx:516"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bac4135dfdd49e1e", "name": "`truncate` class without `title=` for hover reveal \u2014 admin-dashboard/src/app/dashboard/admins/page.tsx:147", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 admin-dashboard/src/app/dashboard/admins/page.tsx:147"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ed4ab6316a8d90cb", "name": "`truncate` class without `title=` for hover reveal \u2014 admin-dashboard/src/app/dashboard/payments/page.tsx:278", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 admin-dashboard/src/app/dashboard/payments/page.tsx:278"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-daeaa22996b10f24", "name": "`truncate` class without `title=` for hover reveal \u2014 admin-dashboard/src/app/dashboard/feedback/page.tsx:169", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 admin-dashboard/src/app/dashboard/feedback/page.tsx:169"}, "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-71d1d6ac20b32472", "name": "TODO/FIXME marker in shipping code \u2014 src/__tests__/screens/FindAGoalResultsScreen.test.js:100", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/__tests__/screens/FindAGoalResultsScreen.test.js:100"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-18216bcf1b4f4252", "name": "TODO/FIXME marker in shipping code \u2014 src/__tests__/components/SetupTrainingCard.test.js:204", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/__tests__/components/SetupTrainingCard.test.js:204"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cfd862ef0eed80f3", "name": "Stray `console.log` in TS/JS \u2014 src/screens/HomeScreen.js:631", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/screens/HomeScreen.js:631"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b084c39525c097cc", "name": "Stray `console.log` in TS/JS \u2014 src/screens/PlanConfigScreen.js:1332", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/screens/PlanConfigScreen.js:1332"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b0bfe7d448f6dae7", "name": "Stray `console.log` in TS/JS \u2014 src/services/storageService.js:421", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/services/storageService.js:421"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7a75ebe4a4666592", "name": "Stray `console.log` in TS/JS \u2014 src/services/analyticsService.js:66", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/services/analyticsService.js:66"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d29939c9819f6a05", "name": "Stray `console.log` in TS/JS \u2014 src/services/notificationService.js:57", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/services/notificationService.js:57"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-936e5307bd840264", "name": "Stray `console.log` in TS/JS \u2014 src/services/revenueCatService.js:78", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/services/revenueCatService.js:78"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0e2460270d93a260", "name": "Dockerfile runs as root: mcp-server/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: mcp-server/Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-787e483f8183db8f", "name": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ce519d0ea8aa8d1f", "name": "Insecure pattern 'direct_innerhtml_assignment' in website/event.html:218", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in website/event.html:218"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5414ba2c41cb2eae", "name": "Insecure pattern 'direct_innerhtml_assignment' in website/plan-preview.html:466", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in website/plan-preview.html:466"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a5e19daddc610ec5", "name": "Insecure pattern 'insert_adjacent_html' in website/plan-preview.html:535", "shortDescription": {"text": "Insecure pattern 'insert_adjacent_html' in website/plan-preview.html:535"}, "fullDescription": {"text": "Found a known-risky pattern (insert_adjacent_html). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-aacaf48924ceea54", "name": "Insecure pattern 'direct_innerhtml_assignment' in website/events.html:598", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in website/events.html:598"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9232440117702634", "name": "Insecure pattern 'insert_adjacent_html' in website/events.html:599", "shortDescription": {"text": "Insecure pattern 'insert_adjacent_html' in website/events.html:599"}, "fullDescription": {"text": "Found a known-risky pattern (insert_adjacent_html). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b8d3d6236f73d4b7", "name": "Insecure pattern 'direct_innerhtml_assignment' in website/register-interest.js:121", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in website/register-interest.js:121"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9cb9a45052521b14", "name": "Insecure pattern 'direct_innerhtml_assignment' in website/developers.html:434", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in website/developers.html:434"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-35f457818ac4c107", "name": "Insecure pattern 'direct_innerhtml_assignment' in website/pitch-deck-93c953ed-5f37-4167-9488-1e42336ecd56/deck-stage.js:", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in website/pitch-deck-93c953ed-5f37-4167-9488-1e42336ecd56/deck-stage.js:814"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea0b049aaa1a3cf0", "name": "Insecure pattern 'cors_wildcard' in mcp-server/src/index.js:28", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in mcp-server/src/index.js:28"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c5ecb9d6237c5c82", "name": "Insecure pattern 'node_child_process' in server/scripts/boot-smoke-test.js:28", "shortDescription": {"text": "Insecure pattern 'node_child_process' in server/scripts/boot-smoke-test.js:28"}, "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-ea474e0debb28a99", "name": "Insecure pattern 'node_child_process' in server/src/lib/videoFrames.js:43", "shortDescription": {"text": "Insecure pattern 'node_child_process' in server/src/lib/videoFrames.js:43"}, "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-8be3bf78e0c5d83b", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/components/EventsMapView.js:232", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/EventsMapView.js:232"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f2a1c29afa3ccada", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/components/RoutePreviewMap.js:101", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/RoutePreviewMap.js:101"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-86fa1a89a982c3a5", "name": "Insecure pattern 'node_child_process' in e2e/runner.mjs:34", "shortDescription": {"text": "Insecure pattern 'node_child_process' in e2e/runner.mjs:34"}, "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-7efbda965f283c17", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "supabase/setup-cli@v1 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f097ad9f397c4308", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/upload-artifact@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-14cdfa58eeacdd43", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/upload-artifact@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cbf6d6612dad0e13", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "expo/expo-github-action@v8 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-de88a95070d2e205", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6f922b4e772b367f", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-edfc7b203b3a48ec", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/upload-artifact@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cb639d9a10a47b23", "name": "package.json defines install-time lifecycle scripts", "shortDescription": {"text": "package.json defines install-time lifecycle scripts"}, "fullDescription": {"text": "preinstall/install/postinstall/prepare scripts execute during dependency installation. Review them carefully for network calls, obfuscation, shell execution, or credential access."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f73efb122ff50d29", "name": "Very large file: App.js (1018 lines)", "shortDescription": {"text": "Very large file: App.js (1018 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-5e7aa63e42cf3063", "name": "Very large file: tests/planGenerator.test.js (1772 lines)", "shortDescription": {"text": "Very large file: tests/planGenerator.test.js (1772 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-90e60f242030e89c", "name": "Very large file: website/pitch-deck-93c953ed-5f37-4167-9488-1e42336ecd56/deck-stage.js (1709 lines)", "shortDescription": {"text": "Very large file: website/pitch-deck-93c953ed-5f37-4167-9488-1e42336ecd56/deck-stage.js (1709 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-08cd884f18484116", "name": "Very large file: server/src/index.js (1066 lines)", "shortDescription": {"text": "Very large file: server/src/index.js (1066 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-b7e19f73c11ee280", "name": "Very large file: server/src/routes/admin.js (5091 lines)", "shortDescription": {"text": "Very large file: server/src/routes/admin.js (5091 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-3fb33de3cd4eb3b7", "name": "Very large file: server/src/routes/ai.js (6757 lines)", "shortDescription": {"text": "Very large file: server/src/routes/ai.js (6757 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-43bb09a962625d80", "name": "Very large file: server/src/routes/findGoal.js (3018 lines)", "shortDescription": {"text": "Very large file: server/src/routes/findGoal.js (3018 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-7c1cb04b767f226a", "name": "Very large file: server/src/routes/checkins.js (1574 lines)", "shortDescription": {"text": "Very large file: server/src/routes/checkins.js (1574 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-d608e2ced5bb4914", "name": "Very large file: admin-dashboard/src/app/dashboard/users/[id]/page.tsx (1167 lines)", "shortDescription": {"text": "Very large file: admin-dashboard/src/app/dashboard/users/[id]/page.tsx (1167 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-c663f89d20e5f4bf", "name": "Very large file: src/screens/PlanOverviewScreen.js (1855 lines)", "shortDescription": {"text": "Very large file: src/screens/PlanOverviewScreen.js (1855 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-6bb9584d94225f26", "name": "Very large file: src/screens/PlanLoadingScreen.js (1159 lines)", "shortDescription": {"text": "Very large file: src/screens/PlanLoadingScreen.js (1159 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-301f8cba580af4c8", "name": "Very large file: src/screens/HomeScreen.js (6159 lines)", "shortDescription": {"text": "Very large file: src/screens/HomeScreen.js (6159 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-8f08a774ffaacf90", "name": "Very large file: src/screens/BeginnerProgramScreen.js (1151 lines)", "shortDescription": {"text": "Very large file: src/screens/BeginnerProgramScreen.js (1151 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-51a44a2ffda8acc3", "name": "Very large file: src/screens/FindAGoalResultsScreen.js (2740 lines)", "shortDescription": {"text": "Very large file: src/screens/FindAGoalResultsScreen.js (2740 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-4ac50d4501946fa9", "name": "Very large file: src/screens/CheckInScreen.js (3026 lines)", "shortDescription": {"text": "Very large file: src/screens/CheckInScreen.js (3026 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-05446ebdb3396fce", "name": "Very large file: src/screens/CoachChatScreen.js (4265 lines)", "shortDescription": {"text": "Very large file: src/screens/CoachChatScreen.js (4265 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-834a72421b880c8b", "name": "Very large file: src/screens/WeekViewScreen.js (1798 lines)", "shortDescription": {"text": "Very large file: src/screens/WeekViewScreen.js (1798 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-9d6e1a9eee895758", "name": "Very large file: src/screens/PlanPickerScreen.js (2380 lines)", "shortDescription": {"text": "Very large file: src/screens/PlanPickerScreen.js (2380 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-599984e0a3dbca42", "name": "Very large file: src/screens/ActivityDetailScreen.js (5481 lines)", "shortDescription": {"text": "Very large file: src/screens/ActivityDetailScreen.js (5481 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-7f29c857c27118bf", "name": "Very large file: src/screens/MyEventsScreen.js (2321 lines)", "shortDescription": {"text": "Very large file: src/screens/MyEventsScreen.js (2321 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-43f268c6869f5f4c", "name": "Very large file: src/screens/PlanConfigScreen.js (3137 lines)", "shortDescription": {"text": "Very large file: src/screens/PlanConfigScreen.js (3137 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-911b2a72404e7084", "name": "Very large file: src/components/BucketListItemSheet.js (1438 lines)", "shortDescription": {"text": "Very large file: src/components/BucketListItemSheet.js (1438 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-f96c711ddc5c2bc1", "name": "Very large file: src/services/storageService.js (1781 lines)", "shortDescription": {"text": "Very large file: src/services/storageService.js (1781 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-294e513f2e1f70da", "name": "Very large file: src/services/llmPlanService.js (1382 lines)", "shortDescription": {"text": "Very large file: src/services/llmPlanService.js (1382 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-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 172 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 231 placeholder/mock markers across 72 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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-8860542b5b71ae91", "name": "Commented-code block (6 lines) in App.js:39", "shortDescription": {"text": "Commented-code block (6 lines) in App.js:39"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dd2ea731485b4133", "name": "Commented-code block (10 lines) in tests/planGenerator.test.js:1267", "shortDescription": {"text": "Commented-code block (10 lines) in tests/planGenerator.test.js:1267"}, "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-1b9c9e47107e286f", "name": "Commented-code block (5 lines) in tests/mergeMarkers.test.js:23", "shortDescription": {"text": "Commented-code block (5 lines) in tests/mergeMarkers.test.js:23"}, "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-87fe3ec96e65a2dd", "name": "Commented-code block (7 lines) in tests/sessionReference.test.js:191", "shortDescription": {"text": "Commented-code block (7 lines) in tests/sessionReference.test.js:191"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-897e99e837d40d1d", "name": "Legacy-named symbol `etapa_v2` in tests/integration/checkin-and-coach-chat.test.js:23", "shortDescription": {"text": "Legacy-named symbol `etapa_v2` in tests/integration/checkin-and-coach-chat.test.js:23"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-69eadff8780db07e", "name": "Legacy-named symbol `etapa_v2` in tests/integration/bike-fit-flow.test.js:115", "shortDescription": {"text": "Legacy-named symbol `etapa_v2` in tests/integration/bike-fit-flow.test.js:115"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-17b3563efa3695d3", "name": "Commented-code block (5 lines) in tests/integration/bike-fit-flow.test.js:34", "shortDescription": {"text": "Commented-code block (5 lines) in tests/integration/bike-fit-flow.test.js:34"}, "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-1a9b472d63ae7701", "name": "Commented-code block (5 lines) in tests/dashboard/src/app/page.js:486", "shortDescription": {"text": "Commented-code block (5 lines) in tests/dashboard/src/app/page.js:486"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e9f9e16e01958019", "name": "Commented-code block (9 lines) in tests/dashboard/src/app/api/run-tests/route.js:15", "shortDescription": {"text": "Commented-code block (9 lines) in tests/dashboard/src/app/api/run-tests/route.js:15"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-08ab976a124a80b1", "name": "Commented-code block (9 lines) in tests/dashboard/src/lib/scenarios.js:117", "shortDescription": {"text": "Commented-code block (9 lines) in tests/dashboard/src/lib/scenarios.js:117"}, "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-b78dc2d058eac473", "name": "Legacy-named symbol `etapa_v2` in tests/harness/supabase.js:73", "shortDescription": {"text": "Legacy-named symbol `etapa_v2` in tests/harness/supabase.js:73"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-eb5f6495f52bad15", "name": "Commented-code block (6 lines) in tests/harness/supabase.js:73", "shortDescription": {"text": "Commented-code block (6 lines) in tests/harness/supabase.js:73"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6ca12fe0a88da093", "name": "Commented-code block (6 lines) in tests/harness/setupFile.js:27", "shortDescription": {"text": "Commented-code block (6 lines) in tests/harness/setupFile.js:27"}, "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-a68e8920424e1cdf", "name": "Commented-code block (8 lines) in tests/harness/mocks/anthropic.js:60", "shortDescription": {"text": "Commented-code block (8 lines) in tests/harness/mocks/anthropic.js:60"}, "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-67b3bcfe334b64c3", "name": "Legacy-named symbol `etapa_v2` in scripts/migrate-all-riders-to-v2.js:3", "shortDescription": {"text": "Legacy-named symbol `etapa_v2` in scripts/migrate-all-riders-to-v2.js:3"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-86bf3d4c8a6e9ffc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/learning-images-snapshot.js:112", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/learning-images-snapshot.js: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-86bf91eeef095d60", "name": "Commented-code block (5 lines) in website/register-interest.js:39", "shortDescription": {"text": "Commented-code block (5 lines) in website/register-interest.js:39"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6ebb19fa03eade40", "name": "`fetch()` without try/.catch or AbortSignal \u2014 website/register-interest.js:241", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 website/register-interest.js:241"}, "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-4bb27cbbe9242abd", "name": "Commented-code block (5 lines) in website/pitch-deck-93c953ed-5f37-4167-9488-1e42336ecd56/deck-stage.js:592", "shortDescription": {"text": "Commented-code block (5 lines) in website/pitch-deck-93c953ed-5f37-4167-9488-1e42336ecd56/deck-stage.js:592"}, "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-3d9a7b358e826b58", "name": "Commented-code block (5 lines) in server/__tests__/plan-post-processors-flex-orchestrator.test.js:128", "shortDescription": {"text": "Commented-code block (5 lines) in server/__tests__/plan-post-processors-flex-orchestrator.test.js:128"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-56ae968ff7e8f1bf", "name": "Commented-code block (5 lines) in server/__tests__/plan-prompt-helpers.test.js:165", "shortDescription": {"text": "Commented-code block (5 lines) in server/__tests__/plan-prompt-helpers.test.js:165"}, "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-e2752dedc833ba93", "name": "Legacy-named symbol `etapa_v2` in server/__tests__/snapshot-reason-enum.test.js:2", "shortDescription": {"text": "Legacy-named symbol `etapa_v2` in server/__tests__/snapshot-reason-enum.test.js:2"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ecf6657c05fcf5f6", "name": "Commented-code block (6 lines) in server/__tests__/__smoke__/00-harness.test.js:32", "shortDescription": {"text": "Commented-code block (6 lines) in server/__tests__/__smoke__/00-harness.test.js:32"}, "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-0dec0b6d56908613", "name": "Commented-code block (5 lines) in server/__tests__/lib/findGoalTripPrompt.test.js:58", "shortDescription": {"text": "Commented-code block (5 lines) in server/__tests__/lib/findGoalTripPrompt.test.js:58"}, "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-58861fb0a7477b03", "name": "Legacy-named symbol `etapa_v2` in server/__tests__/lib/coachContext.test.js:25", "shortDescription": {"text": "Legacy-named symbol `etapa_v2` in server/__tests__/lib/coachContext.test.js:25"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f744b823880364b2", "name": "Commented-code block (6 lines) in server/__tests__/lib/coachContext.test.js:14", "shortDescription": {"text": "Commented-code block (6 lines) in server/__tests__/lib/coachContext.test.js:14"}, "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-79e42c9319a3ae18", "name": "Legacy-named symbol `etapa_v2` in server/__tests__/routes/admin-jwt-auth.test.js:4", "shortDescription": {"text": "Legacy-named symbol `etapa_v2` in server/__tests__/routes/admin-jwt-auth.test.js:4"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b26f8aad2da8fd9b", "name": "Legacy-named symbol `etapa_v2` in server/__tests__/routes/find-goal.test.js:380", "shortDescription": {"text": "Legacy-named symbol `etapa_v2` in server/__tests__/routes/find-goal.test.js:380"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3d69e68295baa542", "name": "Commented-code block (12 lines) in server/__tests__/routes/find-goal.test.js:84", "shortDescription": {"text": "Commented-code block (12 lines) in server/__tests__/routes/find-goal.test.js:84"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5081537ceb7366be", "name": "Legacy-named symbol `etapa_v2` in server/__tests__/routes/chatSessions.test.js:61", "shortDescription": {"text": "Legacy-named symbol `etapa_v2` in server/__tests__/routes/chatSessions.test.js:61"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-eae4cb5cb43d4fbd", "name": "Legacy-named symbol `etapa_v2` in server/__tests__/routes/strava.test.js:86", "shortDescription": {"text": "Legacy-named symbol `etapa_v2` in server/__tests__/routes/strava.test.js:86"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f34c96ef704ed2fd", "name": "Commented-code block (5 lines) in server/__tests__/routes/ai-coach-chat-enforcement.test.js:118", "shortDescription": {"text": "Commented-code block (5 lines) in server/__tests__/routes/ai-coach-chat-enforcement.test.js:118"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-61f387d1a445c64c", "name": "Legacy-named symbol `etapa_v2` in server/__tests__/routes/checkins.test.js:15", "shortDescription": {"text": "Legacy-named symbol `etapa_v2` in server/__tests__/routes/checkins.test.js:15"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-46ab3f35a5d75b2f", "name": "Commented-code block (6 lines) in server/__tests__/routes/checkins.test.js:80", "shortDescription": {"text": "Commented-code block (6 lines) in server/__tests__/routes/checkins.test.js:80"}, "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-302b301904f67bed", "name": "Commented-code block (7 lines) in server/__tests__/routes/events.test.js:208", "shortDescription": {"text": "Commented-code block (7 lines) in server/__tests__/routes/events.test.js:208"}, "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-29829b5505f7b092", "name": "Legacy-named symbol `etapa_v2` in server/__tests__/routes/goals-and-plans.test.js:386", "shortDescription": {"text": "Legacy-named symbol `etapa_v2` in server/__tests__/routes/goals-and-plans.test.js:386"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d30e22c186d971f3", "name": "Commented-code block (5 lines) in server/__tests__/routes/goals-and-plans.test.js:60", "shortDescription": {"text": "Commented-code block (5 lines) in server/__tests__/routes/goals-and-plans.test.js:60"}, "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-2d293090d3535626", "name": "Commented-code block (5 lines) in server/__tests__/routes/subscription-and-webhooks.test.js:77", "shortDescription": {"text": "Commented-code block (5 lines) in server/__tests__/routes/subscription-and-webhooks.test.js:77"}, "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-935c01766e8858f1", "name": "Legacy-named symbol `etapa_v2` in server/__tests__/routes/bike-fit.test.js:182", "shortDescription": {"text": "Legacy-named symbol `etapa_v2` in server/__tests__/routes/bike-fit.test.js:182"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2431b42744cf9b7c", "name": "Legacy-named symbol `etapa_v2` in server/__tests__/routes/ai-coach-chat.test.js:90", "shortDescription": {"text": "Legacy-named symbol `etapa_v2` in server/__tests__/routes/ai-coach-chat.test.js:90"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-51de3d27f637d2ca", "name": "Commented-code block (5 lines) in server/__tests__/routes/ai-coach-chat.test.js:192", "shortDescription": {"text": "Commented-code block (5 lines) in server/__tests__/routes/ai-coach-chat.test.js:192"}, "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-af7b433b043d380c", "name": "Legacy-named symbol `etapa_v2` in server/__tests__/routes/coaching.test.js:56", "shortDescription": {"text": "Legacy-named symbol `etapa_v2` in server/__tests__/routes/coaching.test.js:56"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8387e1989d7fa5d4", "name": "Legacy-named symbol `etapa_v2` in server/__tests__/routes/admin-find-goal-searches.test.js:22", "shortDescription": {"text": "Legacy-named symbol `etapa_v2` in server/__tests__/routes/admin-find-goal-searches.test.js:22"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3413a9eb7f0cf826", "name": "Legacy-named symbol `etapa_v2` in server/__tests__/routes/auth-and-users.test.js:94", "shortDescription": {"text": "Legacy-named symbol `etapa_v2` in server/__tests__/routes/auth-and-users.test.js:94"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-313e933a0cc09586", "name": "Legacy-named symbol `etapa_v2` in server/__tests__/routes/eventsCron.test.js:20", "shortDescription": {"text": "Legacy-named symbol `etapa_v2` in server/__tests__/routes/eventsCron.test.js:20"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d59fd809a7ec371d", "name": "Commented-code block (5 lines) in server/__tests__/routes/ai-plan-generation.test.js:139", "shortDescription": {"text": "Commented-code block (5 lines) in server/__tests__/routes/ai-plan-generation.test.js:139"}, "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-a79ffcee76fbd37d", "name": "Legacy-named symbol `etapa_v2` in server/scripts/event-search-scenarios.js:8", "shortDescription": {"text": "Legacy-named symbol `etapa_v2` in server/scripts/event-search-scenarios.js:8"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4874ee9b25440540", "name": "Commented-code block (6 lines) in server/scripts/event-search-scenarios.js:550", "shortDescription": {"text": "Commented-code block (6 lines) in server/scripts/event-search-scenarios.js:550"}, "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-f217841c234b44c8", "name": "Legacy-named symbol `etapa_v2` in server/scripts/run-event-search-scenarios.js:13", "shortDescription": {"text": "Legacy-named symbol `etapa_v2` in server/scripts/run-event-search-scenarios.js:13"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6f161a14cf277f29", "name": "Commented-code block (6 lines) in server/scripts/run-event-search-scenarios.js:142", "shortDescription": {"text": "Commented-code block (6 lines) in server/scripts/run-event-search-scenarios.js:142"}, "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-a28f036a9ec03ba6", "name": "Legacy-named symbol `etapa_v2` in server/src/index.js:388", "shortDescription": {"text": "Legacy-named symbol `etapa_v2` in server/src/index.js:388"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8afef6536c6649ab", "name": "Commented-code block (6 lines) in server/src/index.js:3", "shortDescription": {"text": "Commented-code block (6 lines) in server/src/index.js: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-c23c761166f194c0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server/src/index.js:203", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/src/index.js:203"}, "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-bb797a1877e46f7a", "name": "Commented-code block (6 lines) in server/src/middleware/auth.js:3", "shortDescription": {"text": "Commented-code block (6 lines) in server/src/middleware/auth.js: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-6d184d8b5ee81026", "name": "Commented-code block (7 lines) in server/src/lib/findGoalClarifier.js:32", "shortDescription": {"text": "Commented-code block (7 lines) in server/src/lib/findGoalClarifier.js:32"}, "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-95e79dd4b2fc3f78", "name": "Legacy-named symbol `etapa_v2` in server/src/lib/stravaCache.js:2", "shortDescription": {"text": "Legacy-named symbol `etapa_v2` in server/src/lib/stravaCache.js:2"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0d3d294530498f92", "name": "Commented-code block (6 lines) in server/src/lib/pushService.js:18", "shortDescription": {"text": "Commented-code block (6 lines) in server/src/lib/pushService.js:18"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e7e4f656696ab377", "name": "Commented-code block (6 lines) in server/src/lib/userLifecycle.js:77", "shortDescription": {"text": "Commented-code block (6 lines) in server/src/lib/userLifecycle.js:77"}, "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-e5da69ab3d6ea66e", "name": "Commented-code block (8 lines) in server/src/lib/log.js:73", "shortDescription": {"text": "Commented-code block (8 lines) in server/src/lib/log.js:73"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-23ac43a9b7338033", "name": "Commented-code block (8 lines) in server/src/lib/strengthPicker.js:29", "shortDescription": {"text": "Commented-code block (8 lines) in server/src/lib/strengthPicker.js:29"}, "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-cd194801ecd5a6d5", "name": "Commented-code block (7 lines) in server/src/lib/lifetimeGrant.js:251", "shortDescription": {"text": "Commented-code block (7 lines) in server/src/lib/lifetimeGrant.js:251"}, "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-8c71b4fd6fa9549d", "name": "Commented-code block (5 lines) in server/src/lib/workoutExport.js:52", "shortDescription": {"text": "Commented-code block (5 lines) in server/src/lib/workoutExport.js:52"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f17a58e98fb720a8", "name": "Legacy-named symbol `etapa_v2` in server/src/lib/supabase.js:19", "shortDescription": {"text": "Legacy-named symbol `etapa_v2` in server/src/lib/supabase.js:19"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3d8df44ebe51fb69", "name": "Commented-code block (6 lines) in server/src/lib/supabase.js:19", "shortDescription": {"text": "Commented-code block (6 lines) in server/src/lib/supabase.js:19"}, "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-5fa94769b64df735", "name": "Commented-code block (5 lines) in server/src/lib/perplexity.js:21", "shortDescription": {"text": "Commented-code block (5 lines) in server/src/lib/perplexity.js:21"}, "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-28e2493f0a6d3a9f", "name": "Commented-code block (5 lines) in server/src/lib/rideTips.js:39", "shortDescription": {"text": "Commented-code block (5 lines) in server/src/lib/rideTips.js:39"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c193c29a9644d449", "name": "Commented-code block (5 lines) in server/src/lib/planGenLogger.js:15", "shortDescription": {"text": "Commented-code block (5 lines) in server/src/lib/planGenLogger.js:15"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ba0639692fc386ad", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server/src/lib/slack.js:41", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/src/lib/slack.js:41"}, "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-2576dfb91b9deaf6", "name": "Commented-code block (5 lines) in server/src/lib/checkinSafety.js:22", "shortDescription": {"text": "Commented-code block (5 lines) in server/src/lib/checkinSafety.js:22"}, "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-da0699de8a60fb98", "name": "Commented-code block (5 lines) in server/src/lib/piiRedaction.js:40", "shortDescription": {"text": "Commented-code block (5 lines) in server/src/lib/piiRedaction.js:40"}, "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-27cd54a6517db2b2", "name": "Commented-code block (6 lines) in server/src/lib/findGoalSearchPlan.js:36", "shortDescription": {"text": "Commented-code block (6 lines) in server/src/lib/findGoalSearchPlan.js:36"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0abf810d498030f6", "name": "Commented-code block (5 lines) in server/src/lib/planPostProcessors.js:150", "shortDescription": {"text": "Commented-code block (5 lines) in server/src/lib/planPostProcessors.js:150"}, "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-0aa1abfc97e50fa2", "name": "Commented-code block (5 lines) in server/src/lib/eventNormaliser.js:42", "shortDescription": {"text": "Commented-code block (5 lines) in server/src/lib/eventNormaliser.js:42"}, "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-da525123b11d0520", "name": "Commented-code block (5 lines) in server/src/lib/findGoalDirectives.js:29", "shortDescription": {"text": "Commented-code block (5 lines) in server/src/lib/findGoalDirectives.js:29"}, "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-6355cdc29c4868f3", "name": "Legacy-named symbol `etapa_v2` in server/src/lib/coachContext.js:294", "shortDescription": {"text": "Legacy-named symbol `etapa_v2` in server/src/lib/coachContext.js:294"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d7e766d943ab8a7f", "name": "Commented-code block (6 lines) in server/src/lib/coachContext.js:33", "shortDescription": {"text": "Commented-code block (6 lines) in server/src/lib/coachContext.js:33"}, "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-cf9394385e5be4ef", "name": "Commented-code block (8 lines) in server/src/lib/rateLimits.js:28", "shortDescription": {"text": "Commented-code block (8 lines) in server/src/lib/rateLimits.js:28"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fd7f7b175a1bf8e2", "name": "Commented-code block (8 lines) in server/src/lib/coachTipsSelector.js:51", "shortDescription": {"text": "Commented-code block (8 lines) in server/src/lib/coachTipsSelector.js:51"}, "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-27ef48e8b3e41faa", "name": "Legacy-named symbol `etapa_v2` in server/src/lib/claudeLogger.js:200", "shortDescription": {"text": "Legacy-named symbol `etapa_v2` in server/src/lib/claudeLogger.js:200"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-813ea4792aa85b82", "name": "Commented-code block (6 lines) in server/src/lib/claudeLogger.js:199", "shortDescription": {"text": "Commented-code block (6 lines) in server/src/lib/claudeLogger.js:199"}, "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-3a8414ec27872a7b", "name": "Commented-code block (8 lines) in server/src/lib/sessionStructure.js:95", "shortDescription": {"text": "Commented-code block (8 lines) in server/src/lib/sessionStructure.js:95"}, "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-123e7e3bb5c21f5c", "name": "Commented-code block (7 lines) in server/src/lib/videoFrames.js:142", "shortDescription": {"text": "Commented-code block (7 lines) in server/src/lib/videoFrames.js:142"}, "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-77d4e56db23648b9", "name": "Commented-code block (8 lines) in server/src/lib/postureVision.js:30", "shortDescription": {"text": "Commented-code block (8 lines) in server/src/lib/postureVision.js:30"}, "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-b3c77822fb65710b", "name": "Legacy-named symbol `etapa_v2` in server/src/lib/bikeFitVision.js:411", "shortDescription": {"text": "Legacy-named symbol `etapa_v2` in server/src/lib/bikeFitVision.js:411"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-983471c98b19b907", "name": "Commented-code block (11 lines) in server/src/lib/bikeFitVision.js:39", "shortDescription": {"text": "Commented-code block (11 lines) in server/src/lib/bikeFitVision.js:39"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2240486c621757b7", "name": "Commented-code block (8 lines) in server/src/lib/planGenReaper.js:27", "shortDescription": {"text": "Commented-code block (8 lines) in server/src/lib/planGenReaper.js:27"}, "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-d082e5742a42a345", "name": "Commented-code block (5 lines) in server/src/lib/coachPersonas.js:85", "shortDescription": {"text": "Commented-code block (5 lines) in server/src/lib/coachPersonas.js:85"}, "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-c2ff71c422378fcb", "name": "Commented-code block (5 lines) in server/src/routes/roadside.js:33", "shortDescription": {"text": "Commented-code block (5 lines) in server/src/routes/roadside.js:33"}, "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-080f2b3aa2b7917c", "name": "Legacy-named symbol `etapa_v2` in server/src/routes/plans.js:305", "shortDescription": {"text": "Legacy-named symbol `etapa_v2` in server/src/routes/plans.js:305"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-977eb73a4b81706e", "name": "Commented-code block (8 lines) in server/src/routes/plans.js:10", "shortDescription": {"text": "Commented-code block (8 lines) in server/src/routes/plans.js:10"}, "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-505af7ce45009c5d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server/src/routes/learningImages.js:165", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/src/routes/learningImages.js:165"}, "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-3b60f82289c0ea6e", "name": "Commented-code block (6 lines) in server/src/routes/appConfig.js:127", "shortDescription": {"text": "Commented-code block (6 lines) in server/src/routes/appConfig.js:127"}, "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-478dcdbe8d1d3ce1", "name": "Commented-code block (5 lines) in server/src/routes/publicEvents.js:282", "shortDescription": {"text": "Commented-code block (5 lines) in server/src/routes/publicEvents.js:282"}, "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-c20ffe098a4ace93", "name": "Legacy-named symbol `etapa_v2` in server/src/routes/retentionCron.js:12", "shortDescription": {"text": "Legacy-named symbol `etapa_v2` in server/src/routes/retentionCron.js:12"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-471a301819860be0", "name": "Commented-code block (7 lines) in server/src/routes/retentionCron.js:79", "shortDescription": {"text": "Commented-code block (7 lines) in server/src/routes/retentionCron.js:79"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-678f82fd64cbc959", "name": "Legacy-named symbol `etapa_v2` in server/src/routes/admin.js:24", "shortDescription": {"text": "Legacy-named symbol `etapa_v2` in server/src/routes/admin.js:24"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-87f8bc32f78b2ac2", "name": "Commented-code block (8 lines) in server/src/routes/admin.js:64", "shortDescription": {"text": "Commented-code block (8 lines) in server/src/routes/admin.js:64"}, "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-31aa41380441d67e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server/src/routes/admin.js:1159", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/src/routes/admin.js:1159"}, "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-7e121105a736a2bc", "name": "Commented-code block (5 lines) in server/src/routes/eventsCacheCron.js:57", "shortDescription": {"text": "Commented-code block (5 lines) in server/src/routes/eventsCacheCron.js:57"}, "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-5e5f8cb7e317e916", "name": "Commented-code block (8 lines) in server/src/routes/feedback.js:519", "shortDescription": {"text": "Commented-code block (8 lines) in server/src/routes/feedback.js:519"}, "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-72435d1b942acbaa", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server/src/routes/feedback.js:143", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/src/routes/feedback.js:143"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c610dcdf52f93a61", "name": "Commented-code block (6 lines) in server/src/routes/ai.js:33", "shortDescription": {"text": "Commented-code block (6 lines) in server/src/routes/ai.js:33"}, "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-18c03021606c841d", "name": "Commented-code block (5 lines) in server/src/routes/events.js:141", "shortDescription": {"text": "Commented-code block (5 lines) in server/src/routes/events.js:141"}, "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-c8744708625736eb", "name": "Legacy-named symbol `etapa_v2` in server/src/routes/testReset.js:37", "shortDescription": {"text": "Legacy-named symbol `etapa_v2` in server/src/routes/testReset.js:37"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-695b35149265a159", "name": "Commented-code block (5 lines) in server/src/routes/testReset.js:31", "shortDescription": {"text": "Commented-code block (5 lines) in server/src/routes/testReset.js:31"}, "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-f93ea0eacd65ac10", "name": "Commented-code block (6 lines) in server/src/routes/localShops.js:71", "shortDescription": {"text": "Commented-code block (6 lines) in server/src/routes/localShops.js:71"}, "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-a3483795e1b59087", "name": "Commented-code block (7 lines) in server/src/routes/eventsCron.js:62", "shortDescription": {"text": "Commented-code block (7 lines) in server/src/routes/eventsCron.js:62"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-df447b422d41d4e3", "name": "Commented-code block (5 lines) in server/src/routes/notifications.js:87", "shortDescription": {"text": "Commented-code block (5 lines) in server/src/routes/notifications.js:87"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fffcaeaf167a8333", "name": "Commented-code block (5 lines) in server/src/routes/revenueCatWebhook.js:76", "shortDescription": {"text": "Commented-code block (5 lines) in server/src/routes/revenueCatWebhook.js:76"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-28c8acc32e6e5958", "name": "Commented-code block (5 lines) in server/src/routes/careNudgesCron.js:51", "shortDescription": {"text": "Commented-code block (5 lines) in server/src/routes/careNudgesCron.js:51"}, "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-d09a3d334b91cfb2", "name": "Commented-code block (8 lines) in server/src/routes/subscription.js:61", "shortDescription": {"text": "Commented-code block (8 lines) in server/src/routes/subscription.js:61"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4884631cb97195e4", "name": "Commented-code block (5 lines) in server/src/routes/planConfigs.js:68", "shortDescription": {"text": "Commented-code block (5 lines) in server/src/routes/planConfigs.js:68"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-737d94d92a6f52b8", "name": "Commented-code block (5 lines) in server/src/routes/postureCheck.js:81", "shortDescription": {"text": "Commented-code block (5 lines) in server/src/routes/postureCheck.js:81"}, "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-a06b5b55290f7034", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server/src/routes/support.js:35", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/src/routes/support.js:35"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-50465b9ffeb0cff7", "name": "Commented-code block (5 lines) in server/src/routes/findGoal.js:78", "shortDescription": {"text": "Commented-code block (5 lines) in server/src/routes/findGoal.js:78"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-41dab4e2ea5f3304", "name": "Commented-code block (5 lines) in server/src/routes/unsubscribe.js:70", "shortDescription": {"text": "Commented-code block (5 lines) in server/src/routes/unsubscribe.js:70"}, "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-327d39dc19a3f43e", "name": "Commented-code block (9 lines) in server/src/routes/bikeMaintenance.js:24", "shortDescription": {"text": "Commented-code block (9 lines) in server/src/routes/bikeMaintenance.js:24"}, "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-43971c57a33431e1", "name": "Commented-code block (10 lines) in server/src/routes/chatSessions.js:132", "shortDescription": {"text": "Commented-code block (10 lines) in server/src/routes/chatSessions.js:132"}, "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-96b80d9ea54fa724", "name": "Legacy-named symbol `etapa_v2` in server/src/routes/checkins.js:663", "shortDescription": {"text": "Legacy-named symbol `etapa_v2` in server/src/routes/checkins.js:663"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3113277285f095f1", "name": "Commented-code block (5 lines) in server/src/routes/checkins.js:178", "shortDescription": {"text": "Commented-code block (5 lines) in server/src/routes/checkins.js:178"}, "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-ce0fc037b067c0ba", "name": "Commented-code block (5 lines) in server/src/routes/users.js:132", "shortDescription": {"text": "Commented-code block (5 lines) in server/src/routes/users.js:132"}, "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-b2bec925ccfd4d54", "name": "Commented-code block (6 lines) in server/src/routes/exerciseWeights.js:132", "shortDescription": {"text": "Commented-code block (6 lines) in server/src/routes/exerciseWeights.js:132"}, "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-ae4197b0b352c7cd", "name": "Legacy-named symbol `etapa_v2` in server/src/routes/goals.js:4", "shortDescription": {"text": "Legacy-named symbol `etapa_v2` in server/src/routes/goals.js:4"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5b95f3aa1bd151e3", "name": "Commented-code block (6 lines) in server/src/routes/bikeFit.js:158", "shortDescription": {"text": "Commented-code block (6 lines) in server/src/routes/bikeFit.js:158"}, "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-2c4738bb65f77b5d", "name": "Legacy-named symbol `etapa_v2` in server/src/routes/bucketList.js:4", "shortDescription": {"text": "Legacy-named symbol `etapa_v2` in server/src/routes/bucketList.js:4"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7b24d2a2733f156b", "name": "Commented-code block (5 lines) in server/src/routes/strava.js:27", "shortDescription": {"text": "Commented-code block (5 lines) in server/src/routes/strava.js:27"}, "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-2ae05d9317621ac1", "name": "Commented-code block (8 lines) in server/src/routes/checkinsCron.js:189", "shortDescription": {"text": "Commented-code block (8 lines) in server/src/routes/checkinsCron.js:189"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-eea63b49ab984031", "name": "Legacy-named symbol `etapa_v2` in admin-dashboard/src/app/api/users/[id]/schema-status/route.ts:7", "shortDescription": {"text": "Legacy-named symbol `etapa_v2` in admin-dashboard/src/app/api/users/[id]/schema-status/route.ts:7"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-399627c4b8c09db6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 admin-dashboard/src/app/api/admins/route.ts:52", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 admin-dashboard/src/app/api/admins/route.ts:52"}, "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-65aa5024f9bb7487", "name": "`fetch()` without try/.catch or AbortSignal \u2014 admin-dashboard/src/app/api/coaches/route.ts:56", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 admin-dashboard/src/app/api/coaches/route.ts:56"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-02e301c17139dd0c", "name": "Commented-code block (6 lines) in admin-dashboard/src/app/api/coaching/users/[userId]/route.ts:5", "shortDescription": {"text": "Commented-code block (6 lines) in admin-dashboard/src/app/api/coaching/users/[userId]/route.ts:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f9b374f30d61aa96", "name": "`fetch()` without try/.catch or AbortSignal \u2014 admin-dashboard/src/app/api/coaching/notes/route.ts:18", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 admin-dashboard/src/app/api/coaching/notes/route.ts:18"}, "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-cb40549e3f1546cc", "name": "Commented-code block (6 lines) in admin-dashboard/src/app/dashboard/layout.tsx:9", "shortDescription": {"text": "Commented-code block (6 lines) in admin-dashboard/src/app/dashboard/layout.tsx:9"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-919e3fb54f4a7689", "name": "Commented-code block (6 lines) in admin-dashboard/src/app/dashboard/users/page.tsx:59", "shortDescription": {"text": "Commented-code block (6 lines) in admin-dashboard/src/app/dashboard/users/page.tsx:59"}, "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-8e6417a4ad4eb047", "name": "`fetch()` without try/.catch or AbortSignal \u2014 admin-dashboard/src/app/dashboard/users/page.tsx:126", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 admin-dashboard/src/app/dashboard/users/page.tsx:126"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-df074f34daaf87bd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 admin-dashboard/src/app/dashboard/users/[id]/page.tsx:254", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 admin-dashboard/src/app/dashboard/users/[id]/page.tsx:254"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ef3e677cb8ff1ac6", "name": "Commented-code block (5 lines) in admin-dashboard/src/app/dashboard/config/page.tsx:55", "shortDescription": {"text": "Commented-code block (5 lines) in admin-dashboard/src/app/dashboard/config/page.tsx:55"}, "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-e43a74ad2c04b686", "name": "`fetch()` without try/.catch or AbortSignal \u2014 admin-dashboard/src/app/dashboard/config/page.tsx:213", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 admin-dashboard/src/app/dashboard/config/page.tsx:213"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f1abea38117f8944", "name": "`fetch()` without try/.catch or AbortSignal \u2014 admin-dashboard/src/app/dashboard/events/page.tsx:59", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 admin-dashboard/src/app/dashboard/events/page.tsx:59"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-74763a3bd9da3151", "name": "`fetch()` without try/.catch or AbortSignal \u2014 admin-dashboard/src/app/dashboard/activity/page.tsx:147", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 admin-dashboard/src/app/dashboard/activity/page.tsx:147"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d607b807403d4d14", "name": "`fetch()` without try/.catch or AbortSignal \u2014 admin-dashboard/src/app/dashboard/admins/page.tsx:20", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 admin-dashboard/src/app/dashboard/admins/page.tsx:20"}, "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-f5881ba272cf0541", "name": "`fetch()` without try/.catch or AbortSignal \u2014 admin-dashboard/src/app/dashboard/payments/page.tsx:121", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 admin-dashboard/src/app/dashboard/payments/page.tsx:121"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-af8ce991e745882b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 admin-dashboard/src/app/dashboard/inspiration-picks/page.tsx:104", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 admin-dashboard/src/app/dashboard/inspiration-picks/page.tsx:104"}, "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-521c401d08eda885", "name": "`fetch()` without try/.catch or AbortSignal \u2014 admin-dashboard/src/app/dashboard/feedback/page.tsx:111", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 admin-dashboard/src/app/dashboard/feedback/page.tsx:111"}, "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-38903bd21956d3e8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 admin-dashboard/src/lib/etapa-api.ts:13", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 admin-dashboard/src/lib/etapa-api.ts:13"}, "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-96a2136d2e669325", "name": "Commented-code block (5 lines) in src/__tests__/mocks/audio-asset.js:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/__tests__/mocks/audio-asset.js: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-0edf57cd0bff3933", "name": "Commented-code block (6 lines) in src/__tests__/screens/MyEventsScreen.test.js:43", "shortDescription": {"text": "Commented-code block (6 lines) in src/__tests__/screens/MyEventsScreen.test.js:43"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d50e9641dab6a165", "name": "Commented-code block (6 lines) in src/__tests__/screens/FindAGoalResultsScreen.test.js:121", "shortDescription": {"text": "Commented-code block (6 lines) in src/__tests__/screens/FindAGoalResultsScreen.test.js:121"}, "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-29ba5cb32bf47c55", "name": "Commented-code block (7 lines) in src/__tests__/screens/CheckInScreen.test.js:85", "shortDescription": {"text": "Commented-code block (7 lines) in src/__tests__/screens/CheckInScreen.test.js:85"}, "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-981bb0b0d7533dd2", "name": "Commented-code block (5 lines) in src/__tests__/screens/EventDetailScreen.test.js:139", "shortDescription": {"text": "Commented-code block (5 lines) in src/__tests__/screens/EventDetailScreen.test.js:139"}, "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-72f830e48c535c85", "name": "Commented-code block (6 lines) in src/__tests__/screens/PlanConfigScreen.test.js:128", "shortDescription": {"text": "Commented-code block (6 lines) in src/__tests__/screens/PlanConfigScreen.test.js:128"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0f96bc75b2462d07", "name": "Commented-code block (5 lines) in src/__tests__/screens/OnboardingAthleteContextScreen.test.js:16", "shortDescription": {"text": "Commented-code block (5 lines) in src/__tests__/screens/OnboardingAthleteContextScreen.test.js:16"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d8fc0e7e52a1db5d", "name": "Commented-code block (6 lines) in src/__tests__/screens/PaywallScreen.test.js:49", "shortDescription": {"text": "Commented-code block (6 lines) in src/__tests__/screens/PaywallScreen.test.js:49"}, "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-bc8f7f541903c7e3", "name": "Commented-code block (6 lines) in src/__tests__/screens/SignInScreen.test.js:69", "shortDescription": {"text": "Commented-code block (6 lines) in src/__tests__/screens/SignInScreen.test.js:69"}, "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-0001a84c7cc630ab", "name": "Commented-code block (8 lines) in src/__tests__/screens/SettingsNestedScreens.test.js:56", "shortDescription": {"text": "Commented-code block (8 lines) in src/__tests__/screens/SettingsNestedScreens.test.js:56"}, "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-5cccc2727971b364", "name": "Commented-code block (7 lines) in src/__tests__/screens/HomeScreen.test.js:73", "shortDescription": {"text": "Commented-code block (7 lines) in src/__tests__/screens/HomeScreen.test.js:73"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7ae6d548715b1364", "name": "Commented-code block (5 lines) in src/__tests__/components/BucketListCard.test.js:139", "shortDescription": {"text": "Commented-code block (5 lines) in src/__tests__/components/BucketListCard.test.js:139"}, "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-d27b61f4a2ad0b95", "name": "Commented-code block (5 lines) in src/__tests__/components/SetupTrainingCard.test.js:204", "shortDescription": {"text": "Commented-code block (5 lines) in src/__tests__/components/SetupTrainingCard.test.js:204"}, "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-045a5d3f73ab06fa", "name": "Legacy-named symbol `etapa_pending_activity_syncs_v1` in src/__tests__/services/storageService.activitySync.test.js:38", "shortDescription": {"text": "Legacy-named symbol `etapa_pending_activity_syncs_v1` in src/__tests__/services/storageService.activitySync.test.js:38"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e35e9764acabff19", "name": "Commented-code block (8 lines) in src/__tests__/services/apiRetry.test.js:121", "shortDescription": {"text": "Commented-code block (8 lines) in src/__tests__/services/apiRetry.test.js:121"}, "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-3843db0c701346fb", "name": "Commented-code block (6 lines) in src/__tests__/services/storageService.weekContextHistory.test.js:16", "shortDescription": {"text": "Commented-code block (6 lines) in src/__tests__/services/storageService.weekContextHistory.test.js:16"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fbd684d4680be051", "name": "Legacy-named symbol `etapa_bucket_list_v1` in src/__tests__/services/storageService.signOutWipe.test.js:45", "shortDescription": {"text": "Legacy-named symbol `etapa_bucket_list_v1` in src/__tests__/services/storageService.signOutWipe.test.js:45"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2096d011cd3859d1", "name": "Commented-code block (8 lines) in src/screens/PlanOverviewScreen.js:67", "shortDescription": {"text": "Commented-code block (8 lines) in src/screens/PlanOverviewScreen.js:67"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9ea975abcd0466ab", "name": "Commented-code block (6 lines) in src/screens/ChangeCoachScreen.js:80", "shortDescription": {"text": "Commented-code block (6 lines) in src/screens/ChangeCoachScreen.js:80"}, "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-867ae0d9eb63a349", "name": "Commented-code block (5 lines) in src/screens/PlanLoadingScreen.js:95", "shortDescription": {"text": "Commented-code block (5 lines) in src/screens/PlanLoadingScreen.js:95"}, "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-9a7aebd41638e505", "name": "Commented-code block (5 lines) in src/screens/BikeFitLoadingScreen.js:41", "shortDescription": {"text": "Commented-code block (5 lines) in src/screens/BikeFitLoadingScreen.js:41"}, "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-02d8fdb57cb76516", "name": "Legacy-named symbol `etapa_v2` in src/screens/PlanVersionHistoryScreen.js:46", "shortDescription": {"text": "Legacy-named symbol `etapa_v2` in src/screens/PlanVersionHistoryScreen.js:46"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ab1419f39a0476ae", "name": "Commented-code block (7 lines) in src/screens/EventDetailScreen.js:69", "shortDescription": {"text": "Commented-code block (7 lines) in src/screens/EventDetailScreen.js:69"}, "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-6fdbf84d702e9b2f", "name": "Commented-code block (5 lines) in src/screens/TripsIntroScreen.js:51", "shortDescription": {"text": "Commented-code block (5 lines) in src/screens/TripsIntroScreen.js:51"}, "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-6d0a9bd2da509419", "name": "Commented-code block (5 lines) in src/screens/PlanReadyScreen.js:115", "shortDescription": {"text": "Commented-code block (5 lines) in src/screens/PlanReadyScreen.js:115"}, "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-1252208bedb61e0b", "name": "Commented-code block (5 lines) in src/screens/HomeScreen.js:95", "shortDescription": {"text": "Commented-code block (5 lines) in src/screens/HomeScreen.js:95"}, "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-01019e09b82f8c47", "name": "Commented-code block (8 lines) in src/screens/BeginnerProgramScreen.js:50", "shortDescription": {"text": "Commented-code block (8 lines) in src/screens/BeginnerProgramScreen.js:50"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ece7a26a223df840", "name": "Commented-code block (12 lines) in src/screens/FindAGoalResultsScreen.js:39", "shortDescription": {"text": "Commented-code block (12 lines) in src/screens/FindAGoalResultsScreen.js:39"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c7fa0832133fb124", "name": "Commented-code block (5 lines) in src/screens/OnboardingNameScreen.js:111", "shortDescription": {"text": "Commented-code block (5 lines) in src/screens/OnboardingNameScreen.js:111"}, "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-871b846cfd131e66", "name": "Commented-code block (6 lines) in src/screens/CheckInScreen.js:72", "shortDescription": {"text": "Commented-code block (6 lines) in src/screens/CheckInScreen.js:72"}, "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-9444e18ecb55fcf0", "name": "Commented-code block (5 lines) in src/screens/WashRoutineScreen.js:41", "shortDescription": {"text": "Commented-code block (5 lines) in src/screens/WashRoutineScreen.js:41"}, "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-773d685d6cecce55", "name": "Commented-code block (5 lines) in src/screens/AddGoalSimpleScreen.js:120", "shortDescription": {"text": "Commented-code block (5 lines) in src/screens/AddGoalSimpleScreen.js:120"}, "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-c87893eb6ac75eac", "name": "Commented-code block (5 lines) in src/screens/RiderProfileScreen.js:19", "shortDescription": {"text": "Commented-code block (5 lines) in src/screens/RiderProfileScreen.js:19"}, "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-20b3b048858b67c3", "name": "Commented-code block (7 lines) in src/screens/PaywallScreen.js:17", "shortDescription": {"text": "Commented-code block (7 lines) in src/screens/PaywallScreen.js:17"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f4fc350ed33f2408", "name": "Commented-code block (5 lines) in src/screens/AddEventScreen.js:123", "shortDescription": {"text": "Commented-code block (5 lines) in src/screens/AddEventScreen.js:123"}, "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-c674b570b8a1436c", "name": "Commented-code block (8 lines) in src/screens/GoalSetupScreen.js:44", "shortDescription": {"text": "Commented-code block (8 lines) in src/screens/GoalSetupScreen.js:44"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1411a28ae0adc97b", "name": "Commented-code block (5 lines) in src/screens/OnboardingAssessmentScreen.js:87", "shortDescription": {"text": "Commented-code block (5 lines) in src/screens/OnboardingAssessmentScreen.js:87"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-60596b6384ef541f", "name": "Commented-code block (5 lines) in src/screens/CoachChatScreen.js:46", "shortDescription": {"text": "Commented-code block (5 lines) in src/screens/CoachChatScreen.js:46"}, "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-4f0f198a7d18b7ac", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/screens/CoachChatScreen.js:2136", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/screens/CoachChatScreen.js:2136"}, "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-46af3dddfb3403ae", "name": "Commented-code block (22 lines) in src/screens/SignInScreen.js:13", "shortDescription": {"text": "Commented-code block (22 lines) in src/screens/SignInScreen.js: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-8778cd064d549e52", "name": "Commented-code block (5 lines) in src/screens/FindAGoalLoadingScreen.js:308", "shortDescription": {"text": "Commented-code block (5 lines) in src/screens/FindAGoalLoadingScreen.js:308"}, "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-6c72a8b149d818c9", "name": "Commented-code block (5 lines) in src/screens/NotificationsScreen.js:22", "shortDescription": {"text": "Commented-code block (5 lines) in src/screens/NotificationsScreen.js:22"}, "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-67b97e6410629223", "name": "Commented-code block (7 lines) in src/screens/WelcomeScreen.js:37", "shortDescription": {"text": "Commented-code block (7 lines) in src/screens/WelcomeScreen.js:37"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-723c398deb42f1ff", "name": "Commented-code block (11 lines) in src/screens/SettingsScreen.js:136", "shortDescription": {"text": "Commented-code block (11 lines) in src/screens/SettingsScreen.js:136"}, "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-40eebc3110d5bcc7", "name": "Commented-code block (7 lines) in src/screens/WeekViewScreen.js:98", "shortDescription": {"text": "Commented-code block (7 lines) in src/screens/WeekViewScreen.js:98"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c86b91f0b0b14a13", "name": "Legacy-named symbol `etapa_v2` in src/screens/ProgressScreen.js:5", "shortDescription": {"text": "Legacy-named symbol `etapa_v2` in src/screens/ProgressScreen.js:5"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d57506ee152b72e5", "name": "Commented-code block (5 lines) in src/screens/ProgressScreen.js:296", "shortDescription": {"text": "Commented-code block (5 lines) in src/screens/ProgressScreen.js:296"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ebf12fb6e0325ba0", "name": "Commented-code block (6 lines) in src/screens/PlanPickerScreen.js:51", "shortDescription": {"text": "Commented-code block (6 lines) in src/screens/PlanPickerScreen.js:51"}, "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-1fad5f355ffff463", "name": "Commented-code block (6 lines) in src/screens/ActivityDetailScreen.js:55", "shortDescription": {"text": "Commented-code block (6 lines) in src/screens/ActivityDetailScreen.js:55"}, "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-2d398c32889dcf19", "name": "Commented-code block (9 lines) in src/screens/WeeklySummaryScreen.js:48", "shortDescription": {"text": "Commented-code block (9 lines) in src/screens/WeeklySummaryScreen.js:48"}, "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-fe5f68067c52dd82", "name": "Commented-code block (5 lines) in src/screens/MCheckScreen.js:299", "shortDescription": {"text": "Commented-code block (5 lines) in src/screens/MCheckScreen.js: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-748ef8bc389f11a9", "name": "Commented-code block (7 lines) in src/screens/BikeFitFindingsScreen.js:79", "shortDescription": {"text": "Commented-code block (7 lines) in src/screens/BikeFitFindingsScreen.js:79"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-91258045c9f8c44f", "name": "Commented-code block (6 lines) in src/screens/OnboardingGoalPromptScreen.js:37", "shortDescription": {"text": "Commented-code block (6 lines) in src/screens/OnboardingGoalPromptScreen.js:37"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-20d40544e1089416", "name": "Commented-code block (15 lines) in src/screens/OnboardingLevelScreen.js:32", "shortDescription": {"text": "Commented-code block (15 lines) in src/screens/OnboardingLevelScreen.js:32"}, "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-641d5601fa8fe8df", "name": "Commented-code block (5 lines) in src/screens/OnboardingCoachScreen.js:87", "shortDescription": {"text": "Commented-code block (5 lines) in src/screens/OnboardingCoachScreen.js:87"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-61a503fc7880a4b8", "name": "Commented-code block (6 lines) in src/screens/FindAGoalIntroScreen.js:54", "shortDescription": {"text": "Commented-code block (6 lines) in src/screens/FindAGoalIntroScreen.js:54"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b727544b4e67ca90", "name": "Commented-code block (8 lines) in src/screens/MyEventsScreen.js:174", "shortDescription": {"text": "Commented-code block (8 lines) in src/screens/MyEventsScreen.js:174"}, "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-de330772a5db8e53", "name": "Commented-code block (7 lines) in src/screens/GettingStartedScreen.js:63", "shortDescription": {"text": "Commented-code block (7 lines) in src/screens/GettingStartedScreen.js:63"}, "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-67bf6478bfff4541", "name": "Legacy-named symbol `crossTrainingDaysLegacy` in src/screens/PlanConfigScreen.js:1132", "shortDescription": {"text": "Legacy-named symbol `crossTrainingDaysLegacy` in src/screens/PlanConfigScreen.js:1132"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6ad5b224d9d4a152", "name": "Commented-code block (8 lines) in src/screens/PlanConfigScreen.js:46", "shortDescription": {"text": "Commented-code block (8 lines) in src/screens/PlanConfigScreen.js:46"}, "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-85aac58a40ac7f15", "name": "Commented-code block (5 lines) in src/screens/OnboardingAthleteContextScreen.js:37", "shortDescription": {"text": "Commented-code block (5 lines) in src/screens/OnboardingAthleteContextScreen.js:37"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b2f0e4113262b3e9", "name": "Commented-code block (7 lines) in src/utils/location.js:1", "shortDescription": {"text": "Commented-code block (7 lines) in src/utils/location.js: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-e845803c47c567f2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/utils/location.js:102", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/utils/location.js:102"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4b266044a09c2239", "name": "Commented-code block (5 lines) in src/utils/strength.js:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/utils/strength.js: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-0440ab7799620c38", "name": "Commented-code block (5 lines) in src/utils/bikeSwap.js:45", "shortDescription": {"text": "Commented-code block (5 lines) in src/utils/bikeSwap.js:45"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-484a3e4e93a09173", "name": "Commented-code block (5 lines) in src/utils/sessionLabels.js:134", "shortDescription": {"text": "Commented-code block (5 lines) in src/utils/sessionLabels.js:134"}, "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-1eca4d7b73d0aa29", "name": "Commented-code block (6 lines) in src/utils/sessionReference.js:35", "shortDescription": {"text": "Commented-code block (6 lines) in src/utils/sessionReference.js:35"}, "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-0febf6251a2b0303", "name": "Commented-code block (6 lines) in src/components/UI.js:22", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/UI.js:22"}, "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-c1df471038faa824", "name": "Commented-code block (7 lines) in src/components/LoadingSplash.js:47", "shortDescription": {"text": "Commented-code block (7 lines) in src/components/LoadingSplash.js:47"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0c6baefb6faaddcc", "name": "Commented-code block (6 lines) in src/components/LearningImage.js:74", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/LearningImage.js:74"}, "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-bace6c18c98f4663", "name": "Commented-code block (5 lines) in src/components/BucketListCard.js:150", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/BucketListCard.js:150"}, "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-93f475d32a5a3d11", "name": "Legacy-named symbol `rowOld` in src/components/BikeSwapModal.js:156", "shortDescription": {"text": "Legacy-named symbol `rowOld` in src/components/BikeSwapModal.js:156"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-30a2d12ebdeed9b6", "name": "Commented-code block (11 lines) in src/components/PlanAddReviewSheet.js:26", "shortDescription": {"text": "Commented-code block (11 lines) in src/components/PlanAddReviewSheet.js:26"}, "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-e0fc98fd468003e4", "name": "Commented-code block (6 lines) in src/components/WizardShell.js:115", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/WizardShell.js:115"}, "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-44716dee3602dbf7", "name": "Commented-code block (5 lines) in src/components/BucketListItemSheet.js:136", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/BucketListItemSheet.js:136"}, "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-0c9c2a3f65f0cd82", "name": "Commented-code block (6 lines) in src/components/EventsMapView.js:116", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/EventsMapView.js:116"}, "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-284d06d0fda6edcd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/EventsMapView.js:123", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/EventsMapView.js:123"}, "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-78c13794a57aaa87", "name": "Commented-code block (5 lines) in src/components/LocationPickerModal.js:14", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/LocationPickerModal.js:14"}, "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-bad0890fc152faca", "name": "Commented-code block (10 lines) in src/components/SmartCareCard.js:145", "shortDescription": {"text": "Commented-code block (10 lines) in src/components/SmartCareCard.js:145"}, "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-c3be25bf0cf013e1", "name": "Commented-code block (5 lines) in src/components/BikeRetailersList.js:33", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/BikeRetailersList.js:33"}, "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-5bae1cb8e5913488", "name": "Commented-code block (5 lines) in src/components/InlineGoalCoachChat.js:38", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/InlineGoalCoachChat.js:38"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-54db5ca3fc98509c", "name": "Commented-code block (10 lines) in src/components/ExportInstructionsModal.js:48", "shortDescription": {"text": "Commented-code block (10 lines) in src/components/ExportInstructionsModal.js:48"}, "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-cd7ed39606815094", "name": "Commented-code block (5 lines) in src/components/CoachChatCard.js:27", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/CoachChatCard.js:27"}, "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-c93d33098844d7db", "name": "Commented-code block (5 lines) in src/components/ActivityFeedbackSheet.js:140", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/ActivityFeedbackSheet.js:140"}, "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-678f2c1855fe40cf", "name": "Commented-code block (7 lines) in src/components/RestTimer.js:91", "shortDescription": {"text": "Commented-code block (7 lines) in src/components/RestTimer.js: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-397e704ee95d86d9", "name": "Commented-code block (7 lines) in src/components/RouteFinderBanner.js:253", "shortDescription": {"text": "Commented-code block (7 lines) in src/components/RouteFinderBanner.js:253"}, "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-f763531498e2b13e", "name": "Commented-code block (7 lines) in src/theme/index.js:15", "shortDescription": {"text": "Commented-code block (7 lines) in src/theme/index.js:15"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5d63a04545900b2b", "name": "Commented-code block (5 lines) in src/theme/components/Chip.js:72", "shortDescription": {"text": "Commented-code block (5 lines) in src/theme/components/Chip.js:72"}, "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-af16169bd7a3ccd1", "name": "Commented-code block (7 lines) in src/lib/goalStatus.js:57", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/goalStatus.js:57"}, "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-ea3a2498e23e05ef", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/services/learningVideosCache.js:15", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/services/learningVideosCache.js:15"}, "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-54219011b0d7c725", "name": "Legacy-named symbol `etapa_bucket_list_v1` in src/services/storageService.js:34", "shortDescription": {"text": "Legacy-named symbol `etapa_bucket_list_v1` in src/services/storageService.js:34"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-41efa325741a7c28", "name": "Commented-code block (5 lines) in src/services/storageService.js:29", "shortDescription": {"text": "Commented-code block (5 lines) in src/services/storageService.js:29"}, "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-522070c63de21fac", "name": "Commented-code block (6 lines) in src/services/subscriptionService.js:146", "shortDescription": {"text": "Commented-code block (6 lines) in src/services/subscriptionService.js:146"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-018b12544980456b", "name": "Commented-code block (6 lines) in src/services/analyticsService.js:27", "shortDescription": {"text": "Commented-code block (6 lines) in src/services/analyticsService.js:27"}, "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-b7f471e4ebab4dab", "name": "Commented-code block (5 lines) in src/services/remoteConfig.js:78", "shortDescription": {"text": "Commented-code block (5 lines) in src/services/remoteConfig.js:78"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0bb2bf5f49fb47e1", "name": "Commented-code block (5 lines) in src/services/stravaSyncService.js:36", "shortDescription": {"text": "Commented-code block (5 lines) in src/services/stravaSyncService.js:36"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-86ece0c66ad030eb", "name": "Commented-code block (5 lines) in src/services/paywallNav.js:21", "shortDescription": {"text": "Commented-code block (5 lines) in src/services/paywallNav.js:21"}, "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-76e952a8f7a6c13d", "name": "Commented-code block (6 lines) in src/services/calendarPlanFlow.js:168", "shortDescription": {"text": "Commented-code block (6 lines) in src/services/calendarPlanFlow.js:168"}, "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-08f9b8b431761781", "name": "Commented-code block (8 lines) in src/services/postAuthRouting.js:41", "shortDescription": {"text": "Commented-code block (8 lines) in src/services/postAuthRouting.js:41"}, "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-ece9056f1a7e86d2", "name": "Commented-code block (6 lines) in src/services/notificationService.js:14", "shortDescription": {"text": "Commented-code block (6 lines) in src/services/notificationService.js:14"}, "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-35cb5c3a370396cf", "name": "Commented-code block (8 lines) in src/services/llmPlanService.js:19", "shortDescription": {"text": "Commented-code block (8 lines) in src/services/llmPlanService.js:19"}, "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-59fd3e30c75d9880", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/services/llmPlanService.js:205", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/services/llmPlanService.js:205"}, "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-c095757aed997fa2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/services/stravaService.js:99", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/services/stravaService.js:99"}, "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-e9b9ef641f196e3c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/services/connectivityMonitor.js:11", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/services/connectivityMonitor.js:11"}, "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-3d9169e3ad0a86ea", "name": "Commented-code block (8 lines) in src/services/bikeFitUpload.js:25", "shortDescription": {"text": "Commented-code block (8 lines) in src/services/bikeFitUpload.js:25"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9afd6179c56cad07", "name": "Commented-code block (5 lines) in src/services/api.js:34", "shortDescription": {"text": "Commented-code block (5 lines) in src/services/api.js:34"}, "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-39fbb892be0d0980", "name": "Commented-code block (5 lines) in src/services/revenueCatService.js:19", "shortDescription": {"text": "Commented-code block (5 lines) in src/services/revenueCatService.js:19"}, "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-697830c613ddca5d", "name": "Commented-code block (5 lines) in src/services/productIds.js:47", "shortDescription": {"text": "Commented-code block (5 lines) in src/services/productIds.js:47"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0a6689dc9b735f51", "name": "Commented-code block (10 lines) in src/services/etapaEssentials.js:39", "shortDescription": {"text": "Commented-code block (10 lines) in src/services/etapaEssentials.js:39"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e21799e888028c46", "name": "Commented-code block (5 lines) in src/services/planGenerator.js:790", "shortDescription": {"text": "Commented-code block (5 lines) in src/services/planGenerator.js:790"}, "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-1156c862f8216c6d", "name": "Commented-code block (7 lines) in e2e/runner.mjs:171", "shortDescription": {"text": "Commented-code block (7 lines) in e2e/runner.mjs:171"}, "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-f1852a2f1e6cbc82", "name": "`fetch()` without try/.catch or AbortSignal \u2014 e2e/runner.mjs:291", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 e2e/runner.mjs:291"}, "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-0f954a129a2c80b0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 e2e/scripts/bootstrap-accounts.mjs:73", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 e2e/scripts/bootstrap-accounts.mjs:73"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-500e3b7d9fe8faf0", "name": "76 env vars used in code but missing from .env.example", "shortDescription": {"text": "76 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ANTHROPIC_API_KEY`, `ATHLETE_CONTEXT_MODEL`, `CLAUDE_API_KEY`, `CLAUDE_CALLS_RETENTION_DAYS`, `CLAUDE_COST_CAP_WHITELIST`, `CLAUDE_COST_CAP_WHITELIST_USD`, `CLAUDE_DAILY_CAP_USD`, `CLAUDE_MODEL` + 68 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-778c67b9b30ad87b", "name": "Dangling fetch: POST /api/run-tests/cancel (tests/dashboard/src/app/results/page.js:126)", "shortDescription": {"text": "Dangling fetch: POST /api/run-tests/cancel (tests/dashboard/src/app/results/page.js:126)"}, "fullDescription": {"text": "`tests/dashboard/src/app/results/page.js:126` calls `POST /api/run-tests/cancel` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/run-tests/cancel`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b803ca444654c25a", "name": "Dangling fetch: POST /api/run-tests (tests/dashboard/src/app/results/page.js:187)", "shortDescription": {"text": "Dangling fetch: POST /api/run-tests (tests/dashboard/src/app/results/page.js:187)"}, "fullDescription": {"text": "`tests/dashboard/src/app/results/page.js:187` calls `POST /api/run-tests` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/run-tests`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4029445419628b3c", "name": "Dangling fetch: GET /api/speed-rules (tests/dashboard/src/app/speed-rules/page.js:35)", "shortDescription": {"text": "Dangling fetch: GET /api/speed-rules (tests/dashboard/src/app/speed-rules/page.js:35)"}, "fullDescription": {"text": "`tests/dashboard/src/app/speed-rules/page.js:35` calls `GET /api/speed-rules` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/speed-rules`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f8187cb15567a96a", "name": "Dangling fetch: POST /api/speed-rules/run (tests/dashboard/src/app/speed-rules/page.js:50)", "shortDescription": {"text": "Dangling fetch: POST /api/speed-rules/run (tests/dashboard/src/app/speed-rules/page.js:50)"}, "fullDescription": {"text": "`tests/dashboard/src/app/speed-rules/page.js:50` calls `POST /api/speed-rules/run` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/speed-rules/run`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-269eb01a8c038477", "name": "Dangling fetch: POST https://api.linear.app/graphql (server/src/index.js:203)", "shortDescription": {"text": "Dangling fetch: POST https://api.linear.app/graphql (server/src/index.js:203)"}, "fullDescription": {"text": "`server/src/index.js:203` calls `POST https://api.linear.app/graphql` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.linear.app/graphql`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-687bcd89cd6d2326", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/index.js:400)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/index.js:400)"}, "fullDescription": {"text": "`server/src/index.js:400` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0bd692d398ca8b39", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/index.js:720)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/index.js:720)"}, "fullDescription": {"text": "`server/src/index.js:720` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-580da608d865efd2", "name": "Dangling fetch: GET https://api.anthropic.com/v1/messages (server/src/lib/claudeLogger.js:28)", "shortDescription": {"text": "Dangling fetch: GET https://api.anthropic.com/v1/messages (server/src/lib/claudeLogger.js:28)"}, "fullDescription": {"text": "`server/src/lib/claudeLogger.js:28` calls `GET https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7533d10ddeeb5b4a", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/lib/claudeLogger.js:272)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/lib/claudeLogger.js:272)"}, "fullDescription": {"text": "`server/src/lib/claudeLogger.js:272` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e3bffca7fe4c1512", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/roadside.js:302)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/roadside.js:302)"}, "fullDescription": {"text": "`server/src/routes/roadside.js:302` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1de990376bd9fecd", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/publicEvents.js:348)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/publicEvents.js:348)"}, "fullDescription": {"text": "`server/src/routes/publicEvents.js:348` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-de9f57d6ce48f3a2", "name": "Dangling fetch: GET https://api.revenuecat.com/v1/subscribers/${encodeURIComponent(appUserId)} (server/src/routes/admin.", "shortDescription": {"text": "Dangling fetch: GET https://api.revenuecat.com/v1/subscribers/${encodeURIComponent(appUserId)} (server/src/routes/admin.js:121)"}, "fullDescription": {"text": "`server/src/routes/admin.js:121` calls `GET https://api.revenuecat.com/v1/subscribers/${encodeURIComponent(appUserId)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.revenuecat.com/v1/subscribers/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3794447f582a9ad6", "name": "Dangling fetch: POST https://api.revenuecat.com/v1/subscribers/${encodeURIComponent(appUserId)}/entitlements/${encodeURI", "shortDescription": {"text": "Dangling fetch: POST https://api.revenuecat.com/v1/subscribers/${encodeURIComponent(appUserId)}/entitlements/${encodeURIComponent(entitlementId)}/promotional (server/src/routes/admin.js:167)"}, "fullDescription": {"text": "`server/src/routes/admin.js:167` calls `POST https://api.revenuecat.com/v1/subscribers/${encodeURIComponent(appUserId)}/entitlements/${encodeURIComponent(entitlementId)}/promotional` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.revenuecat.com/v1/subscribers/<p>/entitlements/<p>/promotional`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7831296910f08afd", "name": "Dangling fetch: POST https://api.revenuecat.com/v1/subscribers/${encodeURIComponent(appUserId)}/entitlements/${encodeURI", "shortDescription": {"text": "Dangling fetch: POST https://api.revenuecat.com/v1/subscribers/${encodeURIComponent(appUserId)}/entitlements/${encodeURIComponent(entitlementId)}/revoke_promotionals (server/src/routes/admin.js:209)"}, "fullDescription": {"text": "`server/src/routes/admin.js:209` calls `POST https://api.revenuecat.com/v1/subscribers/${encodeURIComponent(appUserId)}/entitlements/${encodeURIComponent(entitlementId)}/revoke_promotionals` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.revenuecat.com/v1/subscribers/<p>/entitlements/<p>/revoke_promotionals`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-98384ea70191944a", "name": "Dangling fetch: POST https://api.linear.app/graphql (server/src/routes/admin.js:1159)", "shortDescription": {"text": "Dangling fetch: POST https://api.linear.app/graphql (server/src/routes/admin.js:1159)"}, "fullDescription": {"text": "`server/src/routes/admin.js:1159` calls `POST https://api.linear.app/graphql` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.linear.app/graphql`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b71d131a7f6581cb", "name": "Dangling fetch: POST https://api.linear.app/graphql (server/src/routes/admin.js:3257)", "shortDescription": {"text": "Dangling fetch: POST https://api.linear.app/graphql (server/src/routes/admin.js:3257)"}, "fullDescription": {"text": "`server/src/routes/admin.js:3257` calls `POST https://api.linear.app/graphql` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.linear.app/graphql`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-223977c1ebcda982", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/admin.js:3650)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/admin.js:3650)"}, "fullDescription": {"text": "`server/src/routes/admin.js:3650` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-12b96f6be5e7ebbb", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/admin.js:4444)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/admin.js:4444)"}, "fullDescription": {"text": "`server/src/routes/admin.js:4444` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-957b2e724e299ce7", "name": "Dangling fetch: POST https://api.linear.app/graphql (server/src/routes/feedback.js:143)", "shortDescription": {"text": "Dangling fetch: POST https://api.linear.app/graphql (server/src/routes/feedback.js:143)"}, "fullDescription": {"text": "`server/src/routes/feedback.js:143` calls `POST https://api.linear.app/graphql` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.linear.app/graphql`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-26a3e909faf922d6", "name": "Dangling fetch: POST https://api.linear.app/graphql (server/src/routes/feedback.js:594)", "shortDescription": {"text": "Dangling fetch: POST https://api.linear.app/graphql (server/src/routes/feedback.js:594)"}, "fullDescription": {"text": "`server/src/routes/feedback.js:594` calls `POST https://api.linear.app/graphql` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.linear.app/graphql`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c71f98d0a6ba9fed", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:155)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:155)"}, "fullDescription": {"text": "`server/src/routes/ai.js:155` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7d2bd02b9c0754b8", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:277)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:277)"}, "fullDescription": {"text": "`server/src/routes/ai.js:277` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a4f8afb4c9bdc4aa", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:345)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:345)"}, "fullDescription": {"text": "`server/src/routes/ai.js:345` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-61d34f5f9d16d735", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:505)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:505)"}, "fullDescription": {"text": "`server/src/routes/ai.js:505` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6eb4168b2c714d30", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:683)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:683)"}, "fullDescription": {"text": "`server/src/routes/ai.js:683` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-68424615cef9d0d6", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:866)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:866)"}, "fullDescription": {"text": "`server/src/routes/ai.js:866` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-817c3f11102000b6", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:1072)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:1072)"}, "fullDescription": {"text": "`server/src/routes/ai.js:1072` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b416a5fb91e61fde", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:1277)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:1277)"}, "fullDescription": {"text": "`server/src/routes/ai.js:1277` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4a23906348257f1f", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:1470)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:1470)"}, "fullDescription": {"text": "`server/src/routes/ai.js:1470` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0a2dd542085ecf0c", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:2712)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:2712)"}, "fullDescription": {"text": "`server/src/routes/ai.js:2712` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7d51128aa328ea08", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:2837)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:2837)"}, "fullDescription": {"text": "`server/src/routes/ai.js:2837` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c1db319ba789ab12", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:2964)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:2964)"}, "fullDescription": {"text": "`server/src/routes/ai.js:2964` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e1dab557fc46150a", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:3747)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:3747)"}, "fullDescription": {"text": "`server/src/routes/ai.js:3747` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-59b3f9761f7683e6", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:4463)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:4463)"}, "fullDescription": {"text": "`server/src/routes/ai.js:4463` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-227f07c7c916dd7f", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:4676)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:4676)"}, "fullDescription": {"text": "`server/src/routes/ai.js:4676` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7431d9bcbccad327", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:5654)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:5654)"}, "fullDescription": {"text": "`server/src/routes/ai.js:5654` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-cbf14cfb3deafc26", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:5902)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:5902)"}, "fullDescription": {"text": "`server/src/routes/ai.js:5902` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-df4b234f79d0f4c8", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:6564)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:6564)"}, "fullDescription": {"text": "`server/src/routes/ai.js:6564` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-550ef40baed23dc1", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:6683)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:6683)"}, "fullDescription": {"text": "`server/src/routes/ai.js:6683` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-64b9ea3ff7b90976", "name": "Dangling fetch: POST https://api.linear.app/graphql (server/src/routes/support.js:35)", "shortDescription": {"text": "Dangling fetch: POST https://api.linear.app/graphql (server/src/routes/support.js:35)"}, "fullDescription": {"text": "`server/src/routes/support.js:35` calls `POST https://api.linear.app/graphql` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.linear.app/graphql`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-30e1da91138f8726", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/checkins.js:966)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/checkins.js:966)"}, "fullDescription": {"text": "`server/src/routes/checkins.js:966` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ecc116aee987cf20", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/checkins.js:1108)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/checkins.js:1108)"}, "fullDescription": {"text": "`server/src/routes/checkins.js:1108` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-731c2d5a25fa64fe", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/checkins.js:1460)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/checkins.js:1460)"}, "fullDescription": {"text": "`server/src/routes/checkins.js:1460` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a3254fdf28070686", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/publicPlanPreview.js:211)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/publicPlanPreview.js:211)"}, "fullDescription": {"text": "`server/src/routes/publicPlanPreview.js:211` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-24cbd88187351980", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (e2e/runner.mjs:368)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (e2e/runner.mjs:368)"}, "fullDescription": {"text": "`e2e/runner.mjs:368` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-aa57566982c1be81", "name": "Dangling fetch: POST https://api.linear.app/graphql (e2e/runner.mjs:409)", "shortDescription": {"text": "Dangling fetch: POST https://api.linear.app/graphql (e2e/runner.mjs:409)"}, "fullDescription": {"text": "`e2e/runner.mjs:409` calls `POST https://api.linear.app/graphql` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.linear.app/graphql`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fef7ea842edfbf3f", "name": "Dangling fetch: POST /api/users/${userId}/${path} (admin-dashboard/src/app/dashboard/users/[id]/page.tsx:337)", "shortDescription": {"text": "Dangling fetch: POST /api/users/${userId}/${path} (admin-dashboard/src/app/dashboard/users/[id]/page.tsx:337)"}, "fullDescription": {"text": "`admin-dashboard/src/app/dashboard/users/[id]/page.tsx:337` calls `POST /api/users/${userId}/${path}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/users/<p>/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-306087738867d0b6", "name": "Dangling fetch: GET /api/config (admin-dashboard/src/app/dashboard/config/page.tsx:213)", "shortDescription": {"text": "Dangling fetch: GET /api/config (admin-dashboard/src/app/dashboard/config/page.tsx:213)"}, "fullDescription": {"text": "`admin-dashboard/src/app/dashboard/config/page.tsx:213` calls `GET /api/config` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/config`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-67e2e6014ca416a1", "name": "Dangling fetch: PUT /api/config (admin-dashboard/src/app/dashboard/config/page.tsx:310)", "shortDescription": {"text": "Dangling fetch: PUT /api/config (admin-dashboard/src/app/dashboard/config/page.tsx:310)"}, "fullDescription": {"text": "`admin-dashboard/src/app/dashboard/config/page.tsx:310` calls `PUT /api/config` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/config`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7e9a6aa0559d560b", "name": "Dangling fetch: PUT /api/config (admin-dashboard/src/app/dashboard/config/page.tsx:325)", "shortDescription": {"text": "Dangling fetch: PUT /api/config (admin-dashboard/src/app/dashboard/config/page.tsx:325)"}, "fullDescription": {"text": "`admin-dashboard/src/app/dashboard/config/page.tsx:325` calls `PUT /api/config` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/config`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f00afe5613231a96", "name": "Dangling fetch: PUT /api/config (admin-dashboard/src/app/dashboard/config/page.tsx:340)", "shortDescription": {"text": "Dangling fetch: PUT /api/config (admin-dashboard/src/app/dashboard/config/page.tsx:340)"}, "fullDescription": {"text": "`admin-dashboard/src/app/dashboard/config/page.tsx:340` calls `PUT /api/config` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/config`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ce28bd103ba288b2", "name": "Dangling fetch: PUT /api/config (admin-dashboard/src/app/dashboard/config/page.tsx:355)", "shortDescription": {"text": "Dangling fetch: PUT /api/config (admin-dashboard/src/app/dashboard/config/page.tsx:355)"}, "fullDescription": {"text": "`admin-dashboard/src/app/dashboard/config/page.tsx:355` calls `PUT /api/config` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/config`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f46033e458b6773b", "name": "Dangling fetch: PUT /api/config (admin-dashboard/src/app/dashboard/config/page.tsx:372)", "shortDescription": {"text": "Dangling fetch: PUT /api/config (admin-dashboard/src/app/dashboard/config/page.tsx:372)"}, "fullDescription": {"text": "`admin-dashboard/src/app/dashboard/config/page.tsx:372` calls `PUT /api/config` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/config`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a28736986214c4b0", "name": "Dangling fetch: PUT /api/config (admin-dashboard/src/app/dashboard/config/page.tsx:403)", "shortDescription": {"text": "Dangling fetch: PUT /api/config (admin-dashboard/src/app/dashboard/config/page.tsx:403)"}, "fullDescription": {"text": "`admin-dashboard/src/app/dashboard/config/page.tsx:403` calls `PUT /api/config` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/config`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-36e23c5a0d84cabc", "name": "Dangling fetch: PUT /api/config (admin-dashboard/src/app/dashboard/config/page.tsx:418)", "shortDescription": {"text": "Dangling fetch: PUT /api/config (admin-dashboard/src/app/dashboard/config/page.tsx:418)"}, "fullDescription": {"text": "`admin-dashboard/src/app/dashboard/config/page.tsx:418` calls `PUT /api/config` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/config`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-91e9e8f58c2fde3b", "name": "Dangling fetch: GET /api/coupons/redemptions (admin-dashboard/src/app/dashboard/payments/page.tsx:130)", "shortDescription": {"text": "Dangling fetch: GET /api/coupons/redemptions (admin-dashboard/src/app/dashboard/payments/page.tsx:130)"}, "fullDescription": {"text": "`admin-dashboard/src/app/dashboard/payments/page.tsx:130` calls `GET /api/coupons/redemptions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/coupons/redemptions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b5949c3133883e52", "name": "Dangling fetch: DELETE /api/payments/${deleteTarget.id} (admin-dashboard/src/app/dashboard/payments/page.tsx:142)", "shortDescription": {"text": "Dangling fetch: DELETE /api/payments/${deleteTarget.id} (admin-dashboard/src/app/dashboard/payments/page.tsx:142)"}, "fullDescription": {"text": "`admin-dashboard/src/app/dashboard/payments/page.tsx:142` calls `DELETE /api/payments/${deleteTarget.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/payments/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`mcp-server/src/index.js` declares `GET /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-efbc80312c5027b5", "name": "Unused endpoint: ALL /mcp", "shortDescription": {"text": "Unused endpoint: ALL /mcp"}, "fullDescription": {"text": "`mcp-server/src/index.js` declares `ALL /mcp` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c12359c53655d97c", "name": "Unused endpoint: POST /api/revenuecat/webhook", "shortDescription": {"text": "Unused endpoint: POST /api/revenuecat/webhook"}, "fullDescription": {"text": "`server/src/index.js` declares `POST /api/revenuecat/webhook` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9425b8ec72722c6b", "name": "Unused endpoint: GET /api/exports/workout", "shortDescription": {"text": "Unused endpoint: GET /api/exports/workout"}, "fullDescription": {"text": "`server/src/index.js` declares `GET /api/exports/workout` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fabc87c47563cf9e", "name": "Unused endpoint: POST /api/account-deletion", "shortDescription": {"text": "Unused endpoint: POST /api/account-deletion"}, "fullDescription": {"text": "`server/src/index.js` declares `POST /api/account-deletion` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e7a352cac59cfc66", "name": "Unused endpoint: POST /api/public/register-interest", "shortDescription": {"text": "Unused endpoint: POST /api/public/register-interest"}, "fullDescription": {"text": "`server/src/index.js` declares `POST /api/public/register-interest` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-96b03530476b6f5d", "name": "Unused endpoint: POST /api/public/demo-event", "shortDescription": {"text": "Unused endpoint: POST /api/public/demo-event"}, "fullDescription": {"text": "`server/src/index.js` declares `POST /api/public/demo-event` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-10886a5c42b1e1c8", "name": "Unused endpoint: POST /api/public/coach-ask", "shortDescription": {"text": "Unused endpoint: POST /api/public/coach-ask"}, "fullDescription": {"text": "`server/src/index.js` declares `POST /api/public/coach-ask` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-92958cf56f85069c", "name": "Unused endpoint: POST /api/public/review-plan", "shortDescription": {"text": "Unused endpoint: POST /api/public/review-plan"}, "fullDescription": {"text": "`server/src/index.js` declares `POST /api/public/review-plan` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-74fc645e6347c183", "name": "Unused endpoint: POST /api/public/sample-plan", "shortDescription": {"text": "Unused endpoint: POST /api/public/sample-plan"}, "fullDescription": {"text": "`server/src/index.js` declares `POST /api/public/sample-plan` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0467dc02ced13a1c", "name": "Unused endpoint: GET /api/public/prices", "shortDescription": {"text": "Unused endpoint: GET /api/public/prices"}, "fullDescription": {"text": "`server/src/index.js` declares `GET /api/public/prices` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4ff40cb10f7c8519", "name": "Unused endpoint: USE /api/users", "shortDescription": {"text": "Unused endpoint: USE /api/users"}, "fullDescription": {"text": "`server/src/index.js` declares `USE /api/users` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7522dc7e4529ffc2", "name": "Unused endpoint: USE /api/goals", "shortDescription": {"text": "Unused endpoint: USE /api/goals"}, "fullDescription": {"text": "`server/src/index.js` declares `USE /api/goals` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d77cb9ba2ceab6f2", "name": "Unused endpoint: USE /api/bucket-list", "shortDescription": {"text": "Unused endpoint: USE /api/bucket-list"}, "fullDescription": {"text": "`server/src/index.js` declares `USE /api/bucket-list` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-39896fd3e88e0074", "name": "Unused endpoint: USE /api/plans", "shortDescription": {"text": "Unused endpoint: USE /api/plans"}, "fullDescription": {"text": "`server/src/index.js` declares `USE /api/plans` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ecf059754654e54d", "name": "Unused endpoint: USE /api/plan-configs", "shortDescription": {"text": "Unused endpoint: USE /api/plan-configs"}, "fullDescription": {"text": "`server/src/index.js` declares `USE /api/plan-configs` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f96c79944f4d73af", "name": "Unused endpoint: USE /api/chat-sessions", "shortDescription": {"text": "Unused endpoint: USE /api/chat-sessions"}, "fullDescription": {"text": "`server/src/index.js` declares `USE /api/chat-sessions` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-316c43db307befc3", "name": "Unused endpoint: USE /api/ai", "shortDescription": {"text": "Unused endpoint: USE /api/ai"}, "fullDescription": {"text": "`server/src/index.js` declares `USE /api/ai` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-454e5ba6b67ab18b", "name": "Unused endpoint: USE /api/subscription", "shortDescription": {"text": "Unused endpoint: USE /api/subscription"}, "fullDescription": {"text": "`server/src/index.js` declares `USE /api/subscription` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e6c42c2627e519e8", "name": "Unused endpoint: USE /api/feedback", "shortDescription": {"text": "Unused endpoint: USE /api/feedback"}, "fullDescription": {"text": "`server/src/index.js` declares `USE /api/feedback` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4704263493f7c11d", "name": "Unused endpoint: USE /api/support", "shortDescription": {"text": "Unused endpoint: USE /api/support"}, "fullDescription": {"text": "`server/src/index.js` declares `USE /api/support` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c3a8b7932f72b92f", "name": "Unused endpoint: USE /api/notifications", "shortDescription": {"text": "Unused endpoint: USE /api/notifications"}, "fullDescription": {"text": "`server/src/index.js` declares `USE /api/notifications` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4d0af7c9d96abd10", "name": "Unused endpoint: USE /api/preferences", "shortDescription": {"text": "Unused endpoint: USE /api/preferences"}, "fullDescription": {"text": "`server/src/index.js` declares `USE /api/preferences` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-473f5b7d3ee1c86e", "name": "Unused endpoint: USE /api/app-config", "shortDescription": {"text": "Unused endpoint: USE /api/app-config"}, "fullDescription": {"text": "`server/src/index.js` declares `USE /api/app-config` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-446fe4b6ad1a4ff9", "name": "Unused endpoint: USE /api/public", "shortDescription": {"text": "Unused endpoint: USE /api/public"}, "fullDescription": {"text": "`server/src/index.js` declares `USE /api/public` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8e3baafac5794889", "name": "Unused endpoint: USE /api/public/events", "shortDescription": {"text": "Unused endpoint: USE /api/public/events"}, "fullDescription": {"text": "`server/src/index.js` declares `USE /api/public/events` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6fba83805be4e883", "name": "Unused endpoint: USE /api/public/event-plan-preview", "shortDescription": {"text": "Unused endpoint: USE /api/public/event-plan-preview"}, "fullDescription": {"text": "`server/src/index.js` declares `USE /api/public/event-plan-preview` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e71288fdc93fb110", "name": "Unused endpoint: USE /api/coach-checkin", "shortDescription": {"text": "Unused endpoint: USE /api/coach-checkin"}, "fullDescription": {"text": "`server/src/index.js` declares `USE /api/coach-checkin` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9ea8576d3e096f64", "name": "Unused endpoint: USE /api/checkins", "shortDescription": {"text": "Unused endpoint: USE /api/checkins"}, "fullDescription": {"text": "`server/src/index.js` declares `USE /api/checkins` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a443a6edb90149cf", "name": "Unused endpoint: USE /api/checkin-prefs", "shortDescription": {"text": "Unused endpoint: USE /api/checkin-prefs"}, "fullDescription": {"text": "`server/src/index.js` declares `USE /api/checkin-prefs` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-05f25653c6bf5bd3", "name": "Unused endpoint: USE /api/checkins-cron", "shortDescription": {"text": "Unused endpoint: USE /api/checkins-cron"}, "fullDescription": {"text": "`server/src/index.js` declares `USE /api/checkins-cron` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d93a530ce10d47d9", "name": "Unused endpoint: USE /api/admin", "shortDescription": {"text": "Unused endpoint: USE /api/admin"}, "fullDescription": {"text": "`server/src/index.js` declares `USE /api/admin` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0e76e800612b093e", "name": "Unused endpoint: USE /api/coaching", "shortDescription": {"text": "Unused endpoint: USE /api/coaching"}, "fullDescription": {"text": "`server/src/index.js` declares `USE /api/coaching` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e3a81fb42ac44e31", "name": "Unused endpoint: USE /api/coupons", "shortDescription": {"text": "Unused endpoint: USE /api/coupons"}, "fullDescription": {"text": "`server/src/index.js` declares `USE /api/coupons` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-148690a8d35e14f1", "name": "Unused endpoint: USE /api/test", "shortDescription": {"text": "Unused endpoint: USE /api/test"}, "fullDescription": {"text": "`server/src/index.js` declares `USE /api/test` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6e291966feff31e8", "name": "Unused endpoint: USE /api/find-goal", "shortDescription": {"text": "Unused endpoint: USE /api/find-goal"}, "fullDescription": {"text": "`server/src/index.js` declares `USE /api/find-goal` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c12467899a0690da", "name": "Unused endpoint: USE /api/bike-fit", "shortDescription": {"text": "Unused endpoint: USE /api/bike-fit"}, "fullDescription": {"text": "`server/src/index.js` declares `USE /api/bike-fit` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b8499e5241ba3b78", "name": "Unused endpoint: USE /api/bike-maintenance", "shortDescription": {"text": "Unused endpoint: USE /api/bike-maintenance"}, "fullDescription": {"text": "`server/src/index.js` declares `USE /api/bike-maintenance` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f2ebfdb2670694dd", "name": "Unused endpoint: USE /api/bikes", "shortDescription": {"text": "Unused endpoint: USE /api/bikes"}, "fullDescription": {"text": "`server/src/index.js` declares `USE /api/bikes` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ec00984b27c88c15", "name": "Unused endpoint: USE /api/events", "shortDescription": {"text": "Unused endpoint: USE /api/events"}, "fullDescription": {"text": "`server/src/index.js` declares `USE /api/events` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0eb0ecf2a1b99bfe", "name": "Unused endpoint: USE /api/roadside", "shortDescription": {"text": "Unused endpoint: USE /api/roadside"}, "fullDescription": {"text": "`server/src/index.js` declares `USE /api/roadside` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8adbc8143200eb27", "name": "Unused endpoint: USE /api/gear", "shortDescription": {"text": "Unused endpoint: USE /api/gear"}, "fullDescription": {"text": "`server/src/index.js` declares `USE /api/gear` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cd9caded528219d7", "name": "Unused endpoint: USE /api/posture-check", "shortDescription": {"text": "Unused endpoint: USE /api/posture-check"}, "fullDescription": {"text": "`server/src/index.js` declares `USE /api/posture-check` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7b72e785cf7a777e", "name": "Unused endpoint: USE /api/exercise-weights", "shortDescription": {"text": "Unused endpoint: USE /api/exercise-weights"}, "fullDescription": {"text": "`server/src/index.js` declares `USE /api/exercise-weights` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-00fbee7010923880", "name": "Unused endpoint: USE /api/care-nudges-cron", "shortDescription": {"text": "Unused endpoint: USE /api/care-nudges-cron"}, "fullDescription": {"text": "`server/src/index.js` declares `USE /api/care-nudges-cron` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ba09eb3a80e4a45b", "name": "Unused endpoint: USE /api/events-cron", "shortDescription": {"text": "Unused endpoint: USE /api/events-cron"}, "fullDescription": {"text": "`server/src/index.js` declares `USE /api/events-cron` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-51c976774ce44b52", "name": "Unused endpoint: USE /api/retention-cron", "shortDescription": {"text": "Unused endpoint: USE /api/retention-cron"}, "fullDescription": {"text": "`server/src/index.js` declares `USE /api/retention-cron` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-17fe6d70b64078f3", "name": "Unused endpoint: USE /api/events-cache-cron", "shortDescription": {"text": "Unused endpoint: USE /api/events-cache-cron"}, "fullDescription": {"text": "`server/src/index.js` declares `USE /api/events-cache-cron` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c714fb0af5e1396a", "name": "Unused endpoint: USE /api/local-shops", "shortDescription": {"text": "Unused endpoint: USE /api/local-shops"}, "fullDescription": {"text": "`server/src/index.js` declares `USE /api/local-shops` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4abc11ab333e78df", "name": "Unused endpoint: USE /api/learning-images", "shortDescription": {"text": "Unused endpoint: USE /api/learning-images"}, "fullDescription": {"text": "`server/src/index.js` declares `USE /api/learning-images` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/18108"}, "properties": {"repository": "rhoneybul/etapa", "repoUrl": "https://github.com/rhoneybul/etapa", "branch": "main"}, "results": [{"ruleId": "scanner-d5973741fbb478fd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 _chk.js:7"}, "properties": {"repobilityId": "7f94500121510616", "scanner": "scanner-primary", "fingerprint": "d5973741fbb478fd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6be938c57325b7fe", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/planGenerator.test.js:1422"}, "properties": {"repobilityId": "cea44a4a8ee207c8", "scanner": "scanner-primary", "fingerprint": "6be938c57325b7fe", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f6399920ff3d0a58", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/workoutExport.test.js:12"}, "properties": {"repobilityId": "89ef3d75a4af8019", "scanner": "scanner-primary", "fingerprint": "f6399920ff3d0a58", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8e2cbb079252b1ed", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/exportSigning.test.js:13"}, "properties": {"repobilityId": "fd9667eb5e049c73", "scanner": "scanner-primary", "fingerprint": "8e2cbb079252b1ed", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d5fdeba4646c71c7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/checkinSafety.test.js:12"}, "properties": {"repobilityId": "c20a11c77848936e", "scanner": "scanner-primary", "fingerprint": "d5fdeba4646c71c7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a683397537c6c774", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/bikeSwap.test.js:19"}, "properties": {"repobilityId": "ac38cde5d0d61258", "scanner": "scanner-primary", "fingerprint": "a683397537c6c774", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-635ed7cb55343137", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/sessionStructure.test.js:36"}, "properties": {"repobilityId": "bc21524be3951404", "scanner": "scanner-primary", "fingerprint": "635ed7cb55343137", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ca09f035259d61be", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/piiRedaction.test.js:12"}, "properties": {"repobilityId": "4572ef4034037346", "scanner": "scanner-primary", "fingerprint": "ca09f035259d61be", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-81f24a58dfe78960", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/rideSpeedRules.test.js:45"}, "properties": {"repobilityId": "0cc7bf7210265d12", "scanner": "scanner-primary", "fingerprint": "81f24a58dfe78960", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4e20345a08c62309", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/mergeMarkers.test.js:69"}, "properties": {"repobilityId": "119cf6deaf4ae64d", "scanner": "scanner-primary", "fingerprint": "4e20345a08c62309", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-81a0dc46054172ed", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/rideTips.test.js:28"}, "properties": {"repobilityId": "2e3e3f26732a0e77", "scanner": "scanner-primary", "fingerprint": "81a0dc46054172ed", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-397c4893b307733c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/slack.test.js:12"}, "properties": {"repobilityId": "b61bb9a073ba2183", "scanner": "scanner-primary", "fingerprint": "397c4893b307733c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-acb8aa1a6b1143dd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/sessionReference.test.js:26"}, "properties": {"repobilityId": "90a633ae0ebdf9bb", "scanner": "scanner-primary", "fingerprint": "acb8aa1a6b1143dd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e6fc03f1d92e461b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/dashboard/src/app/api/run-tests/route.js:566"}, "properties": {"repobilityId": "9535bf8f0d48dd0e", "scanner": "scanner-primary", "fingerprint": "e6fc03f1d92e461b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-67d7b442be685480", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/harness/mocks/anthropic.js:378"}, "properties": {"repobilityId": "c68133afdb609e24", "scanner": "scanner-primary", "fingerprint": "67d7b442be685480", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7d6c3723ab933a63", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate-all-riders-to-v2.js:83"}, "properties": {"repobilityId": "00c17127d3d5e353", "scanner": "scanner-primary", "fingerprint": "7d6c3723ab933a63", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5ea875875354b1b0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/remote-first-audit.js:141"}, "properties": {"repobilityId": "16d4e80dd481216d", "scanner": "scanner-primary", "fingerprint": "5ea875875354b1b0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0fb7fc247b182698", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/learning-images-snapshot.js:169"}, "properties": {"repobilityId": "3ee13fccf76b2eb9", "scanner": "scanner-primary", "fingerprint": "0fb7fc247b182698", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4ef10fc17ab4f990", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 mcp-server/src/index.js:117"}, "properties": {"repobilityId": "126e52e608a261cf", "scanner": "scanner-primary", "fingerprint": "4ef10fc17ab4f990", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d0fb0f9726078e85", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 server/__tests__/feedback-notifications.test.js:25"}, "properties": {"repobilityId": "584d0864132ec0fb", "scanner": "scanner-primary", "fingerprint": "d0fb0f9726078e85", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-d6f4d471da667095", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 server/__tests__/routes/find-goal.test.js:84"}, "properties": {"repobilityId": "88d202ec78cd49f0", "scanner": "scanner-primary", "fingerprint": "d6f4d471da667095", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-5cc87056c1d71ee9", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 server/__tests__/routes/subscription-and-webhooks.test.js:77"}, "properties": {"repobilityId": "bf42fedcc2ef04c3", "scanner": "scanner-primary", "fingerprint": "5cc87056c1d71ee9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-39f148ec358a243f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/scripts/boot-smoke-test.js:54"}, "properties": {"repobilityId": "6bcfb7ef943359b7", "scanner": "scanner-primary", "fingerprint": "39f148ec358a243f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-54d092cc710bc951", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/scripts/seed-events-cache.js:36"}, "properties": {"repobilityId": "e1fe9401a3d70e6c", "scanner": "scanner-primary", "fingerprint": "54d092cc710bc951", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2ccc787b71ec9a33", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/scripts/run-event-search-scenarios.js:497"}, "properties": {"repobilityId": "a8685dd4c591b7e3", "scanner": "scanner-primary", "fingerprint": "2ccc787b71ec9a33", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d88735e672641e23", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/index.js:916"}, "properties": {"repobilityId": "320f2eb194d6231c", "scanner": "scanner-primary", "fingerprint": "d88735e672641e23", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5559fee0977c74a7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/lib/pushService.js:31"}, "properties": {"repobilityId": "7c8b52f0e3140b4b", "scanner": "scanner-primary", "fingerprint": "5559fee0977c74a7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7c0d40ffd4515d86", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/lib/eventEnricher.js:261"}, "properties": {"repobilityId": "c65fcde09f16c111", "scanner": "scanner-primary", "fingerprint": "7c0d40ffd4515d86", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0bfbc231327fd2c1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/lib/slack.js:112"}, "properties": {"repobilityId": "ecb74727ae3018c5", "scanner": "scanner-primary", "fingerprint": "0bfbc231327fd2c1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a3ee3b30854671d0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/lib/coachChatReaper.js:85"}, "properties": {"repobilityId": "e7c722634575e7be", "scanner": "scanner-primary", "fingerprint": "a3ee3b30854671d0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b0a7a9511997814a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/lib/claudeLogger.js:148"}, "properties": {"repobilityId": "2057c9efb5c9a968", "scanner": "scanner-primary", "fingerprint": "b0a7a9511997814a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7bbfaafd9e276691", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/lib/planGenReaper.js:108"}, "properties": {"repobilityId": "8e8312531a48242c", "scanner": "scanner-primary", "fingerprint": "7bbfaafd9e276691", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-02c8740634934947", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/routes/appConfig.js:144"}, "properties": {"repobilityId": "b94b33261fca9255", "scanner": "scanner-primary", "fingerprint": "02c8740634934947", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-59d684c2ba0a2092", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/routes/retentionCron.js:152"}, "properties": {"repobilityId": "b282b012893e8edb", "scanner": "scanner-primary", "fingerprint": "59d684c2ba0a2092", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5aefa9318288370d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/routes/admin.js:2079"}, "properties": {"repobilityId": "5c0bef224c0d7f4c", "scanner": "scanner-primary", "fingerprint": "5aefa9318288370d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-29802584180ce373", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/routes/eventsCacheCron.js:432"}, "properties": {"repobilityId": "db5c23252325ac17", "scanner": "scanner-primary", "fingerprint": "29802584180ce373", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c6e94f866593a543", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/routes/feedback.js:156"}, "properties": {"repobilityId": "84bf4088136346f8", "scanner": "scanner-primary", "fingerprint": "c6e94f866593a543", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e6f3cd6e153fab57", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/routes/ai.js:5940"}, "properties": {"repobilityId": "ee17a1537dab9d7f", "scanner": "scanner-primary", "fingerprint": "e6f3cd6e153fab57", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c0bfc367b4e5f06c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/routes/coupons.js:145"}, "properties": {"repobilityId": "06e7df7172dc89fd", "scanner": "scanner-primary", "fingerprint": "c0bfc367b4e5f06c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-73baba55719581e5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/routes/revenueCatWebhook.js:166"}, "properties": {"repobilityId": "dbffd3ade7fb6e9c", "scanner": "scanner-primary", "fingerprint": "73baba55719581e5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e15de2ac9a8f9572", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/routes/support.js:48"}, "properties": {"repobilityId": "f8905ae7dba83fe1", "scanner": "scanner-primary", "fingerprint": "e15de2ac9a8f9572", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-eb5131ed720005e9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/routes/findGoal.js:1160"}, "properties": {"repobilityId": "75ddc3b6ea5d214e", "scanner": "scanner-primary", "fingerprint": "eb5131ed720005e9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fbc980e79acae713", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/routes/checkins.js:1225"}, "properties": {"repobilityId": "bb1fec95b43bd9da", "scanner": "scanner-primary", "fingerprint": "fbc980e79acae713", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ea4e8deb3f5a6e0c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/routes/users.js:105"}, "properties": {"repobilityId": "3e805cc04820821f", "scanner": "scanner-primary", "fingerprint": "ea4e8deb3f5a6e0c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-62c902f1cf7832d3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 admin-dashboard/src/app/dashboard/layout.tsx:150"}, "properties": {"repobilityId": "14dab70e5526eb73", "scanner": "scanner-primary", "fingerprint": "62c902f1cf7832d3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-10f5f2137e6b8657", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 admin-dashboard/src/app/dashboard/activity/page.tsx:516"}, "properties": {"repobilityId": "451df747a535c354", "scanner": "scanner-primary", "fingerprint": "10f5f2137e6b8657", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-bac4135dfdd49e1e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 admin-dashboard/src/app/dashboard/admins/page.tsx:147"}, "properties": {"repobilityId": "2fdb77e89bfc3014", "scanner": "scanner-primary", "fingerprint": "bac4135dfdd49e1e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ed4ab6316a8d90cb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 admin-dashboard/src/app/dashboard/payments/page.tsx:278"}, "properties": {"repobilityId": "d5a41ccdbb4e620e", "scanner": "scanner-primary", "fingerprint": "ed4ab6316a8d90cb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-daeaa22996b10f24", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 admin-dashboard/src/app/dashboard/feedback/page.tsx:169"}, "properties": {"repobilityId": "e3b9f0b0db2ada6b", "scanner": "scanner-primary", "fingerprint": "daeaa22996b10f24", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-71d1d6ac20b32472", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/__tests__/screens/FindAGoalResultsScreen.test.js:100"}, "properties": {"repobilityId": "3bc774faab8e3925", "scanner": "scanner-primary", "fingerprint": "71d1d6ac20b32472", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-18216bcf1b4f4252", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/__tests__/components/SetupTrainingCard.test.js:204"}, "properties": {"repobilityId": "eb860ec2bae3fa65", "scanner": "scanner-primary", "fingerprint": "18216bcf1b4f4252", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-cfd862ef0eed80f3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/screens/HomeScreen.js:631"}, "properties": {"repobilityId": "6704b9d5e44c7ac5", "scanner": "scanner-primary", "fingerprint": "cfd862ef0eed80f3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b084c39525c097cc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/screens/PlanConfigScreen.js:1332"}, "properties": {"repobilityId": "28c3805e13aed452", "scanner": "scanner-primary", "fingerprint": "b084c39525c097cc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b0bfe7d448f6dae7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/services/storageService.js:421"}, "properties": {"repobilityId": "c1524a1f1ce0c16c", "scanner": "scanner-primary", "fingerprint": "b0bfe7d448f6dae7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7a75ebe4a4666592", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/services/analyticsService.js:66"}, "properties": {"repobilityId": "a076dc221542748c", "scanner": "scanner-primary", "fingerprint": "7a75ebe4a4666592", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d29939c9819f6a05", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/services/notificationService.js:57"}, "properties": {"repobilityId": "3cc103e6a8a552cd", "scanner": "scanner-primary", "fingerprint": "d29939c9819f6a05", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-936e5307bd840264", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/services/revenueCatService.js:78"}, "properties": {"repobilityId": "7cb4b8855fdd5a0b", "scanner": "scanner-primary", "fingerprint": "936e5307bd840264", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0e2460270d93a260", "level": "warning", "message": {"text": "Dockerfile runs as root: mcp-server/Dockerfile"}, "properties": {"repobilityId": "2fc32db9c026ebf2", "scanner": "scanner-primary", "fingerprint": "0e2460270d93a260", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-787e483f8183db8f", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "properties": {"repobilityId": "489969830de07a64", "scanner": "scanner-primary", "fingerprint": "787e483f8183db8f", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "mcp-server/Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"ruleId": "scanner-ce519d0ea8aa8d1f", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in website/event.html:218"}, "properties": {"repobilityId": "6e8025343c4ff1ca", "scanner": "scanner-primary", "fingerprint": "ce519d0ea8aa8d1f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "website/event.html"}, "region": {"startLine": 218}}}]}, {"ruleId": "scanner-5414ba2c41cb2eae", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in website/plan-preview.html:466"}, "properties": {"repobilityId": "a1cca707ed4b580e", "scanner": "scanner-primary", "fingerprint": "5414ba2c41cb2eae", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "website/plan-preview.html"}, "region": {"startLine": 466}}}]}, {"ruleId": "scanner-a5e19daddc610ec5", "level": "warning", "message": {"text": "Insecure pattern 'insert_adjacent_html' in website/plan-preview.html:535"}, "properties": {"repobilityId": "da60b69e6b27e1f5", "scanner": "scanner-primary", "fingerprint": "a5e19daddc610ec5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "insert_adjacent_html"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "website/plan-preview.html"}, "region": {"startLine": 535}}}]}, {"ruleId": "scanner-aacaf48924ceea54", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in website/events.html:598"}, "properties": {"repobilityId": "53e2c1e80b34d418", "scanner": "scanner-primary", "fingerprint": "aacaf48924ceea54", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "website/events.html"}, "region": {"startLine": 598}}}]}, {"ruleId": "scanner-9232440117702634", "level": "warning", "message": {"text": "Insecure pattern 'insert_adjacent_html' in website/events.html:599"}, "properties": {"repobilityId": "c74acc797b3690f0", "scanner": "scanner-primary", "fingerprint": "9232440117702634", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "insert_adjacent_html"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "website/events.html"}, "region": {"startLine": 599}}}]}, {"ruleId": "scanner-b8d3d6236f73d4b7", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in website/register-interest.js:121"}, "properties": {"repobilityId": "65c1e0e0521254f0", "scanner": "scanner-primary", "fingerprint": "b8d3d6236f73d4b7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "website/register-interest.js"}, "region": {"startLine": 121}}}]}, {"ruleId": "scanner-9cb9a45052521b14", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in website/developers.html:434"}, "properties": {"repobilityId": "a466d3649f1e2b9e", "scanner": "scanner-primary", "fingerprint": "9cb9a45052521b14", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "website/developers.html"}, "region": {"startLine": 434}}}]}, {"ruleId": "scanner-35f457818ac4c107", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in website/pitch-deck-93c953ed-5f37-4167-9488-1e42336ecd56/deck-stage.js:814"}, "properties": {"repobilityId": "385fd2a7fe69de2d", "scanner": "scanner-primary", "fingerprint": "35f457818ac4c107", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "website/pitch-deck-93c953ed-5f37-4167-9488-1e42336ecd56/deck-stage.js"}, "region": {"startLine": 814}}}]}, {"ruleId": "scanner-ea0b049aaa1a3cf0", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in mcp-server/src/index.js:28"}, "properties": {"repobilityId": "782d4099d7224a68", "scanner": "scanner-primary", "fingerprint": "ea0b049aaa1a3cf0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "mcp-server/src/index.js"}, "region": {"startLine": 28}}}]}, {"ruleId": "scanner-c5ecb9d6237c5c82", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in server/scripts/boot-smoke-test.js:28"}, "properties": {"repobilityId": "acaf415f9605a8ee", "scanner": "scanner-primary", "fingerprint": "c5ecb9d6237c5c82", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/scripts/boot-smoke-test.js"}, "region": {"startLine": 28}}}]}, {"ruleId": "scanner-ea474e0debb28a99", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in server/src/lib/videoFrames.js:43"}, "properties": {"repobilityId": "6ddf8980f6670ec9", "scanner": "scanner-primary", "fingerprint": "ea474e0debb28a99", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/src/lib/videoFrames.js"}, "region": {"startLine": 43}}}]}, {"ruleId": "scanner-8be3bf78e0c5d83b", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/EventsMapView.js:232"}, "properties": {"repobilityId": "3370f7e918f290eb", "scanner": "scanner-primary", "fingerprint": "8be3bf78e0c5d83b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/EventsMapView.js"}, "region": {"startLine": 232}}}]}, {"ruleId": "scanner-f2a1c29afa3ccada", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/RoutePreviewMap.js:101"}, "properties": {"repobilityId": "4b54483ff32e97d5", "scanner": "scanner-primary", "fingerprint": "f2a1c29afa3ccada", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/RoutePreviewMap.js"}, "region": {"startLine": 101}}}]}, {"ruleId": "scanner-86fa1a89a982c3a5", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in e2e/runner.mjs:34"}, "properties": {"repobilityId": "6198b001ce35f9ab", "scanner": "scanner-primary", "fingerprint": "86fa1a89a982c3a5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "e2e/runner.mjs"}, "region": {"startLine": 34}}}]}, {"ruleId": "scanner-7efbda965f283c17", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "446dac30099e9685", "scanner": "scanner-primary", "fingerprint": "7efbda965f283c17", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/test.yml"}, "region": {"startLine": 103}}}]}, {"ruleId": "scanner-7efbda965f283c17", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "3c5f7937c5980794", "scanner": "scanner-primary", "fingerprint": "7efbda965f283c17", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/test.yml"}, "region": {"startLine": 121}}}]}, {"ruleId": "scanner-7efbda965f283c17", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "446dac30099e9685", "scanner": "scanner-primary", "fingerprint": "7efbda965f283c17", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/test.yml"}, "region": {"startLine": 189}}}]}, {"ruleId": "scanner-7efbda965f283c17", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "3c5f7937c5980794", "scanner": "scanner-primary", "fingerprint": "7efbda965f283c17", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/test.yml"}, "region": {"startLine": 197}}}]}, {"ruleId": "scanner-7efbda965f283c17", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "446dac30099e9685", "scanner": "scanner-primary", "fingerprint": "7efbda965f283c17", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/test.yml"}, "region": {"startLine": 254}}}]}, {"ruleId": "scanner-7efbda965f283c17", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "3c5f7937c5980794", "scanner": "scanner-primary", "fingerprint": "7efbda965f283c17", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/test.yml"}, "region": {"startLine": 262}}}]}, {"ruleId": "scanner-f097ad9f397c4308", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ce2a46c7e5710948", "scanner": "scanner-primary", "fingerprint": "f097ad9f397c4308", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/test-and-deploy.yml"}, "region": {"startLine": 154}}}]}, {"ruleId": "scanner-f097ad9f397c4308", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "47f6d4f95ba6fc8a", "scanner": "scanner-primary", "fingerprint": "f097ad9f397c4308", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/test-and-deploy.yml"}, "region": {"startLine": 187}}}]}, {"ruleId": "scanner-14cdfa58eeacdd43", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "e4586f2129dac56b", "scanner": "scanner-primary", "fingerprint": "14cdfa58eeacdd43", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/test-e2e.yml"}, "region": {"startLine": 77}}}]}, {"ruleId": "scanner-cbf6d6612dad0e13", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "1cd64d2fb8a9bff2", "scanner": "scanner-primary", "fingerprint": "cbf6d6612dad0e13", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/app-publish.yml"}, "region": {"startLine": 255}}}]}, {"ruleId": "scanner-de88a95070d2e205", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "0a8f131440ae0a3f", "scanner": "scanner-primary", "fingerprint": "de88a95070d2e205", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/app-publish.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6f922b4e772b367f", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "1e65decf3932c08f", "scanner": "scanner-primary", "fingerprint": "6f922b4e772b367f", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/mcp-publish.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-edfc7b203b3a48ec", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "cdcb599ba3c523e7", "scanner": "scanner-primary", "fingerprint": "edfc7b203b3a48ec", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/test-api.yml"}, "region": {"startLine": 48}}}]}, {"ruleId": "scanner-cb639d9a10a47b23", "level": "note", "message": {"text": "package.json defines install-time lifecycle scripts"}, "properties": {"repobilityId": "edeab51902066991", "scanner": "scanner-primary", "fingerprint": "cb639d9a10a47b23", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "npm", "install-scripts"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f73efb122ff50d29", "level": "note", "message": {"text": "Very large file: App.js (1018 lines)"}, "properties": {"repobilityId": "e4e93fc5e0f047a1", "scanner": "scanner-primary", "fingerprint": "f73efb122ff50d29", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-5e7aa63e42cf3063", "level": "note", "message": {"text": "Very large file: tests/planGenerator.test.js (1772 lines)"}, "properties": {"repobilityId": "1c4205231980200d", "scanner": "scanner-primary", "fingerprint": "5e7aa63e42cf3063", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-90e60f242030e89c", "level": "note", "message": {"text": "Very large file: website/pitch-deck-93c953ed-5f37-4167-9488-1e42336ecd56/deck-stage.js (1709 lines)"}, "properties": {"repobilityId": "e8631003eb9b0ba0", "scanner": "scanner-primary", "fingerprint": "90e60f242030e89c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-08cd884f18484116", "level": "note", "message": {"text": "Very large file: server/src/index.js (1066 lines)"}, "properties": {"repobilityId": "f7f4b5d2b07f0c16", "scanner": "scanner-primary", "fingerprint": "08cd884f18484116", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b7e19f73c11ee280", "level": "note", "message": {"text": "Very large file: server/src/routes/admin.js (5091 lines)"}, "properties": {"repobilityId": "dbe3c081ae03aaee", "scanner": "scanner-primary", "fingerprint": "b7e19f73c11ee280", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3fb33de3cd4eb3b7", "level": "note", "message": {"text": "Very large file: server/src/routes/ai.js (6757 lines)"}, "properties": {"repobilityId": "f063f63dfd62bb82", "scanner": "scanner-primary", "fingerprint": "3fb33de3cd4eb3b7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-43bb09a962625d80", "level": "note", "message": {"text": "Very large file: server/src/routes/findGoal.js (3018 lines)"}, "properties": {"repobilityId": "d0cd5d72e7a6f0fb", "scanner": "scanner-primary", "fingerprint": "43bb09a962625d80", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-7c1cb04b767f226a", "level": "note", "message": {"text": "Very large file: server/src/routes/checkins.js (1574 lines)"}, "properties": {"repobilityId": "454feb1a44ac2708", "scanner": "scanner-primary", "fingerprint": "7c1cb04b767f226a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d608e2ced5bb4914", "level": "note", "message": {"text": "Very large file: admin-dashboard/src/app/dashboard/users/[id]/page.tsx (1167 lines)"}, "properties": {"repobilityId": "b599a07758527be2", "scanner": "scanner-primary", "fingerprint": "d608e2ced5bb4914", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c663f89d20e5f4bf", "level": "note", "message": {"text": "Very large file: src/screens/PlanOverviewScreen.js (1855 lines)"}, "properties": {"repobilityId": "cc4267d601f3910d", "scanner": "scanner-primary", "fingerprint": "c663f89d20e5f4bf", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6bb9584d94225f26", "level": "note", "message": {"text": "Very large file: src/screens/PlanLoadingScreen.js (1159 lines)"}, "properties": {"repobilityId": "08ab5e0a64fe03e0", "scanner": "scanner-primary", "fingerprint": "6bb9584d94225f26", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-301f8cba580af4c8", "level": "note", "message": {"text": "Very large file: src/screens/HomeScreen.js (6159 lines)"}, "properties": {"repobilityId": "70c4fcfba505f2ae", "scanner": "scanner-primary", "fingerprint": "301f8cba580af4c8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-8f08a774ffaacf90", "level": "note", "message": {"text": "Very large file: src/screens/BeginnerProgramScreen.js (1151 lines)"}, "properties": {"repobilityId": "1ee0f9e23ad77115", "scanner": "scanner-primary", "fingerprint": "8f08a774ffaacf90", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-51a44a2ffda8acc3", "level": "note", "message": {"text": "Very large file: src/screens/FindAGoalResultsScreen.js (2740 lines)"}, "properties": {"repobilityId": "2bf7921d26ece48c", "scanner": "scanner-primary", "fingerprint": "51a44a2ffda8acc3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4ac50d4501946fa9", "level": "note", "message": {"text": "Very large file: src/screens/CheckInScreen.js (3026 lines)"}, "properties": {"repobilityId": "528405361ed7acb9", "scanner": "scanner-primary", "fingerprint": "4ac50d4501946fa9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-05446ebdb3396fce", "level": "note", "message": {"text": "Very large file: src/screens/CoachChatScreen.js (4265 lines)"}, "properties": {"repobilityId": "2d7d2f9205c70a91", "scanner": "scanner-primary", "fingerprint": "05446ebdb3396fce", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-834a72421b880c8b", "level": "note", "message": {"text": "Very large file: src/screens/WeekViewScreen.js (1798 lines)"}, "properties": {"repobilityId": "614dfb3a47aed010", "scanner": "scanner-primary", "fingerprint": "834a72421b880c8b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9d6e1a9eee895758", "level": "note", "message": {"text": "Very large file: src/screens/PlanPickerScreen.js (2380 lines)"}, "properties": {"repobilityId": "f2a79ee829b855f5", "scanner": "scanner-primary", "fingerprint": "9d6e1a9eee895758", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-599984e0a3dbca42", "level": "note", "message": {"text": "Very large file: src/screens/ActivityDetailScreen.js (5481 lines)"}, "properties": {"repobilityId": "357c191abb6c8756", "scanner": "scanner-primary", "fingerprint": "599984e0a3dbca42", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-7f29c857c27118bf", "level": "note", "message": {"text": "Very large file: src/screens/MyEventsScreen.js (2321 lines)"}, "properties": {"repobilityId": "f1e4196dad86c231", "scanner": "scanner-primary", "fingerprint": "7f29c857c27118bf", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-43f268c6869f5f4c", "level": "note", "message": {"text": "Very large file: src/screens/PlanConfigScreen.js (3137 lines)"}, "properties": {"repobilityId": "9f606bb1e09c9ee8", "scanner": "scanner-primary", "fingerprint": "43f268c6869f5f4c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-911b2a72404e7084", "level": "note", "message": {"text": "Very large file: src/components/BucketListItemSheet.js (1438 lines)"}, "properties": {"repobilityId": "02765b4841d81be4", "scanner": "scanner-primary", "fingerprint": "911b2a72404e7084", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f96c711ddc5c2bc1", "level": "note", "message": {"text": "Very large file: src/services/storageService.js (1781 lines)"}, "properties": {"repobilityId": "fbfb6eeaab0c34b1", "scanner": "scanner-primary", "fingerprint": "f96c711ddc5c2bc1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-294e513f2e1f70da", "level": "note", "message": {"text": "Very large file: src/services/llmPlanService.js (1382 lines)"}, "properties": {"repobilityId": "e5efb33a6ed8145c", "scanner": "scanner-primary", "fingerprint": "294e513f2e1f70da", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "c085b597da4d185f", "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": "267b5f213bbec081", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "ad1b8a9123ccc33f", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "5bbb5ba785528677", "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": "b4fa2a66a9eb8da7", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-8860542b5b71ae91", "level": "none", "message": {"text": "Commented-code block (6 lines) in App.js:39"}, "properties": {"repobilityId": "2962b94618593c77", "scanner": "scanner-primary", "fingerprint": "8860542b5b71ae91", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dd2ea731485b4133", "level": "none", "message": {"text": "Commented-code block (10 lines) in tests/planGenerator.test.js:1267"}, "properties": {"repobilityId": "7d5bc5587d39ca46", "scanner": "scanner-primary", "fingerprint": "dd2ea731485b4133", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1b9c9e47107e286f", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/mergeMarkers.test.js:23"}, "properties": {"repobilityId": "afcd11e55e643558", "scanner": "scanner-primary", "fingerprint": "1b9c9e47107e286f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-87fe3ec96e65a2dd", "level": "none", "message": {"text": "Commented-code block (7 lines) in tests/sessionReference.test.js:191"}, "properties": {"repobilityId": "0ac4524e6d0eadea", "scanner": "scanner-primary", "fingerprint": "87fe3ec96e65a2dd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-897e99e837d40d1d", "level": "note", "message": {"text": "Legacy-named symbol `etapa_v2` in tests/integration/checkin-and-coach-chat.test.js:23"}, "properties": {"repobilityId": "d9ac65f2933df18d", "scanner": "scanner-primary", "fingerprint": "897e99e837d40d1d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-69eadff8780db07e", "level": "note", "message": {"text": "Legacy-named symbol `etapa_v2` in tests/integration/bike-fit-flow.test.js:115"}, "properties": {"repobilityId": "af363213e0afbce1", "scanner": "scanner-primary", "fingerprint": "69eadff8780db07e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-17b3563efa3695d3", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/integration/bike-fit-flow.test.js:34"}, "properties": {"repobilityId": "a83170f9492ecccb", "scanner": "scanner-primary", "fingerprint": "17b3563efa3695d3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1a9b472d63ae7701", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/dashboard/src/app/page.js:486"}, "properties": {"repobilityId": "87f850a7f592588a", "scanner": "scanner-primary", "fingerprint": "1a9b472d63ae7701", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e9f9e16e01958019", "level": "none", "message": {"text": "Commented-code block (9 lines) in tests/dashboard/src/app/api/run-tests/route.js:15"}, "properties": {"repobilityId": "f009dca76343b533", "scanner": "scanner-primary", "fingerprint": "e9f9e16e01958019", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-08ab976a124a80b1", "level": "none", "message": {"text": "Commented-code block (9 lines) in tests/dashboard/src/lib/scenarios.js:117"}, "properties": {"repobilityId": "6f14606ddb037df0", "scanner": "scanner-primary", "fingerprint": "08ab976a124a80b1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b78dc2d058eac473", "level": "note", "message": {"text": "Legacy-named symbol `etapa_v2` in tests/harness/supabase.js:73"}, "properties": {"repobilityId": "3df0376dde55bb9d", "scanner": "scanner-primary", "fingerprint": "b78dc2d058eac473", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-eb5f6495f52bad15", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/harness/supabase.js:73"}, "properties": {"repobilityId": "25937c1627d49009", "scanner": "scanner-primary", "fingerprint": "eb5f6495f52bad15", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6ca12fe0a88da093", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/harness/setupFile.js:27"}, "properties": {"repobilityId": "9d93c829e2175a74", "scanner": "scanner-primary", "fingerprint": "6ca12fe0a88da093", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a68e8920424e1cdf", "level": "none", "message": {"text": "Commented-code block (8 lines) in tests/harness/mocks/anthropic.js:60"}, "properties": {"repobilityId": "609e149b9940a395", "scanner": "scanner-primary", "fingerprint": "a68e8920424e1cdf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-67b3bcfe334b64c3", "level": "note", "message": {"text": "Legacy-named symbol `etapa_v2` in scripts/migrate-all-riders-to-v2.js:3"}, "properties": {"repobilityId": "f98f745c636b9f2d", "scanner": "scanner-primary", "fingerprint": "67b3bcfe334b64c3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-86bf3d4c8a6e9ffc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/learning-images-snapshot.js:112"}, "properties": {"repobilityId": "64e9b2bff22eb85d", "scanner": "scanner-primary", "fingerprint": "86bf3d4c8a6e9ffc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-86bf91eeef095d60", "level": "none", "message": {"text": "Commented-code block (5 lines) in website/register-interest.js:39"}, "properties": {"repobilityId": "7cca76c4fdc7a59b", "scanner": "scanner-primary", "fingerprint": "86bf91eeef095d60", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6ebb19fa03eade40", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 website/register-interest.js:241"}, "properties": {"repobilityId": "59b0d131efd0fb9d", "scanner": "scanner-primary", "fingerprint": "6ebb19fa03eade40", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4bb27cbbe9242abd", "level": "none", "message": {"text": "Commented-code block (5 lines) in website/pitch-deck-93c953ed-5f37-4167-9488-1e42336ecd56/deck-stage.js:592"}, "properties": {"repobilityId": "0bb2a0381afa30d2", "scanner": "scanner-primary", "fingerprint": "4bb27cbbe9242abd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3d9a7b358e826b58", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/__tests__/plan-post-processors-flex-orchestrator.test.js:128"}, "properties": {"repobilityId": "23ed177bbe661491", "scanner": "scanner-primary", "fingerprint": "3d9a7b358e826b58", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-56ae968ff7e8f1bf", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/__tests__/plan-prompt-helpers.test.js:165"}, "properties": {"repobilityId": "943114181f56cd23", "scanner": "scanner-primary", "fingerprint": "56ae968ff7e8f1bf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e2752dedc833ba93", "level": "note", "message": {"text": "Legacy-named symbol `etapa_v2` in server/__tests__/snapshot-reason-enum.test.js:2"}, "properties": {"repobilityId": "742edf05d1debb4f", "scanner": "scanner-primary", "fingerprint": "e2752dedc833ba93", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ecf6657c05fcf5f6", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/__tests__/__smoke__/00-harness.test.js:32"}, "properties": {"repobilityId": "d190f67146bc446d", "scanner": "scanner-primary", "fingerprint": "ecf6657c05fcf5f6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0dec0b6d56908613", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/__tests__/lib/findGoalTripPrompt.test.js:58"}, "properties": {"repobilityId": "7ea6fe2282cf95dd", "scanner": "scanner-primary", "fingerprint": "0dec0b6d56908613", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-58861fb0a7477b03", "level": "note", "message": {"text": "Legacy-named symbol `etapa_v2` in server/__tests__/lib/coachContext.test.js:25"}, "properties": {"repobilityId": "e40811786c377660", "scanner": "scanner-primary", "fingerprint": "58861fb0a7477b03", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-f744b823880364b2", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/__tests__/lib/coachContext.test.js:14"}, "properties": {"repobilityId": "f2fe3f0c0134f5aa", "scanner": "scanner-primary", "fingerprint": "f744b823880364b2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-79e42c9319a3ae18", "level": "note", "message": {"text": "Legacy-named symbol `etapa_v2` in server/__tests__/routes/admin-jwt-auth.test.js:4"}, "properties": {"repobilityId": "3ca4e25a3568fe31", "scanner": "scanner-primary", "fingerprint": "79e42c9319a3ae18", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b26f8aad2da8fd9b", "level": "note", "message": {"text": "Legacy-named symbol `etapa_v2` in server/__tests__/routes/find-goal.test.js:380"}, "properties": {"repobilityId": "fee56e156f47d828", "scanner": "scanner-primary", "fingerprint": "b26f8aad2da8fd9b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-3d69e68295baa542", "level": "none", "message": {"text": "Commented-code block (12 lines) in server/__tests__/routes/find-goal.test.js:84"}, "properties": {"repobilityId": "7ca1dbccec625a22", "scanner": "scanner-primary", "fingerprint": "3d69e68295baa542", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5081537ceb7366be", "level": "note", "message": {"text": "Legacy-named symbol `etapa_v2` in server/__tests__/routes/chatSessions.test.js:61"}, "properties": {"repobilityId": "b1bcd78c8815789c", "scanner": "scanner-primary", "fingerprint": "5081537ceb7366be", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-eae4cb5cb43d4fbd", "level": "note", "message": {"text": "Legacy-named symbol `etapa_v2` in server/__tests__/routes/strava.test.js:86"}, "properties": {"repobilityId": "d41ab0a75ba583cf", "scanner": "scanner-primary", "fingerprint": "eae4cb5cb43d4fbd", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-f34c96ef704ed2fd", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/__tests__/routes/ai-coach-chat-enforcement.test.js:118"}, "properties": {"repobilityId": "dc76dc00b1182f3f", "scanner": "scanner-primary", "fingerprint": "f34c96ef704ed2fd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-61f387d1a445c64c", "level": "note", "message": {"text": "Legacy-named symbol `etapa_v2` in server/__tests__/routes/checkins.test.js:15"}, "properties": {"repobilityId": "6b5b914861a34aac", "scanner": "scanner-primary", "fingerprint": "61f387d1a445c64c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-46ab3f35a5d75b2f", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/__tests__/routes/checkins.test.js:80"}, "properties": {"repobilityId": "5ff943be5857a20c", "scanner": "scanner-primary", "fingerprint": "46ab3f35a5d75b2f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-302b301904f67bed", "level": "none", "message": {"text": "Commented-code block (7 lines) in server/__tests__/routes/events.test.js:208"}, "properties": {"repobilityId": "0906acca04ec728a", "scanner": "scanner-primary", "fingerprint": "302b301904f67bed", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-29829b5505f7b092", "level": "note", "message": {"text": "Legacy-named symbol `etapa_v2` in server/__tests__/routes/goals-and-plans.test.js:386"}, "properties": {"repobilityId": "77500d45b3c585f8", "scanner": "scanner-primary", "fingerprint": "29829b5505f7b092", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d30e22c186d971f3", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/__tests__/routes/goals-and-plans.test.js:60"}, "properties": {"repobilityId": "7d0bbce39e44f730", "scanner": "scanner-primary", "fingerprint": "d30e22c186d971f3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2d293090d3535626", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/__tests__/routes/subscription-and-webhooks.test.js:77"}, "properties": {"repobilityId": "fb4e5cad516c964e", "scanner": "scanner-primary", "fingerprint": "2d293090d3535626", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-935c01766e8858f1", "level": "note", "message": {"text": "Legacy-named symbol `etapa_v2` in server/__tests__/routes/bike-fit.test.js:182"}, "properties": {"repobilityId": "676323d1c41d6b64", "scanner": "scanner-primary", "fingerprint": "935c01766e8858f1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-2431b42744cf9b7c", "level": "note", "message": {"text": "Legacy-named symbol `etapa_v2` in server/__tests__/routes/ai-coach-chat.test.js:90"}, "properties": {"repobilityId": "98949f345c9fc0e7", "scanner": "scanner-primary", "fingerprint": "2431b42744cf9b7c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-51de3d27f637d2ca", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/__tests__/routes/ai-coach-chat.test.js:192"}, "properties": {"repobilityId": "f3720cf5445e952b", "scanner": "scanner-primary", "fingerprint": "51de3d27f637d2ca", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-af7b433b043d380c", "level": "note", "message": {"text": "Legacy-named symbol `etapa_v2` in server/__tests__/routes/coaching.test.js:56"}, "properties": {"repobilityId": "6185d2763cb08e42", "scanner": "scanner-primary", "fingerprint": "af7b433b043d380c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-8387e1989d7fa5d4", "level": "note", "message": {"text": "Legacy-named symbol `etapa_v2` in server/__tests__/routes/admin-find-goal-searches.test.js:22"}, "properties": {"repobilityId": "15cdc1a0a99059df", "scanner": "scanner-primary", "fingerprint": "8387e1989d7fa5d4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-3413a9eb7f0cf826", "level": "note", "message": {"text": "Legacy-named symbol `etapa_v2` in server/__tests__/routes/auth-and-users.test.js:94"}, "properties": {"repobilityId": "03e1ab9805d825bb", "scanner": "scanner-primary", "fingerprint": "3413a9eb7f0cf826", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-313e933a0cc09586", "level": "note", "message": {"text": "Legacy-named symbol `etapa_v2` in server/__tests__/routes/eventsCron.test.js:20"}, "properties": {"repobilityId": "69a5e43bf066fb4a", "scanner": "scanner-primary", "fingerprint": "313e933a0cc09586", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d59fd809a7ec371d", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/__tests__/routes/ai-plan-generation.test.js:139"}, "properties": {"repobilityId": "c222459adda884ad", "scanner": "scanner-primary", "fingerprint": "d59fd809a7ec371d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a79ffcee76fbd37d", "level": "note", "message": {"text": "Legacy-named symbol `etapa_v2` in server/scripts/event-search-scenarios.js:8"}, "properties": {"repobilityId": "49ffac92852b3294", "scanner": "scanner-primary", "fingerprint": "a79ffcee76fbd37d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-4874ee9b25440540", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/scripts/event-search-scenarios.js:550"}, "properties": {"repobilityId": "c8f6093fe9b68dad", "scanner": "scanner-primary", "fingerprint": "4874ee9b25440540", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f217841c234b44c8", "level": "note", "message": {"text": "Legacy-named symbol `etapa_v2` in server/scripts/run-event-search-scenarios.js:13"}, "properties": {"repobilityId": "7a4ff987fe96b785", "scanner": "scanner-primary", "fingerprint": "f217841c234b44c8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-6f161a14cf277f29", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/scripts/run-event-search-scenarios.js:142"}, "properties": {"repobilityId": "6cc5a8ed4dac4682", "scanner": "scanner-primary", "fingerprint": "6f161a14cf277f29", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a28f036a9ec03ba6", "level": "note", "message": {"text": "Legacy-named symbol `etapa_v2` in server/src/index.js:388"}, "properties": {"repobilityId": "59ac59c17d9fb650", "scanner": "scanner-primary", "fingerprint": "a28f036a9ec03ba6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-8afef6536c6649ab", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/src/index.js:3"}, "properties": {"repobilityId": "c52aecdf62eeea14", "scanner": "scanner-primary", "fingerprint": "8afef6536c6649ab", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c23c761166f194c0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/src/index.js:203"}, "properties": {"repobilityId": "eef116dd92fa23ce", "scanner": "scanner-primary", "fingerprint": "c23c761166f194c0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bb797a1877e46f7a", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/src/middleware/auth.js:3"}, "properties": {"repobilityId": "dc4aca425b8371ed", "scanner": "scanner-primary", "fingerprint": "bb797a1877e46f7a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6d184d8b5ee81026", "level": "none", "message": {"text": "Commented-code block (7 lines) in server/src/lib/findGoalClarifier.js:32"}, "properties": {"repobilityId": "b5b2ef077f1bfdbb", "scanner": "scanner-primary", "fingerprint": "6d184d8b5ee81026", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-95e79dd4b2fc3f78", "level": "note", "message": {"text": "Legacy-named symbol `etapa_v2` in server/src/lib/stravaCache.js:2"}, "properties": {"repobilityId": "19eebb73911b4a76", "scanner": "scanner-primary", "fingerprint": "95e79dd4b2fc3f78", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-0d3d294530498f92", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/src/lib/pushService.js:18"}, "properties": {"repobilityId": "725cc19badea7a72", "scanner": "scanner-primary", "fingerprint": "0d3d294530498f92", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e7e4f656696ab377", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/src/lib/userLifecycle.js:77"}, "properties": {"repobilityId": "d24d626f2470817d", "scanner": "scanner-primary", "fingerprint": "e7e4f656696ab377", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e5da69ab3d6ea66e", "level": "none", "message": {"text": "Commented-code block (8 lines) in server/src/lib/log.js:73"}, "properties": {"repobilityId": "4b456ffab2b0af88", "scanner": "scanner-primary", "fingerprint": "e5da69ab3d6ea66e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-23ac43a9b7338033", "level": "none", "message": {"text": "Commented-code block (8 lines) in server/src/lib/strengthPicker.js:29"}, "properties": {"repobilityId": "cfe504ce1fbfb72c", "scanner": "scanner-primary", "fingerprint": "23ac43a9b7338033", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cd194801ecd5a6d5", "level": "none", "message": {"text": "Commented-code block (7 lines) in server/src/lib/lifetimeGrant.js:251"}, "properties": {"repobilityId": "352f0fa3cf995d9f", "scanner": "scanner-primary", "fingerprint": "cd194801ecd5a6d5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8c71b4fd6fa9549d", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/src/lib/workoutExport.js:52"}, "properties": {"repobilityId": "c6e6d8e931bc5ee9", "scanner": "scanner-primary", "fingerprint": "8c71b4fd6fa9549d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f17a58e98fb720a8", "level": "note", "message": {"text": "Legacy-named symbol `etapa_v2` in server/src/lib/supabase.js:19"}, "properties": {"repobilityId": "c9c83225ec3aeb85", "scanner": "scanner-primary", "fingerprint": "f17a58e98fb720a8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-3d8df44ebe51fb69", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/src/lib/supabase.js:19"}, "properties": {"repobilityId": "26a5f50cc2e41461", "scanner": "scanner-primary", "fingerprint": "3d8df44ebe51fb69", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5fa94769b64df735", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/src/lib/perplexity.js:21"}, "properties": {"repobilityId": "1351e452e99632b6", "scanner": "scanner-primary", "fingerprint": "5fa94769b64df735", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-28e2493f0a6d3a9f", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/src/lib/rideTips.js:39"}, "properties": {"repobilityId": "94b1476dce6a688f", "scanner": "scanner-primary", "fingerprint": "28e2493f0a6d3a9f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c193c29a9644d449", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/src/lib/planGenLogger.js:15"}, "properties": {"repobilityId": "d73e1b8e862dd500", "scanner": "scanner-primary", "fingerprint": "c193c29a9644d449", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ba0639692fc386ad", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/src/lib/slack.js:41"}, "properties": {"repobilityId": "15135c9992c2f663", "scanner": "scanner-primary", "fingerprint": "ba0639692fc386ad", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2576dfb91b9deaf6", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/src/lib/checkinSafety.js:22"}, "properties": {"repobilityId": "e82f6ea76273004e", "scanner": "scanner-primary", "fingerprint": "2576dfb91b9deaf6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-da0699de8a60fb98", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/src/lib/piiRedaction.js:40"}, "properties": {"repobilityId": "d4b8cdad55636aa8", "scanner": "scanner-primary", "fingerprint": "da0699de8a60fb98", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-27cd54a6517db2b2", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/src/lib/findGoalSearchPlan.js:36"}, "properties": {"repobilityId": "f9b01a8f24cdea2b", "scanner": "scanner-primary", "fingerprint": "27cd54a6517db2b2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0abf810d498030f6", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/src/lib/planPostProcessors.js:150"}, "properties": {"repobilityId": "e6876cc4f8a47437", "scanner": "scanner-primary", "fingerprint": "0abf810d498030f6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0aa1abfc97e50fa2", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/src/lib/eventNormaliser.js:42"}, "properties": {"repobilityId": "6616ec1710b8e163", "scanner": "scanner-primary", "fingerprint": "0aa1abfc97e50fa2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-da525123b11d0520", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/src/lib/findGoalDirectives.js:29"}, "properties": {"repobilityId": "35968db776aff77e", "scanner": "scanner-primary", "fingerprint": "da525123b11d0520", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6355cdc29c4868f3", "level": "note", "message": {"text": "Legacy-named symbol `etapa_v2` in server/src/lib/coachContext.js:294"}, "properties": {"repobilityId": "c7805c1d685b2760", "scanner": "scanner-primary", "fingerprint": "6355cdc29c4868f3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d7e766d943ab8a7f", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/src/lib/coachContext.js:33"}, "properties": {"repobilityId": "3f89f9875a0ef6ac", "scanner": "scanner-primary", "fingerprint": "d7e766d943ab8a7f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cf9394385e5be4ef", "level": "none", "message": {"text": "Commented-code block (8 lines) in server/src/lib/rateLimits.js:28"}, "properties": {"repobilityId": "33080f9f55cccef6", "scanner": "scanner-primary", "fingerprint": "cf9394385e5be4ef", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fd7f7b175a1bf8e2", "level": "none", "message": {"text": "Commented-code block (8 lines) in server/src/lib/coachTipsSelector.js:51"}, "properties": {"repobilityId": "02dcb70f512b7b80", "scanner": "scanner-primary", "fingerprint": "fd7f7b175a1bf8e2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-27ef48e8b3e41faa", "level": "note", "message": {"text": "Legacy-named symbol `etapa_v2` in server/src/lib/claudeLogger.js:200"}, "properties": {"repobilityId": "9b64cac3d0d1a24f", "scanner": "scanner-primary", "fingerprint": "27ef48e8b3e41faa", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-813ea4792aa85b82", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/src/lib/claudeLogger.js:199"}, "properties": {"repobilityId": "b405aba3f8b9e9f7", "scanner": "scanner-primary", "fingerprint": "813ea4792aa85b82", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3a8414ec27872a7b", "level": "none", "message": {"text": "Commented-code block (8 lines) in server/src/lib/sessionStructure.js:95"}, "properties": {"repobilityId": "a854cb420db54cba", "scanner": "scanner-primary", "fingerprint": "3a8414ec27872a7b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-123e7e3bb5c21f5c", "level": "none", "message": {"text": "Commented-code block (7 lines) in server/src/lib/videoFrames.js:142"}, "properties": {"repobilityId": "0641a1b403c1a712", "scanner": "scanner-primary", "fingerprint": "123e7e3bb5c21f5c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-77d4e56db23648b9", "level": "none", "message": {"text": "Commented-code block (8 lines) in server/src/lib/postureVision.js:30"}, "properties": {"repobilityId": "dab0bf73424b0d3a", "scanner": "scanner-primary", "fingerprint": "77d4e56db23648b9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b3c77822fb65710b", "level": "note", "message": {"text": "Legacy-named symbol `etapa_v2` in server/src/lib/bikeFitVision.js:411"}, "properties": {"repobilityId": "cb9570b0f106cbd3", "scanner": "scanner-primary", "fingerprint": "b3c77822fb65710b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-983471c98b19b907", "level": "none", "message": {"text": "Commented-code block (11 lines) in server/src/lib/bikeFitVision.js:39"}, "properties": {"repobilityId": "44e8b7f60edc4de2", "scanner": "scanner-primary", "fingerprint": "983471c98b19b907", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2240486c621757b7", "level": "none", "message": {"text": "Commented-code block (8 lines) in server/src/lib/planGenReaper.js:27"}, "properties": {"repobilityId": "526e2422d3d5d404", "scanner": "scanner-primary", "fingerprint": "2240486c621757b7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d082e5742a42a345", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/src/lib/coachPersonas.js:85"}, "properties": {"repobilityId": "9476b6b632b87594", "scanner": "scanner-primary", "fingerprint": "d082e5742a42a345", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c2ff71c422378fcb", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/src/routes/roadside.js:33"}, "properties": {"repobilityId": "3d5d08510e87c51d", "scanner": "scanner-primary", "fingerprint": "c2ff71c422378fcb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-080f2b3aa2b7917c", "level": "note", "message": {"text": "Legacy-named symbol `etapa_v2` in server/src/routes/plans.js:305"}, "properties": {"repobilityId": "b05fc0b85f6b6630", "scanner": "scanner-primary", "fingerprint": "080f2b3aa2b7917c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-977eb73a4b81706e", "level": "none", "message": {"text": "Commented-code block (8 lines) in server/src/routes/plans.js:10"}, "properties": {"repobilityId": "780f7414bd530f34", "scanner": "scanner-primary", "fingerprint": "977eb73a4b81706e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-505af7ce45009c5d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/src/routes/learningImages.js:165"}, "properties": {"repobilityId": "5802c1e21f23f3bf", "scanner": "scanner-primary", "fingerprint": "505af7ce45009c5d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3b60f82289c0ea6e", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/src/routes/appConfig.js:127"}, "properties": {"repobilityId": "c35906d783e7a016", "scanner": "scanner-primary", "fingerprint": "3b60f82289c0ea6e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-478dcdbe8d1d3ce1", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/src/routes/publicEvents.js:282"}, "properties": {"repobilityId": "32686f7ce5916216", "scanner": "scanner-primary", "fingerprint": "478dcdbe8d1d3ce1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c20ffe098a4ace93", "level": "note", "message": {"text": "Legacy-named symbol `etapa_v2` in server/src/routes/retentionCron.js:12"}, "properties": {"repobilityId": "944d92a8d830ad4e", "scanner": "scanner-primary", "fingerprint": "c20ffe098a4ace93", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-471a301819860be0", "level": "none", "message": {"text": "Commented-code block (7 lines) in server/src/routes/retentionCron.js:79"}, "properties": {"repobilityId": "ecf0ecc2179129cb", "scanner": "scanner-primary", "fingerprint": "471a301819860be0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-678f82fd64cbc959", "level": "note", "message": {"text": "Legacy-named symbol `etapa_v2` in server/src/routes/admin.js:24"}, "properties": {"repobilityId": "a0d5c8b3395d996d", "scanner": "scanner-primary", "fingerprint": "678f82fd64cbc959", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-87f8bc32f78b2ac2", "level": "none", "message": {"text": "Commented-code block (8 lines) in server/src/routes/admin.js:64"}, "properties": {"repobilityId": "d50c70b64f58e4b9", "scanner": "scanner-primary", "fingerprint": "87f8bc32f78b2ac2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-31aa41380441d67e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/src/routes/admin.js:1159"}, "properties": {"repobilityId": "493455eac3fc370e", "scanner": "scanner-primary", "fingerprint": "31aa41380441d67e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7e121105a736a2bc", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/src/routes/eventsCacheCron.js:57"}, "properties": {"repobilityId": "2acc4c23e4d26ae0", "scanner": "scanner-primary", "fingerprint": "7e121105a736a2bc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5e5f8cb7e317e916", "level": "none", "message": {"text": "Commented-code block (8 lines) in server/src/routes/feedback.js:519"}, "properties": {"repobilityId": "ec97fc2be7728f65", "scanner": "scanner-primary", "fingerprint": "5e5f8cb7e317e916", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-72435d1b942acbaa", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/src/routes/feedback.js:143"}, "properties": {"repobilityId": "bbf060af93a37f8d", "scanner": "scanner-primary", "fingerprint": "72435d1b942acbaa", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c610dcdf52f93a61", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/src/routes/ai.js:33"}, "properties": {"repobilityId": "e0349b27b4b2df21", "scanner": "scanner-primary", "fingerprint": "c610dcdf52f93a61", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-18c03021606c841d", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/src/routes/events.js:141"}, "properties": {"repobilityId": "c991174e717d9ebf", "scanner": "scanner-primary", "fingerprint": "18c03021606c841d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c8744708625736eb", "level": "note", "message": {"text": "Legacy-named symbol `etapa_v2` in server/src/routes/testReset.js:37"}, "properties": {"repobilityId": "309d893594657bed", "scanner": "scanner-primary", "fingerprint": "c8744708625736eb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-695b35149265a159", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/src/routes/testReset.js:31"}, "properties": {"repobilityId": "dcdea8cb6070f7e1", "scanner": "scanner-primary", "fingerprint": "695b35149265a159", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f93ea0eacd65ac10", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/src/routes/localShops.js:71"}, "properties": {"repobilityId": "2acd87121108c133", "scanner": "scanner-primary", "fingerprint": "f93ea0eacd65ac10", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a3483795e1b59087", "level": "none", "message": {"text": "Commented-code block (7 lines) in server/src/routes/eventsCron.js:62"}, "properties": {"repobilityId": "116df2a214dc08ef", "scanner": "scanner-primary", "fingerprint": "a3483795e1b59087", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-df447b422d41d4e3", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/src/routes/notifications.js:87"}, "properties": {"repobilityId": "87b7c2dad281c9e9", "scanner": "scanner-primary", "fingerprint": "df447b422d41d4e3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fffcaeaf167a8333", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/src/routes/revenueCatWebhook.js:76"}, "properties": {"repobilityId": "592d4ea3981f2823", "scanner": "scanner-primary", "fingerprint": "fffcaeaf167a8333", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-28c8acc32e6e5958", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/src/routes/careNudgesCron.js:51"}, "properties": {"repobilityId": "db02e8f2db70cece", "scanner": "scanner-primary", "fingerprint": "28c8acc32e6e5958", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d09a3d334b91cfb2", "level": "none", "message": {"text": "Commented-code block (8 lines) in server/src/routes/subscription.js:61"}, "properties": {"repobilityId": "b67ef694efdb1257", "scanner": "scanner-primary", "fingerprint": "d09a3d334b91cfb2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4884631cb97195e4", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/src/routes/planConfigs.js:68"}, "properties": {"repobilityId": "b2d54cf3a74accea", "scanner": "scanner-primary", "fingerprint": "4884631cb97195e4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-737d94d92a6f52b8", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/src/routes/postureCheck.js:81"}, "properties": {"repobilityId": "f8e7ab02567427a1", "scanner": "scanner-primary", "fingerprint": "737d94d92a6f52b8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a06b5b55290f7034", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/src/routes/support.js:35"}, "properties": {"repobilityId": "baf802317344aa85", "scanner": "scanner-primary", "fingerprint": "a06b5b55290f7034", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-50465b9ffeb0cff7", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/src/routes/findGoal.js:78"}, "properties": {"repobilityId": "bbb7e1f9ea8b1506", "scanner": "scanner-primary", "fingerprint": "50465b9ffeb0cff7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-41dab4e2ea5f3304", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/src/routes/unsubscribe.js:70"}, "properties": {"repobilityId": "466091c6e04494e2", "scanner": "scanner-primary", "fingerprint": "41dab4e2ea5f3304", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-327d39dc19a3f43e", "level": "none", "message": {"text": "Commented-code block (9 lines) in server/src/routes/bikeMaintenance.js:24"}, "properties": {"repobilityId": "89c9aa2d1fa6971d", "scanner": "scanner-primary", "fingerprint": "327d39dc19a3f43e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-43971c57a33431e1", "level": "none", "message": {"text": "Commented-code block (10 lines) in server/src/routes/chatSessions.js:132"}, "properties": {"repobilityId": "e8031a89d880383c", "scanner": "scanner-primary", "fingerprint": "43971c57a33431e1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-96b80d9ea54fa724", "level": "note", "message": {"text": "Legacy-named symbol `etapa_v2` in server/src/routes/checkins.js:663"}, "properties": {"repobilityId": "371df247965378c8", "scanner": "scanner-primary", "fingerprint": "96b80d9ea54fa724", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-3113277285f095f1", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/src/routes/checkins.js:178"}, "properties": {"repobilityId": "2b0541d5fbf231c0", "scanner": "scanner-primary", "fingerprint": "3113277285f095f1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ce0fc037b067c0ba", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/src/routes/users.js:132"}, "properties": {"repobilityId": "02a44d2c40e5fe2e", "scanner": "scanner-primary", "fingerprint": "ce0fc037b067c0ba", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b2bec925ccfd4d54", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/src/routes/exerciseWeights.js:132"}, "properties": {"repobilityId": "80c862b125363c65", "scanner": "scanner-primary", "fingerprint": "b2bec925ccfd4d54", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ae4197b0b352c7cd", "level": "note", "message": {"text": "Legacy-named symbol `etapa_v2` in server/src/routes/goals.js:4"}, "properties": {"repobilityId": "8aad94432b1af64a", "scanner": "scanner-primary", "fingerprint": "ae4197b0b352c7cd", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-5b95f3aa1bd151e3", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/src/routes/bikeFit.js:158"}, "properties": {"repobilityId": "ef3ca26d1a487f25", "scanner": "scanner-primary", "fingerprint": "5b95f3aa1bd151e3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2c4738bb65f77b5d", "level": "note", "message": {"text": "Legacy-named symbol `etapa_v2` in server/src/routes/bucketList.js:4"}, "properties": {"repobilityId": "60b3109e3de51b98", "scanner": "scanner-primary", "fingerprint": "2c4738bb65f77b5d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-7b24d2a2733f156b", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/src/routes/strava.js:27"}, "properties": {"repobilityId": "3c7240ed45f58d83", "scanner": "scanner-primary", "fingerprint": "7b24d2a2733f156b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2ae05d9317621ac1", "level": "none", "message": {"text": "Commented-code block (8 lines) in server/src/routes/checkinsCron.js:189"}, "properties": {"repobilityId": "88fbadca1692562f", "scanner": "scanner-primary", "fingerprint": "2ae05d9317621ac1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-eea63b49ab984031", "level": "note", "message": {"text": "Legacy-named symbol `etapa_v2` in admin-dashboard/src/app/api/users/[id]/schema-status/route.ts:7"}, "properties": {"repobilityId": "2b50ea10b722b5bf", "scanner": "scanner-primary", "fingerprint": "eea63b49ab984031", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-399627c4b8c09db6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 admin-dashboard/src/app/api/admins/route.ts:52"}, "properties": {"repobilityId": "82d751fb5e88f651", "scanner": "scanner-primary", "fingerprint": "399627c4b8c09db6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-65aa5024f9bb7487", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 admin-dashboard/src/app/api/coaches/route.ts:56"}, "properties": {"repobilityId": "a911c41e4106197d", "scanner": "scanner-primary", "fingerprint": "65aa5024f9bb7487", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-02e301c17139dd0c", "level": "none", "message": {"text": "Commented-code block (6 lines) in admin-dashboard/src/app/api/coaching/users/[userId]/route.ts:5"}, "properties": {"repobilityId": "d8b863bac647f6e9", "scanner": "scanner-primary", "fingerprint": "02e301c17139dd0c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f9b374f30d61aa96", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 admin-dashboard/src/app/api/coaching/notes/route.ts:18"}, "properties": {"repobilityId": "6c11638621757994", "scanner": "scanner-primary", "fingerprint": "f9b374f30d61aa96", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cb40549e3f1546cc", "level": "none", "message": {"text": "Commented-code block (6 lines) in admin-dashboard/src/app/dashboard/layout.tsx:9"}, "properties": {"repobilityId": "b316f7ee032aa3ed", "scanner": "scanner-primary", "fingerprint": "cb40549e3f1546cc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-919e3fb54f4a7689", "level": "none", "message": {"text": "Commented-code block (6 lines) in admin-dashboard/src/app/dashboard/users/page.tsx:59"}, "properties": {"repobilityId": "ed93ad6632a1bfce", "scanner": "scanner-primary", "fingerprint": "919e3fb54f4a7689", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8e6417a4ad4eb047", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 admin-dashboard/src/app/dashboard/users/page.tsx:126"}, "properties": {"repobilityId": "0ee33e289fbd729b", "scanner": "scanner-primary", "fingerprint": "8e6417a4ad4eb047", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-df074f34daaf87bd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 admin-dashboard/src/app/dashboard/users/[id]/page.tsx:254"}, "properties": {"repobilityId": "3980da1c640d3951", "scanner": "scanner-primary", "fingerprint": "df074f34daaf87bd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ef3e677cb8ff1ac6", "level": "none", "message": {"text": "Commented-code block (5 lines) in admin-dashboard/src/app/dashboard/config/page.tsx:55"}, "properties": {"repobilityId": "371267e27e0d8fb9", "scanner": "scanner-primary", "fingerprint": "ef3e677cb8ff1ac6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e43a74ad2c04b686", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 admin-dashboard/src/app/dashboard/config/page.tsx:213"}, "properties": {"repobilityId": "224a39510da4b198", "scanner": "scanner-primary", "fingerprint": "e43a74ad2c04b686", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f1abea38117f8944", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 admin-dashboard/src/app/dashboard/events/page.tsx:59"}, "properties": {"repobilityId": "ecd30b7547e69c43", "scanner": "scanner-primary", "fingerprint": "f1abea38117f8944", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-74763a3bd9da3151", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 admin-dashboard/src/app/dashboard/activity/page.tsx:147"}, "properties": {"repobilityId": "2b7c19ce06cf14fc", "scanner": "scanner-primary", "fingerprint": "74763a3bd9da3151", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d607b807403d4d14", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 admin-dashboard/src/app/dashboard/admins/page.tsx:20"}, "properties": {"repobilityId": "380d27d7bf130c36", "scanner": "scanner-primary", "fingerprint": "d607b807403d4d14", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f5881ba272cf0541", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 admin-dashboard/src/app/dashboard/payments/page.tsx:121"}, "properties": {"repobilityId": "266e9f2f47ad742e", "scanner": "scanner-primary", "fingerprint": "f5881ba272cf0541", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-af8ce991e745882b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 admin-dashboard/src/app/dashboard/inspiration-picks/page.tsx:104"}, "properties": {"repobilityId": "b2dbafd1cef5979f", "scanner": "scanner-primary", "fingerprint": "af8ce991e745882b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-521c401d08eda885", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 admin-dashboard/src/app/dashboard/feedback/page.tsx:111"}, "properties": {"repobilityId": "2a3447fc7f40846c", "scanner": "scanner-primary", "fingerprint": "521c401d08eda885", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-38903bd21956d3e8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 admin-dashboard/src/lib/etapa-api.ts:13"}, "properties": {"repobilityId": "0baa10c9536166cb", "scanner": "scanner-primary", "fingerprint": "38903bd21956d3e8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-96a2136d2e669325", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/__tests__/mocks/audio-asset.js:3"}, "properties": {"repobilityId": "1d03f449d7cc920a", "scanner": "scanner-primary", "fingerprint": "96a2136d2e669325", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0edf57cd0bff3933", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/__tests__/screens/MyEventsScreen.test.js:43"}, "properties": {"repobilityId": "6b9d22f3d092707d", "scanner": "scanner-primary", "fingerprint": "0edf57cd0bff3933", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d50e9641dab6a165", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/__tests__/screens/FindAGoalResultsScreen.test.js:121"}, "properties": {"repobilityId": "2682c90411d0e6ef", "scanner": "scanner-primary", "fingerprint": "d50e9641dab6a165", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-29ba5cb32bf47c55", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/__tests__/screens/CheckInScreen.test.js:85"}, "properties": {"repobilityId": "4ed91c6c7f39e795", "scanner": "scanner-primary", "fingerprint": "29ba5cb32bf47c55", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-981bb0b0d7533dd2", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/__tests__/screens/EventDetailScreen.test.js:139"}, "properties": {"repobilityId": "d99626a43f582f2b", "scanner": "scanner-primary", "fingerprint": "981bb0b0d7533dd2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-72f830e48c535c85", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/__tests__/screens/PlanConfigScreen.test.js:128"}, "properties": {"repobilityId": "d55f42fb79015204", "scanner": "scanner-primary", "fingerprint": "72f830e48c535c85", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0f96bc75b2462d07", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/__tests__/screens/OnboardingAthleteContextScreen.test.js:16"}, "properties": {"repobilityId": "794813dfd9d95cb2", "scanner": "scanner-primary", "fingerprint": "0f96bc75b2462d07", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d8fc0e7e52a1db5d", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/__tests__/screens/PaywallScreen.test.js:49"}, "properties": {"repobilityId": "e2d0a35750cdc01e", "scanner": "scanner-primary", "fingerprint": "d8fc0e7e52a1db5d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bc8f7f541903c7e3", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/__tests__/screens/SignInScreen.test.js:69"}, "properties": {"repobilityId": "e39fedc8231e638d", "scanner": "scanner-primary", "fingerprint": "bc8f7f541903c7e3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0001a84c7cc630ab", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/__tests__/screens/SettingsNestedScreens.test.js:56"}, "properties": {"repobilityId": "02e97cf854ceafab", "scanner": "scanner-primary", "fingerprint": "0001a84c7cc630ab", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5cccc2727971b364", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/__tests__/screens/HomeScreen.test.js:73"}, "properties": {"repobilityId": "fc70e42d1e3dbff5", "scanner": "scanner-primary", "fingerprint": "5cccc2727971b364", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7ae6d548715b1364", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/__tests__/components/BucketListCard.test.js:139"}, "properties": {"repobilityId": "61deb095bb0b2006", "scanner": "scanner-primary", "fingerprint": "7ae6d548715b1364", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d27b61f4a2ad0b95", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/__tests__/components/SetupTrainingCard.test.js:204"}, "properties": {"repobilityId": "f95cdf9bde264942", "scanner": "scanner-primary", "fingerprint": "d27b61f4a2ad0b95", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-045a5d3f73ab06fa", "level": "note", "message": {"text": "Legacy-named symbol `etapa_pending_activity_syncs_v1` in src/__tests__/services/storageService.activitySync.test.js:38"}, "properties": {"repobilityId": "da45b527ec1a1e42", "scanner": "scanner-primary", "fingerprint": "045a5d3f73ab06fa", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-e35e9764acabff19", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/__tests__/services/apiRetry.test.js:121"}, "properties": {"repobilityId": "5188a5b41f409212", "scanner": "scanner-primary", "fingerprint": "e35e9764acabff19", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3843db0c701346fb", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/__tests__/services/storageService.weekContextHistory.test.js:16"}, "properties": {"repobilityId": "ee6a9ea7fb1ce604", "scanner": "scanner-primary", "fingerprint": "3843db0c701346fb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fbd684d4680be051", "level": "note", "message": {"text": "Legacy-named symbol `etapa_bucket_list_v1` in src/__tests__/services/storageService.signOutWipe.test.js:45"}, "properties": {"repobilityId": "bb363dbdf42a1b90", "scanner": "scanner-primary", "fingerprint": "fbd684d4680be051", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-2096d011cd3859d1", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/screens/PlanOverviewScreen.js:67"}, "properties": {"repobilityId": "48aaf531ede58613", "scanner": "scanner-primary", "fingerprint": "2096d011cd3859d1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9ea975abcd0466ab", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/screens/ChangeCoachScreen.js:80"}, "properties": {"repobilityId": "29c1403052b9495d", "scanner": "scanner-primary", "fingerprint": "9ea975abcd0466ab", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-867ae0d9eb63a349", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/screens/PlanLoadingScreen.js:95"}, "properties": {"repobilityId": "70cb942e3b55868a", "scanner": "scanner-primary", "fingerprint": "867ae0d9eb63a349", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9a7aebd41638e505", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/screens/BikeFitLoadingScreen.js:41"}, "properties": {"repobilityId": "abe9abba2a20ab50", "scanner": "scanner-primary", "fingerprint": "9a7aebd41638e505", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-02d8fdb57cb76516", "level": "note", "message": {"text": "Legacy-named symbol `etapa_v2` in src/screens/PlanVersionHistoryScreen.js:46"}, "properties": {"repobilityId": "0b08d7ad30addc34", "scanner": "scanner-primary", "fingerprint": "02d8fdb57cb76516", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ab1419f39a0476ae", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/screens/EventDetailScreen.js:69"}, "properties": {"repobilityId": "4599778bd64fd504", "scanner": "scanner-primary", "fingerprint": "ab1419f39a0476ae", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6fdbf84d702e9b2f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/screens/TripsIntroScreen.js:51"}, "properties": {"repobilityId": "e728bf937dd799ba", "scanner": "scanner-primary", "fingerprint": "6fdbf84d702e9b2f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6d0a9bd2da509419", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/screens/PlanReadyScreen.js:115"}, "properties": {"repobilityId": "efd7ee567f2dda21", "scanner": "scanner-primary", "fingerprint": "6d0a9bd2da509419", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1252208bedb61e0b", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/screens/HomeScreen.js:95"}, "properties": {"repobilityId": "0d949232c57c4fe9", "scanner": "scanner-primary", "fingerprint": "1252208bedb61e0b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-01019e09b82f8c47", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/screens/BeginnerProgramScreen.js:50"}, "properties": {"repobilityId": "4f8e970235f64825", "scanner": "scanner-primary", "fingerprint": "01019e09b82f8c47", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ece7a26a223df840", "level": "none", "message": {"text": "Commented-code block (12 lines) in src/screens/FindAGoalResultsScreen.js:39"}, "properties": {"repobilityId": "ea500a22b6d347e6", "scanner": "scanner-primary", "fingerprint": "ece7a26a223df840", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c7fa0832133fb124", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/screens/OnboardingNameScreen.js:111"}, "properties": {"repobilityId": "97fd7cf15d33a072", "scanner": "scanner-primary", "fingerprint": "c7fa0832133fb124", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-871b846cfd131e66", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/screens/CheckInScreen.js:72"}, "properties": {"repobilityId": "db6c5cdc7ce7a134", "scanner": "scanner-primary", "fingerprint": "871b846cfd131e66", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9444e18ecb55fcf0", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/screens/WashRoutineScreen.js:41"}, "properties": {"repobilityId": "8d0b8f9bb18e4eba", "scanner": "scanner-primary", "fingerprint": "9444e18ecb55fcf0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-773d685d6cecce55", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/screens/AddGoalSimpleScreen.js:120"}, "properties": {"repobilityId": "3c171bf43456b7d4", "scanner": "scanner-primary", "fingerprint": "773d685d6cecce55", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c87893eb6ac75eac", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/screens/RiderProfileScreen.js:19"}, "properties": {"repobilityId": "6551465a8f9ccb8c", "scanner": "scanner-primary", "fingerprint": "c87893eb6ac75eac", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-20b3b048858b67c3", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/screens/PaywallScreen.js:17"}, "properties": {"repobilityId": "9b5aeb4de21b14bb", "scanner": "scanner-primary", "fingerprint": "20b3b048858b67c3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f4fc350ed33f2408", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/screens/AddEventScreen.js:123"}, "properties": {"repobilityId": "0ea909bba55b6c77", "scanner": "scanner-primary", "fingerprint": "f4fc350ed33f2408", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c674b570b8a1436c", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/screens/GoalSetupScreen.js:44"}, "properties": {"repobilityId": "205bc7cdeef64c94", "scanner": "scanner-primary", "fingerprint": "c674b570b8a1436c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1411a28ae0adc97b", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/screens/OnboardingAssessmentScreen.js:87"}, "properties": {"repobilityId": "32d413bf55077147", "scanner": "scanner-primary", "fingerprint": "1411a28ae0adc97b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-60596b6384ef541f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/screens/CoachChatScreen.js:46"}, "properties": {"repobilityId": "b9d9e4595c83e8fa", "scanner": "scanner-primary", "fingerprint": "60596b6384ef541f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4f0f198a7d18b7ac", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/screens/CoachChatScreen.js:2136"}, "properties": {"repobilityId": "44d8c6d7a0b3c471", "scanner": "scanner-primary", "fingerprint": "4f0f198a7d18b7ac", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-46af3dddfb3403ae", "level": "none", "message": {"text": "Commented-code block (22 lines) in src/screens/SignInScreen.js:13"}, "properties": {"repobilityId": "9a0ff4f60d3cd47f", "scanner": "scanner-primary", "fingerprint": "46af3dddfb3403ae", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8778cd064d549e52", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/screens/FindAGoalLoadingScreen.js:308"}, "properties": {"repobilityId": "f7d97f2ea51ee612", "scanner": "scanner-primary", "fingerprint": "8778cd064d549e52", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6c72a8b149d818c9", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/screens/NotificationsScreen.js:22"}, "properties": {"repobilityId": "369cea11ad26c07a", "scanner": "scanner-primary", "fingerprint": "6c72a8b149d818c9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-67b97e6410629223", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/screens/WelcomeScreen.js:37"}, "properties": {"repobilityId": "e6dbaf8e7f274817", "scanner": "scanner-primary", "fingerprint": "67b97e6410629223", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-723c398deb42f1ff", "level": "none", "message": {"text": "Commented-code block (11 lines) in src/screens/SettingsScreen.js:136"}, "properties": {"repobilityId": "848065524c8f0cde", "scanner": "scanner-primary", "fingerprint": "723c398deb42f1ff", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-40eebc3110d5bcc7", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/screens/WeekViewScreen.js:98"}, "properties": {"repobilityId": "393750505d35b0b2", "scanner": "scanner-primary", "fingerprint": "40eebc3110d5bcc7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c86b91f0b0b14a13", "level": "note", "message": {"text": "Legacy-named symbol `etapa_v2` in src/screens/ProgressScreen.js:5"}, "properties": {"repobilityId": "16c25a3ffb2850f6", "scanner": "scanner-primary", "fingerprint": "c86b91f0b0b14a13", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d57506ee152b72e5", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/screens/ProgressScreen.js:296"}, "properties": {"repobilityId": "7cb8608ab1d755bd", "scanner": "scanner-primary", "fingerprint": "d57506ee152b72e5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ebf12fb6e0325ba0", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/screens/PlanPickerScreen.js:51"}, "properties": {"repobilityId": "c50dec7d106e11d5", "scanner": "scanner-primary", "fingerprint": "ebf12fb6e0325ba0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1fad5f355ffff463", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/screens/ActivityDetailScreen.js:55"}, "properties": {"repobilityId": "c0c520bb279ae57f", "scanner": "scanner-primary", "fingerprint": "1fad5f355ffff463", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2d398c32889dcf19", "level": "none", "message": {"text": "Commented-code block (9 lines) in src/screens/WeeklySummaryScreen.js:48"}, "properties": {"repobilityId": "29a2eb03a97b087b", "scanner": "scanner-primary", "fingerprint": "2d398c32889dcf19", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fe5f68067c52dd82", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/screens/MCheckScreen.js:299"}, "properties": {"repobilityId": "968a006181aa4815", "scanner": "scanner-primary", "fingerprint": "fe5f68067c52dd82", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-748ef8bc389f11a9", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/screens/BikeFitFindingsScreen.js:79"}, "properties": {"repobilityId": "145a15fa652ecfa4", "scanner": "scanner-primary", "fingerprint": "748ef8bc389f11a9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-91258045c9f8c44f", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/screens/OnboardingGoalPromptScreen.js:37"}, "properties": {"repobilityId": "10ffb21c931c156e", "scanner": "scanner-primary", "fingerprint": "91258045c9f8c44f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-20d40544e1089416", "level": "none", "message": {"text": "Commented-code block (15 lines) in src/screens/OnboardingLevelScreen.js:32"}, "properties": {"repobilityId": "8c3bc042191372b7", "scanner": "scanner-primary", "fingerprint": "20d40544e1089416", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-641d5601fa8fe8df", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/screens/OnboardingCoachScreen.js:87"}, "properties": {"repobilityId": "cfceaae8810ca5b7", "scanner": "scanner-primary", "fingerprint": "641d5601fa8fe8df", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-61a503fc7880a4b8", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/screens/FindAGoalIntroScreen.js:54"}, "properties": {"repobilityId": "f0e0b66e56268a56", "scanner": "scanner-primary", "fingerprint": "61a503fc7880a4b8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b727544b4e67ca90", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/screens/MyEventsScreen.js:174"}, "properties": {"repobilityId": "cbf54db019c668d9", "scanner": "scanner-primary", "fingerprint": "b727544b4e67ca90", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-de330772a5db8e53", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/screens/GettingStartedScreen.js:63"}, "properties": {"repobilityId": "4937e9e2cac2420b", "scanner": "scanner-primary", "fingerprint": "de330772a5db8e53", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-67bf6478bfff4541", "level": "note", "message": {"text": "Legacy-named symbol `crossTrainingDaysLegacy` in src/screens/PlanConfigScreen.js:1132"}, "properties": {"repobilityId": "f97a67049d0789d8", "scanner": "scanner-primary", "fingerprint": "67bf6478bfff4541", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-6ad5b224d9d4a152", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/screens/PlanConfigScreen.js:46"}, "properties": {"repobilityId": "0c996addf3551495", "scanner": "scanner-primary", "fingerprint": "6ad5b224d9d4a152", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-85aac58a40ac7f15", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/screens/OnboardingAthleteContextScreen.js:37"}, "properties": {"repobilityId": "a6657927ba312a10", "scanner": "scanner-primary", "fingerprint": "85aac58a40ac7f15", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b2f0e4113262b3e9", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/utils/location.js:1"}, "properties": {"repobilityId": "c333a788e5f5b950", "scanner": "scanner-primary", "fingerprint": "b2f0e4113262b3e9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e845803c47c567f2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/utils/location.js:102"}, "properties": {"repobilityId": "ee74432d7bbe3c79", "scanner": "scanner-primary", "fingerprint": "e845803c47c567f2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4b266044a09c2239", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/utils/strength.js:3"}, "properties": {"repobilityId": "b9257b840de283f8", "scanner": "scanner-primary", "fingerprint": "4b266044a09c2239", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0440ab7799620c38", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/utils/bikeSwap.js:45"}, "properties": {"repobilityId": "c81855e4f8a3bef9", "scanner": "scanner-primary", "fingerprint": "0440ab7799620c38", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-484a3e4e93a09173", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/utils/sessionLabels.js:134"}, "properties": {"repobilityId": "8201f98121c6ed5b", "scanner": "scanner-primary", "fingerprint": "484a3e4e93a09173", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1eca4d7b73d0aa29", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/utils/sessionReference.js:35"}, "properties": {"repobilityId": "7c90c9bd0e67b18d", "scanner": "scanner-primary", "fingerprint": "1eca4d7b73d0aa29", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0febf6251a2b0303", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/UI.js:22"}, "properties": {"repobilityId": "967682806bb747f5", "scanner": "scanner-primary", "fingerprint": "0febf6251a2b0303", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c1df471038faa824", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/components/LoadingSplash.js:47"}, "properties": {"repobilityId": "01b33ca058c6a213", "scanner": "scanner-primary", "fingerprint": "c1df471038faa824", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0c6baefb6faaddcc", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/LearningImage.js:74"}, "properties": {"repobilityId": "36757669e2e5d0c0", "scanner": "scanner-primary", "fingerprint": "0c6baefb6faaddcc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bace6c18c98f4663", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/BucketListCard.js:150"}, "properties": {"repobilityId": "d79016c16e8c82db", "scanner": "scanner-primary", "fingerprint": "bace6c18c98f4663", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-93f475d32a5a3d11", "level": "note", "message": {"text": "Legacy-named symbol `rowOld` in src/components/BikeSwapModal.js:156"}, "properties": {"repobilityId": "760e7f16e8515134", "scanner": "scanner-primary", "fingerprint": "93f475d32a5a3d11", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-30a2d12ebdeed9b6", "level": "none", "message": {"text": "Commented-code block (11 lines) in src/components/PlanAddReviewSheet.js:26"}, "properties": {"repobilityId": "98e0e6e7e18e5487", "scanner": "scanner-primary", "fingerprint": "30a2d12ebdeed9b6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e0fc98fd468003e4", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/WizardShell.js:115"}, "properties": {"repobilityId": "082f15d94e5e707c", "scanner": "scanner-primary", "fingerprint": "e0fc98fd468003e4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-44716dee3602dbf7", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/BucketListItemSheet.js:136"}, "properties": {"repobilityId": "9de06bb1e57fa6af", "scanner": "scanner-primary", "fingerprint": "44716dee3602dbf7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0c9c2a3f65f0cd82", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/EventsMapView.js:116"}, "properties": {"repobilityId": "ea3581991b696e33", "scanner": "scanner-primary", "fingerprint": "0c9c2a3f65f0cd82", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-284d06d0fda6edcd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/EventsMapView.js:123"}, "properties": {"repobilityId": "f26ad59ba9a216f5", "scanner": "scanner-primary", "fingerprint": "284d06d0fda6edcd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-78c13794a57aaa87", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/LocationPickerModal.js:14"}, "properties": {"repobilityId": "451a6d4df9e34062", "scanner": "scanner-primary", "fingerprint": "78c13794a57aaa87", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bad0890fc152faca", "level": "none", "message": {"text": "Commented-code block (10 lines) in src/components/SmartCareCard.js:145"}, "properties": {"repobilityId": "b34487e9530a81c5", "scanner": "scanner-primary", "fingerprint": "bad0890fc152faca", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c3be25bf0cf013e1", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/BikeRetailersList.js:33"}, "properties": {"repobilityId": "988bd361af6ded0e", "scanner": "scanner-primary", "fingerprint": "c3be25bf0cf013e1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5bae1cb8e5913488", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/InlineGoalCoachChat.js:38"}, "properties": {"repobilityId": "1f47c1c8db23fcf5", "scanner": "scanner-primary", "fingerprint": "5bae1cb8e5913488", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-54db5ca3fc98509c", "level": "none", "message": {"text": "Commented-code block (10 lines) in src/components/ExportInstructionsModal.js:48"}, "properties": {"repobilityId": "0fd044dc35065586", "scanner": "scanner-primary", "fingerprint": "54db5ca3fc98509c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cd7ed39606815094", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/CoachChatCard.js:27"}, "properties": {"repobilityId": "e66461591b184787", "scanner": "scanner-primary", "fingerprint": "cd7ed39606815094", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c93d33098844d7db", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/ActivityFeedbackSheet.js:140"}, "properties": {"repobilityId": "e49f3591ca5c19f4", "scanner": "scanner-primary", "fingerprint": "c93d33098844d7db", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-678f2c1855fe40cf", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/components/RestTimer.js:91"}, "properties": {"repobilityId": "0860bc9a46eef8b4", "scanner": "scanner-primary", "fingerprint": "678f2c1855fe40cf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-397e704ee95d86d9", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/components/RouteFinderBanner.js:253"}, "properties": {"repobilityId": "a28717d89361d67a", "scanner": "scanner-primary", "fingerprint": "397e704ee95d86d9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f763531498e2b13e", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/theme/index.js:15"}, "properties": {"repobilityId": "32b8d80a958657a9", "scanner": "scanner-primary", "fingerprint": "f763531498e2b13e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5d63a04545900b2b", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/theme/components/Chip.js:72"}, "properties": {"repobilityId": "b87f518e03a5f6cc", "scanner": "scanner-primary", "fingerprint": "5d63a04545900b2b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-af16169bd7a3ccd1", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/goalStatus.js:57"}, "properties": {"repobilityId": "3b611ef50f0b899f", "scanner": "scanner-primary", "fingerprint": "af16169bd7a3ccd1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ea3a2498e23e05ef", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/services/learningVideosCache.js:15"}, "properties": {"repobilityId": "5e16cdfa1ce80ea6", "scanner": "scanner-primary", "fingerprint": "ea3a2498e23e05ef", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-54219011b0d7c725", "level": "note", "message": {"text": "Legacy-named symbol `etapa_bucket_list_v1` in src/services/storageService.js:34"}, "properties": {"repobilityId": "dfcfd9e398ca7517", "scanner": "scanner-primary", "fingerprint": "54219011b0d7c725", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-41efa325741a7c28", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/services/storageService.js:29"}, "properties": {"repobilityId": "26dbdaae1271b398", "scanner": "scanner-primary", "fingerprint": "41efa325741a7c28", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-522070c63de21fac", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/services/subscriptionService.js:146"}, "properties": {"repobilityId": "9578cf28ae593520", "scanner": "scanner-primary", "fingerprint": "522070c63de21fac", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-018b12544980456b", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/services/analyticsService.js:27"}, "properties": {"repobilityId": "0d9c73bda091e15a", "scanner": "scanner-primary", "fingerprint": "018b12544980456b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b7f471e4ebab4dab", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/services/remoteConfig.js:78"}, "properties": {"repobilityId": "b13235dc868e8132", "scanner": "scanner-primary", "fingerprint": "b7f471e4ebab4dab", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0bb2bf5f49fb47e1", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/services/stravaSyncService.js:36"}, "properties": {"repobilityId": "13a816e8aead0602", "scanner": "scanner-primary", "fingerprint": "0bb2bf5f49fb47e1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-86ece0c66ad030eb", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/services/paywallNav.js:21"}, "properties": {"repobilityId": "a855dbc73f9dea26", "scanner": "scanner-primary", "fingerprint": "86ece0c66ad030eb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-76e952a8f7a6c13d", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/services/calendarPlanFlow.js:168"}, "properties": {"repobilityId": "f418667215ea8cda", "scanner": "scanner-primary", "fingerprint": "76e952a8f7a6c13d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-08f9b8b431761781", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/services/postAuthRouting.js:41"}, "properties": {"repobilityId": "6e7ad3cc96c097fd", "scanner": "scanner-primary", "fingerprint": "08f9b8b431761781", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ece9056f1a7e86d2", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/services/notificationService.js:14"}, "properties": {"repobilityId": "834a5828591969a8", "scanner": "scanner-primary", "fingerprint": "ece9056f1a7e86d2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-35cb5c3a370396cf", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/services/llmPlanService.js:19"}, "properties": {"repobilityId": "8141869d9ce585a1", "scanner": "scanner-primary", "fingerprint": "35cb5c3a370396cf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-59fd3e30c75d9880", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/services/llmPlanService.js:205"}, "properties": {"repobilityId": "b0d59e049d0c2fd4", "scanner": "scanner-primary", "fingerprint": "59fd3e30c75d9880", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c095757aed997fa2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/services/stravaService.js:99"}, "properties": {"repobilityId": "09662c047dbdb744", "scanner": "scanner-primary", "fingerprint": "c095757aed997fa2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e9b9ef641f196e3c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/services/connectivityMonitor.js:11"}, "properties": {"repobilityId": "9ec88f85b5da4099", "scanner": "scanner-primary", "fingerprint": "e9b9ef641f196e3c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3d9169e3ad0a86ea", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/services/bikeFitUpload.js:25"}, "properties": {"repobilityId": "e7124cff2d189c00", "scanner": "scanner-primary", "fingerprint": "3d9169e3ad0a86ea", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9afd6179c56cad07", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/services/api.js:34"}, "properties": {"repobilityId": "60f68a7575ad4fa3", "scanner": "scanner-primary", "fingerprint": "9afd6179c56cad07", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-39fbb892be0d0980", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/services/revenueCatService.js:19"}, "properties": {"repobilityId": "194f43af47f78335", "scanner": "scanner-primary", "fingerprint": "39fbb892be0d0980", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-697830c613ddca5d", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/services/productIds.js:47"}, "properties": {"repobilityId": "fdc739532ea52b62", "scanner": "scanner-primary", "fingerprint": "697830c613ddca5d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0a6689dc9b735f51", "level": "none", "message": {"text": "Commented-code block (10 lines) in src/services/etapaEssentials.js:39"}, "properties": {"repobilityId": "05a523d890abf06e", "scanner": "scanner-primary", "fingerprint": "0a6689dc9b735f51", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e21799e888028c46", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/services/planGenerator.js:790"}, "properties": {"repobilityId": "38a1821c776142b3", "scanner": "scanner-primary", "fingerprint": "e21799e888028c46", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1156c862f8216c6d", "level": "none", "message": {"text": "Commented-code block (7 lines) in e2e/runner.mjs:171"}, "properties": {"repobilityId": "4f9e34c65ef14604", "scanner": "scanner-primary", "fingerprint": "1156c862f8216c6d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f1852a2f1e6cbc82", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 e2e/runner.mjs:291"}, "properties": {"repobilityId": "a45b0570c62b4858", "scanner": "scanner-primary", "fingerprint": "f1852a2f1e6cbc82", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0f954a129a2c80b0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 e2e/scripts/bootstrap-accounts.mjs:73"}, "properties": {"repobilityId": "00fae7af29b47727", "scanner": "scanner-primary", "fingerprint": "0f954a129a2c80b0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-500e3b7d9fe8faf0", "level": "note", "message": {"text": "76 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "12aca37ef2a6fb6e", "scanner": "scanner-primary", "fingerprint": "500e3b7d9fe8faf0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-778c67b9b30ad87b", "level": "error", "message": {"text": "Dangling fetch: POST /api/run-tests/cancel (tests/dashboard/src/app/results/page.js:126)"}, "properties": {"repobilityId": "71d29a4ace810088", "scanner": "scanner-primary", "fingerprint": "778c67b9b30ad87b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b803ca444654c25a", "level": "error", "message": {"text": "Dangling fetch: POST /api/run-tests (tests/dashboard/src/app/results/page.js:187)"}, "properties": {"repobilityId": "04dae843eb86b82f", "scanner": "scanner-primary", "fingerprint": "b803ca444654c25a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4029445419628b3c", "level": "error", "message": {"text": "Dangling fetch: GET /api/speed-rules (tests/dashboard/src/app/speed-rules/page.js:35)"}, "properties": {"repobilityId": "43d93953241fe925", "scanner": "scanner-primary", "fingerprint": "4029445419628b3c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f8187cb15567a96a", "level": "error", "message": {"text": "Dangling fetch: POST /api/speed-rules/run (tests/dashboard/src/app/speed-rules/page.js:50)"}, "properties": {"repobilityId": "ab7c8b0552e89534", "scanner": "scanner-primary", "fingerprint": "f8187cb15567a96a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-269eb01a8c038477", "level": "error", "message": {"text": "Dangling fetch: POST https://api.linear.app/graphql (server/src/index.js:203)"}, "properties": {"repobilityId": "a367793a2e270ff6", "scanner": "scanner-primary", "fingerprint": "269eb01a8c038477", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-687bcd89cd6d2326", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/index.js:400)"}, "properties": {"repobilityId": "330ccdce988d40f0", "scanner": "scanner-primary", "fingerprint": "687bcd89cd6d2326", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0bd692d398ca8b39", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/index.js:720)"}, "properties": {"repobilityId": "adbd8953fbf30601", "scanner": "scanner-primary", "fingerprint": "0bd692d398ca8b39", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-580da608d865efd2", "level": "error", "message": {"text": "Dangling fetch: GET https://api.anthropic.com/v1/messages (server/src/lib/claudeLogger.js:28)"}, "properties": {"repobilityId": "ddeed410e35df89c", "scanner": "scanner-primary", "fingerprint": "580da608d865efd2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7533d10ddeeb5b4a", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/lib/claudeLogger.js:272)"}, "properties": {"repobilityId": "649df7d0e9a298ba", "scanner": "scanner-primary", "fingerprint": "7533d10ddeeb5b4a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e3bffca7fe4c1512", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/roadside.js:302)"}, "properties": {"repobilityId": "5cd901e602cfee72", "scanner": "scanner-primary", "fingerprint": "e3bffca7fe4c1512", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1de990376bd9fecd", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/publicEvents.js:348)"}, "properties": {"repobilityId": "a171db823fb7c506", "scanner": "scanner-primary", "fingerprint": "1de990376bd9fecd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-de9f57d6ce48f3a2", "level": "error", "message": {"text": "Dangling fetch: GET https://api.revenuecat.com/v1/subscribers/${encodeURIComponent(appUserId)} (server/src/routes/admin.js:121)"}, "properties": {"repobilityId": "2c210172a4f022bc", "scanner": "scanner-primary", "fingerprint": "de9f57d6ce48f3a2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3794447f582a9ad6", "level": "error", "message": {"text": "Dangling fetch: POST https://api.revenuecat.com/v1/subscribers/${encodeURIComponent(appUserId)}/entitlements/${encodeURIComponent(entitlementId)}/promotional (server/src/routes/admin.js:167)"}, "properties": {"repobilityId": "dc4800a1b5f3b186", "scanner": "scanner-primary", "fingerprint": "3794447f582a9ad6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7831296910f08afd", "level": "error", "message": {"text": "Dangling fetch: POST https://api.revenuecat.com/v1/subscribers/${encodeURIComponent(appUserId)}/entitlements/${encodeURIComponent(entitlementId)}/revoke_promotionals (server/src/routes/admin.js:209)"}, "properties": {"repobilityId": "def3fe769c35d897", "scanner": "scanner-primary", "fingerprint": "7831296910f08afd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-98384ea70191944a", "level": "error", "message": {"text": "Dangling fetch: POST https://api.linear.app/graphql (server/src/routes/admin.js:1159)"}, "properties": {"repobilityId": "5c50a578f820200b", "scanner": "scanner-primary", "fingerprint": "98384ea70191944a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b71d131a7f6581cb", "level": "error", "message": {"text": "Dangling fetch: POST https://api.linear.app/graphql (server/src/routes/admin.js:3257)"}, "properties": {"repobilityId": "0efd487b24438b30", "scanner": "scanner-primary", "fingerprint": "b71d131a7f6581cb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-223977c1ebcda982", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/admin.js:3650)"}, "properties": {"repobilityId": "9e1101613b541076", "scanner": "scanner-primary", "fingerprint": "223977c1ebcda982", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-12b96f6be5e7ebbb", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/admin.js:4444)"}, "properties": {"repobilityId": "5e0ba99e3c1994d0", "scanner": "scanner-primary", "fingerprint": "12b96f6be5e7ebbb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-957b2e724e299ce7", "level": "error", "message": {"text": "Dangling fetch: POST https://api.linear.app/graphql (server/src/routes/feedback.js:143)"}, "properties": {"repobilityId": "4eb5fe234ed99c19", "scanner": "scanner-primary", "fingerprint": "957b2e724e299ce7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-26a3e909faf922d6", "level": "error", "message": {"text": "Dangling fetch: POST https://api.linear.app/graphql (server/src/routes/feedback.js:594)"}, "properties": {"repobilityId": "29142f43fad28510", "scanner": "scanner-primary", "fingerprint": "26a3e909faf922d6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c71f98d0a6ba9fed", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:155)"}, "properties": {"repobilityId": "2a21873394a5ec48", "scanner": "scanner-primary", "fingerprint": "c71f98d0a6ba9fed", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7d2bd02b9c0754b8", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:277)"}, "properties": {"repobilityId": "cb87c0019c5da4bb", "scanner": "scanner-primary", "fingerprint": "7d2bd02b9c0754b8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a4f8afb4c9bdc4aa", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:345)"}, "properties": {"repobilityId": "0cdf098f72861dc8", "scanner": "scanner-primary", "fingerprint": "a4f8afb4c9bdc4aa", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-61d34f5f9d16d735", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:505)"}, "properties": {"repobilityId": "8246c9a7d1cd6c07", "scanner": "scanner-primary", "fingerprint": "61d34f5f9d16d735", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6eb4168b2c714d30", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:683)"}, "properties": {"repobilityId": "8e6f370b51053a22", "scanner": "scanner-primary", "fingerprint": "6eb4168b2c714d30", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-68424615cef9d0d6", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:866)"}, "properties": {"repobilityId": "6ede93866086bf28", "scanner": "scanner-primary", "fingerprint": "68424615cef9d0d6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-817c3f11102000b6", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:1072)"}, "properties": {"repobilityId": "f8c3845d84a8dfba", "scanner": "scanner-primary", "fingerprint": "817c3f11102000b6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b416a5fb91e61fde", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:1277)"}, "properties": {"repobilityId": "571f76c8ff358948", "scanner": "scanner-primary", "fingerprint": "b416a5fb91e61fde", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4a23906348257f1f", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:1470)"}, "properties": {"repobilityId": "bc9a5ff36da7bde1", "scanner": "scanner-primary", "fingerprint": "4a23906348257f1f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0a2dd542085ecf0c", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:2712)"}, "properties": {"repobilityId": "191c90c5371b7fba", "scanner": "scanner-primary", "fingerprint": "0a2dd542085ecf0c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7d51128aa328ea08", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:2837)"}, "properties": {"repobilityId": "7899eb3a5037a619", "scanner": "scanner-primary", "fingerprint": "7d51128aa328ea08", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c1db319ba789ab12", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:2964)"}, "properties": {"repobilityId": "044bb64be57f032a", "scanner": "scanner-primary", "fingerprint": "c1db319ba789ab12", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e1dab557fc46150a", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:3747)"}, "properties": {"repobilityId": "22ef087ce33bcdf4", "scanner": "scanner-primary", "fingerprint": "e1dab557fc46150a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-59b3f9761f7683e6", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:4463)"}, "properties": {"repobilityId": "97d0b719a0fb04de", "scanner": "scanner-primary", "fingerprint": "59b3f9761f7683e6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-227f07c7c916dd7f", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:4676)"}, "properties": {"repobilityId": "2422d14226378ace", "scanner": "scanner-primary", "fingerprint": "227f07c7c916dd7f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7431d9bcbccad327", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:5654)"}, "properties": {"repobilityId": "83614e103c7f4e59", "scanner": "scanner-primary", "fingerprint": "7431d9bcbccad327", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cbf14cfb3deafc26", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:5902)"}, "properties": {"repobilityId": "9a4cb5e1d31a5ccd", "scanner": "scanner-primary", "fingerprint": "cbf14cfb3deafc26", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-df4b234f79d0f4c8", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:6564)"}, "properties": {"repobilityId": "305d124e56f93008", "scanner": "scanner-primary", "fingerprint": "df4b234f79d0f4c8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-550ef40baed23dc1", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/ai.js:6683)"}, "properties": {"repobilityId": "9799a95dcd0ab2af", "scanner": "scanner-primary", "fingerprint": "550ef40baed23dc1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-64b9ea3ff7b90976", "level": "error", "message": {"text": "Dangling fetch: POST https://api.linear.app/graphql (server/src/routes/support.js:35)"}, "properties": {"repobilityId": "3af5a16879be788b", "scanner": "scanner-primary", "fingerprint": "64b9ea3ff7b90976", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-30e1da91138f8726", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/checkins.js:966)"}, "properties": {"repobilityId": "0780958a2adface6", "scanner": "scanner-primary", "fingerprint": "30e1da91138f8726", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ecc116aee987cf20", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/checkins.js:1108)"}, "properties": {"repobilityId": "5db460bf4211800a", "scanner": "scanner-primary", "fingerprint": "ecc116aee987cf20", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-731c2d5a25fa64fe", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/checkins.js:1460)"}, "properties": {"repobilityId": "441d02aeca8b7030", "scanner": "scanner-primary", "fingerprint": "731c2d5a25fa64fe", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a3254fdf28070686", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (server/src/routes/publicPlanPreview.js:211)"}, "properties": {"repobilityId": "d70e875efe59067f", "scanner": "scanner-primary", "fingerprint": "a3254fdf28070686", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-24cbd88187351980", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (e2e/runner.mjs:368)"}, "properties": {"repobilityId": "774f1f59904d43ce", "scanner": "scanner-primary", "fingerprint": "24cbd88187351980", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-aa57566982c1be81", "level": "error", "message": {"text": "Dangling fetch: POST https://api.linear.app/graphql (e2e/runner.mjs:409)"}, "properties": {"repobilityId": "03f69cbc3fca6aea", "scanner": "scanner-primary", "fingerprint": "aa57566982c1be81", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fef7ea842edfbf3f", "level": "error", "message": {"text": "Dangling fetch: POST /api/users/${userId}/${path} (admin-dashboard/src/app/dashboard/users/[id]/page.tsx:337)"}, "properties": {"repobilityId": "7baec83e89dac006", "scanner": "scanner-primary", "fingerprint": "fef7ea842edfbf3f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-306087738867d0b6", "level": "error", "message": {"text": "Dangling fetch: GET /api/config (admin-dashboard/src/app/dashboard/config/page.tsx:213)"}, "properties": {"repobilityId": "a90a94d53a6c3f86", "scanner": "scanner-primary", "fingerprint": "306087738867d0b6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-67e2e6014ca416a1", "level": "error", "message": {"text": "Dangling fetch: PUT /api/config (admin-dashboard/src/app/dashboard/config/page.tsx:310)"}, "properties": {"repobilityId": "6be2cdc77d747485", "scanner": "scanner-primary", "fingerprint": "67e2e6014ca416a1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7e9a6aa0559d560b", "level": "error", "message": {"text": "Dangling fetch: PUT /api/config (admin-dashboard/src/app/dashboard/config/page.tsx:325)"}, "properties": {"repobilityId": "35f40f79a1592005", "scanner": "scanner-primary", "fingerprint": "7e9a6aa0559d560b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f00afe5613231a96", "level": "error", "message": {"text": "Dangling fetch: PUT /api/config (admin-dashboard/src/app/dashboard/config/page.tsx:340)"}, "properties": {"repobilityId": "3c8a7921efa6313b", "scanner": "scanner-primary", "fingerprint": "f00afe5613231a96", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ce28bd103ba288b2", "level": "error", "message": {"text": "Dangling fetch: PUT /api/config (admin-dashboard/src/app/dashboard/config/page.tsx:355)"}, "properties": {"repobilityId": "76af5d4126a94d0d", "scanner": "scanner-primary", "fingerprint": "ce28bd103ba288b2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f46033e458b6773b", "level": "error", "message": {"text": "Dangling fetch: PUT /api/config (admin-dashboard/src/app/dashboard/config/page.tsx:372)"}, "properties": {"repobilityId": "b49d9c72de80869d", "scanner": "scanner-primary", "fingerprint": "f46033e458b6773b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a28736986214c4b0", "level": "error", "message": {"text": "Dangling fetch: PUT /api/config (admin-dashboard/src/app/dashboard/config/page.tsx:403)"}, "properties": {"repobilityId": "e487108fd424712e", "scanner": "scanner-primary", "fingerprint": "a28736986214c4b0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-36e23c5a0d84cabc", "level": "error", "message": {"text": "Dangling fetch: PUT /api/config (admin-dashboard/src/app/dashboard/config/page.tsx:418)"}, "properties": {"repobilityId": "18f78203d29f9c14", "scanner": "scanner-primary", "fingerprint": "36e23c5a0d84cabc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-91e9e8f58c2fde3b", "level": "error", "message": {"text": "Dangling fetch: GET /api/coupons/redemptions (admin-dashboard/src/app/dashboard/payments/page.tsx:130)"}, "properties": {"repobilityId": "9e600356da3e0830", "scanner": "scanner-primary", "fingerprint": "91e9e8f58c2fde3b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b5949c3133883e52", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/payments/${deleteTarget.id} (admin-dashboard/src/app/dashboard/payments/page.tsx:142)"}, "properties": {"repobilityId": "26ffa65d9cbc339d", "scanner": "scanner-primary", "fingerprint": "b5949c3133883e52", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "9446ea667e43bcd5", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-efbc80312c5027b5", "level": "note", "message": {"text": "Unused endpoint: ALL /mcp"}, "properties": {"repobilityId": "21a2c91640cc9a55", "scanner": "scanner-primary", "fingerprint": "efbc80312c5027b5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c12359c53655d97c", "level": "note", "message": {"text": "Unused endpoint: POST /api/revenuecat/webhook"}, "properties": {"repobilityId": "4293c106ca7da333", "scanner": "scanner-primary", "fingerprint": "c12359c53655d97c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9425b8ec72722c6b", "level": "note", "message": {"text": "Unused endpoint: GET /api/exports/workout"}, "properties": {"repobilityId": "bc71d3afa902af20", "scanner": "scanner-primary", "fingerprint": "9425b8ec72722c6b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fabc87c47563cf9e", "level": "note", "message": {"text": "Unused endpoint: POST /api/account-deletion"}, "properties": {"repobilityId": "6cadb2ed0c162adf", "scanner": "scanner-primary", "fingerprint": "fabc87c47563cf9e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e7a352cac59cfc66", "level": "note", "message": {"text": "Unused endpoint: POST /api/public/register-interest"}, "properties": {"repobilityId": "4f0283350a325c86", "scanner": "scanner-primary", "fingerprint": "e7a352cac59cfc66", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-96b03530476b6f5d", "level": "note", "message": {"text": "Unused endpoint: POST /api/public/demo-event"}, "properties": {"repobilityId": "3b9542c1020432fc", "scanner": "scanner-primary", "fingerprint": "96b03530476b6f5d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-10886a5c42b1e1c8", "level": "note", "message": {"text": "Unused endpoint: POST /api/public/coach-ask"}, "properties": {"repobilityId": "4798a5ea601882ab", "scanner": "scanner-primary", "fingerprint": "10886a5c42b1e1c8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-92958cf56f85069c", "level": "note", "message": {"text": "Unused endpoint: POST /api/public/review-plan"}, "properties": {"repobilityId": "1a7750b8b2067151", "scanner": "scanner-primary", "fingerprint": "92958cf56f85069c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-74fc645e6347c183", "level": "note", "message": {"text": "Unused endpoint: POST /api/public/sample-plan"}, "properties": {"repobilityId": "f6cbb0c06b0cbca5", "scanner": "scanner-primary", "fingerprint": "74fc645e6347c183", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0467dc02ced13a1c", "level": "note", "message": {"text": "Unused endpoint: GET /api/public/prices"}, "properties": {"repobilityId": "9088fae665a05fe8", "scanner": "scanner-primary", "fingerprint": "0467dc02ced13a1c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4ff40cb10f7c8519", "level": "note", "message": {"text": "Unused endpoint: USE /api/users"}, "properties": {"repobilityId": "bc02b9492fe120aa", "scanner": "scanner-primary", "fingerprint": "4ff40cb10f7c8519", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7522dc7e4529ffc2", "level": "note", "message": {"text": "Unused endpoint: USE /api/goals"}, "properties": {"repobilityId": "cb960e37b3721e81", "scanner": "scanner-primary", "fingerprint": "7522dc7e4529ffc2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d77cb9ba2ceab6f2", "level": "note", "message": {"text": "Unused endpoint: USE /api/bucket-list"}, "properties": {"repobilityId": "c46fc83ee36360e5", "scanner": "scanner-primary", "fingerprint": "d77cb9ba2ceab6f2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-39896fd3e88e0074", "level": "note", "message": {"text": "Unused endpoint: USE /api/plans"}, "properties": {"repobilityId": "8340f06c22f1d66a", "scanner": "scanner-primary", "fingerprint": "39896fd3e88e0074", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ecf059754654e54d", "level": "note", "message": {"text": "Unused endpoint: USE /api/plan-configs"}, "properties": {"repobilityId": "67783294e4bbd2ca", "scanner": "scanner-primary", "fingerprint": "ecf059754654e54d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f96c79944f4d73af", "level": "note", "message": {"text": "Unused endpoint: USE /api/chat-sessions"}, "properties": {"repobilityId": "a57af8f63fccbaca", "scanner": "scanner-primary", "fingerprint": "f96c79944f4d73af", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-316c43db307befc3", "level": "note", "message": {"text": "Unused endpoint: USE /api/ai"}, "properties": {"repobilityId": "3a7ad40fa1770165", "scanner": "scanner-primary", "fingerprint": "316c43db307befc3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-454e5ba6b67ab18b", "level": "note", "message": {"text": "Unused endpoint: USE /api/subscription"}, "properties": {"repobilityId": "5e5cb445affb2e1e", "scanner": "scanner-primary", "fingerprint": "454e5ba6b67ab18b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e6c42c2627e519e8", "level": "note", "message": {"text": "Unused endpoint: USE /api/feedback"}, "properties": {"repobilityId": "5e7f149b3e811e42", "scanner": "scanner-primary", "fingerprint": "e6c42c2627e519e8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4704263493f7c11d", "level": "note", "message": {"text": "Unused endpoint: USE /api/support"}, "properties": {"repobilityId": "712b656b6c1851f0", "scanner": "scanner-primary", "fingerprint": "4704263493f7c11d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c3a8b7932f72b92f", "level": "note", "message": {"text": "Unused endpoint: USE /api/notifications"}, "properties": {"repobilityId": "f9b02a45b85accd6", "scanner": "scanner-primary", "fingerprint": "c3a8b7932f72b92f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4d0af7c9d96abd10", "level": "note", "message": {"text": "Unused endpoint: USE /api/preferences"}, "properties": {"repobilityId": "4dfc0bb090d5edee", "scanner": "scanner-primary", "fingerprint": "4d0af7c9d96abd10", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-473f5b7d3ee1c86e", "level": "note", "message": {"text": "Unused endpoint: USE /api/app-config"}, "properties": {"repobilityId": "350b81654512bd67", "scanner": "scanner-primary", "fingerprint": "473f5b7d3ee1c86e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-446fe4b6ad1a4ff9", "level": "note", "message": {"text": "Unused endpoint: USE /api/public"}, "properties": {"repobilityId": "3c2c67ff569a555d", "scanner": "scanner-primary", "fingerprint": "446fe4b6ad1a4ff9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8e3baafac5794889", "level": "note", "message": {"text": "Unused endpoint: USE /api/public/events"}, "properties": {"repobilityId": "86ef7f720a7f7ec1", "scanner": "scanner-primary", "fingerprint": "8e3baafac5794889", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6fba83805be4e883", "level": "note", "message": {"text": "Unused endpoint: USE /api/public/event-plan-preview"}, "properties": {"repobilityId": "b0b975ac0c593ed8", "scanner": "scanner-primary", "fingerprint": "6fba83805be4e883", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e71288fdc93fb110", "level": "note", "message": {"text": "Unused endpoint: USE /api/coach-checkin"}, "properties": {"repobilityId": "f1d1abf62d1f6862", "scanner": "scanner-primary", "fingerprint": "e71288fdc93fb110", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9ea8576d3e096f64", "level": "note", "message": {"text": "Unused endpoint: USE /api/checkins"}, "properties": {"repobilityId": "10a8191cd8717e8d", "scanner": "scanner-primary", "fingerprint": "9ea8576d3e096f64", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a443a6edb90149cf", "level": "note", "message": {"text": "Unused endpoint: USE /api/checkin-prefs"}, "properties": {"repobilityId": "4fabf8a3aebc62ba", "scanner": "scanner-primary", "fingerprint": "a443a6edb90149cf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-05f25653c6bf5bd3", "level": "note", "message": {"text": "Unused endpoint: USE /api/checkins-cron"}, "properties": {"repobilityId": "66c6b9a63d5d0faf", "scanner": "scanner-primary", "fingerprint": "05f25653c6bf5bd3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d93a530ce10d47d9", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin"}, "properties": {"repobilityId": "ebbba58d5015ae57", "scanner": "scanner-primary", "fingerprint": "d93a530ce10d47d9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0e76e800612b093e", "level": "note", "message": {"text": "Unused endpoint: USE /api/coaching"}, "properties": {"repobilityId": "05817ee3d43909a2", "scanner": "scanner-primary", "fingerprint": "0e76e800612b093e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e3a81fb42ac44e31", "level": "note", "message": {"text": "Unused endpoint: USE /api/coupons"}, "properties": {"repobilityId": "52289eb94f062fc1", "scanner": "scanner-primary", "fingerprint": "e3a81fb42ac44e31", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-148690a8d35e14f1", "level": "note", "message": {"text": "Unused endpoint: USE /api/test"}, "properties": {"repobilityId": "814facead871335c", "scanner": "scanner-primary", "fingerprint": "148690a8d35e14f1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6e291966feff31e8", "level": "note", "message": {"text": "Unused endpoint: USE /api/find-goal"}, "properties": {"repobilityId": "7fc7c264d0a7da82", "scanner": "scanner-primary", "fingerprint": "6e291966feff31e8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c12467899a0690da", "level": "note", "message": {"text": "Unused endpoint: USE /api/bike-fit"}, "properties": {"repobilityId": "358adf890ebdd5c3", "scanner": "scanner-primary", "fingerprint": "c12467899a0690da", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b8499e5241ba3b78", "level": "note", "message": {"text": "Unused endpoint: USE /api/bike-maintenance"}, "properties": {"repobilityId": "a59ee09c81a4df49", "scanner": "scanner-primary", "fingerprint": "b8499e5241ba3b78", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f2ebfdb2670694dd", "level": "note", "message": {"text": "Unused endpoint: USE /api/bikes"}, "properties": {"repobilityId": "585b1c4a332d5c1b", "scanner": "scanner-primary", "fingerprint": "f2ebfdb2670694dd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ec00984b27c88c15", "level": "note", "message": {"text": "Unused endpoint: USE /api/events"}, "properties": {"repobilityId": "ba1ff4026e7ccf1f", "scanner": "scanner-primary", "fingerprint": "ec00984b27c88c15", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0eb0ecf2a1b99bfe", "level": "note", "message": {"text": "Unused endpoint: USE /api/roadside"}, "properties": {"repobilityId": "904dd28a1c8b7e10", "scanner": "scanner-primary", "fingerprint": "0eb0ecf2a1b99bfe", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8adbc8143200eb27", "level": "note", "message": {"text": "Unused endpoint: USE /api/gear"}, "properties": {"repobilityId": "acdbecf7341b81f5", "scanner": "scanner-primary", "fingerprint": "8adbc8143200eb27", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cd9caded528219d7", "level": "note", "message": {"text": "Unused endpoint: USE /api/posture-check"}, "properties": {"repobilityId": "cb4ba940318423f8", "scanner": "scanner-primary", "fingerprint": "cd9caded528219d7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7b72e785cf7a777e", "level": "note", "message": {"text": "Unused endpoint: USE /api/exercise-weights"}, "properties": {"repobilityId": "96980fa1338e75ce", "scanner": "scanner-primary", "fingerprint": "7b72e785cf7a777e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-00fbee7010923880", "level": "note", "message": {"text": "Unused endpoint: USE /api/care-nudges-cron"}, "properties": {"repobilityId": "7b195250c61d6adb", "scanner": "scanner-primary", "fingerprint": "00fbee7010923880", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ba09eb3a80e4a45b", "level": "note", "message": {"text": "Unused endpoint: USE /api/events-cron"}, "properties": {"repobilityId": "952570439515f7eb", "scanner": "scanner-primary", "fingerprint": "ba09eb3a80e4a45b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-51c976774ce44b52", "level": "note", "message": {"text": "Unused endpoint: USE /api/retention-cron"}, "properties": {"repobilityId": "a64cff4592e81b08", "scanner": "scanner-primary", "fingerprint": "51c976774ce44b52", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-17fe6d70b64078f3", "level": "note", "message": {"text": "Unused endpoint: USE /api/events-cache-cron"}, "properties": {"repobilityId": "b6c0c8658d5edc8f", "scanner": "scanner-primary", "fingerprint": "17fe6d70b64078f3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c714fb0af5e1396a", "level": "note", "message": {"text": "Unused endpoint: USE /api/local-shops"}, "properties": {"repobilityId": "5c3e9b72f277cce8", "scanner": "scanner-primary", "fingerprint": "c714fb0af5e1396a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4abc11ab333e78df", "level": "note", "message": {"text": "Unused endpoint: USE /api/learning-images"}, "properties": {"repobilityId": "4850a37aaf5bac3a", "scanner": "scanner-primary", "fingerprint": "4abc11ab333e78df", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}