{"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-c613c1f2b2ed3ee3", "name": "Stray `console.log` in TS/JS \u2014 frontend/src/shared/api/client.ts:28", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/shared/api/client.ts: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-742631e8593ebd3a", "name": "Stray `console.log` in TS/JS \u2014 frontend/src/shared/ui/Toast.tsx:107", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/shared/ui/Toast.tsx:107"}, "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-ae6c98afc40eda90", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/dashboard/components/NextWorkout.tsx:19", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/dashboard/components/NextWorkout.tsx:19"}, "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-4749925597d609a8", "name": "\"active\" state uses light bg in a dark theme \u2014 frontend/src/features/progress/components/ExerciseProgressTab.tsx:379", "shortDescription": {"text": "\"active\" state uses light bg in a dark theme \u2014 frontend/src/features/progress/components/ExerciseProgressTab.tsx:379"}, "fullDescription": {"text": "A ternary like `active ? 'bg-white' : '...'` (or bg-gray-100/200) on a dark theme produces jarring white pills. Use a dark-emphasized active state instead \u2014 border + ring or slightly brighter dark bg. Example: `active ? 'bg-gray-800 border-gray-500 ring-1 ring-blue-500/30' : '\u2026'`.\n\nWhy: P-E in CHECKLIST.md \u2014 light bg in a dark theme is a class of regression.\nRule id: fq.active-light-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c82aea47ab17ee85", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/active-session/components/SessionHeader.tsx:5", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/active-session/components/SessionHeader.tsx:52"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a3e20f9d9b31a775", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/active-session/components/ExerciseCard.tsx:20", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/active-session/components/ExerciseCard.tsx:200"}, "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-037c1ac52ad10329", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/history/components/SessionCard.tsx:124", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/history/components/SessionCard.tsx:124"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2dfed54885cf3279", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/program-builder/components/WorkoutCard.tsx:99", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/program-builder/components/WorkoutCard.tsx:99"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5310acd2f4fb542b", "name": "Stray `console.log` in TS/JS \u2014 backend/seed.ts:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/seed.ts:11"}, "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-511a217074627cf3", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/import_legacy.ts:255", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/import_legacy.ts:255"}, "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-986342d9b64d1b50", "name": "Stray `console.log` in TS/JS \u2014 backend/src/index.ts:58", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/index.ts:58"}, "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-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-6372cebde0220094", "name": "No auth library detected", "shortDescription": {"text": "No auth library detected"}, "fullDescription": {"text": "The scanner did not find any standard auth library (JWT, OAuth, NextAuth, Auth0, etc.). The repo has auth/admin/session surface indicators, so auth may live in custom code, in a separate service, or be missing."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "7 test file(s) for 114 source file(s) (ratio 0.06). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 21 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 39 placeholder/mock markers across 13 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-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-80723261c19bd19d", "name": "Commented-code block (5 lines) in frontend/src/features/active-session/hooks/useExerciseNavigation.ts:158", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/features/active-session/hooks/useExerciseNavigation.ts: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-cde791ec7809cab0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/coach/lib/providers/openaiCompatible.ts:96", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/coach/lib/providers/openaiCompatible.ts:96"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-34869b84ac1ac5b2", "name": "Commented-code block (5 lines) in backend/src/types/associations.ts:7", "shortDescription": {"text": "Commented-code block (5 lines) in backend/src/types/associations.ts:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1b5a76780c3df9aa", "name": "1 env vars used in code but missing from .env.example", "shortDescription": {"text": "1 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `DEV`. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2863b597e745a918", "name": "Frontend route `/workout/:id` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/workout/:id` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dd7458ee96db5061", "name": "Unused endpoint: POST /workouts/reorder", "shortDescription": {"text": "Unused endpoint: POST /workouts/reorder"}, "fullDescription": {"text": "`frontend/src/features/program-builder/hooks/usePrograms.ts` declares `POST /workouts/reorder` 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-4756b4c4da7d2088", "name": "Unused endpoint: GET /api/health", "shortDescription": {"text": "Unused endpoint: GET /api/health"}, "fullDescription": {"text": "`backend/src/index.ts` declares `GET /api/health` 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-0df66f028c953913", "name": "Unused endpoint: USE /api/programs", "shortDescription": {"text": "Unused endpoint: USE /api/programs"}, "fullDescription": {"text": "`backend/src/index.ts` declares `USE /api/programs` 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-42ed648ed56fd858", "name": "Unused endpoint: USE /api/workouts", "shortDescription": {"text": "Unused endpoint: USE /api/workouts"}, "fullDescription": {"text": "`backend/src/index.ts` declares `USE /api/workouts` 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-907dc6417f954256", "name": "Unused endpoint: USE /api/exercises", "shortDescription": {"text": "Unused endpoint: USE /api/exercises"}, "fullDescription": {"text": "`backend/src/index.ts` declares `USE /api/exercises` 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-8636dd48e48d1da9", "name": "Unused endpoint: USE /api/sessions", "shortDescription": {"text": "Unused endpoint: USE /api/sessions"}, "fullDescription": {"text": "`backend/src/index.ts` declares `USE /api/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-ca5756175765b49d", "name": "Unused endpoint: GET /:id", "shortDescription": {"text": "Unused endpoint: GET /:id"}, "fullDescription": {"text": "`backend/src/routes/workouts.ts` declares `GET /:id` 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-7a009b1a56794f45", "name": "Unused endpoint: POST /", "shortDescription": {"text": "Unused endpoint: POST /"}, "fullDescription": {"text": "`backend/src/routes/workouts.ts` declares `POST /` 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-8d5b2b188d08ca82", "name": "Unused endpoint: PUT /:id", "shortDescription": {"text": "Unused endpoint: PUT /:id"}, "fullDescription": {"text": "`backend/src/routes/workouts.ts` declares `PUT /:id` 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-7a61c112b611f4bb", "name": "Unused endpoint: DELETE /:id", "shortDescription": {"text": "Unused endpoint: DELETE /:id"}, "fullDescription": {"text": "`backend/src/routes/workouts.ts` declares `DELETE /:id` 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-2bc61a2eb1cd4064", "name": "Unused endpoint: POST /:id/duplicate", "shortDescription": {"text": "Unused endpoint: POST /:id/duplicate"}, "fullDescription": {"text": "`backend/src/routes/workouts.ts` declares `POST /:id/duplicate` 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-8abe937e20321b60", "name": "Unused endpoint: POST /reorder", "shortDescription": {"text": "Unused endpoint: POST /reorder"}, "fullDescription": {"text": "`backend/src/routes/workouts.ts` declares `POST /reorder` 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-acb6875b3bfe2800", "name": "Unused endpoint: POST /:id/reorder-exercises", "shortDescription": {"text": "Unused endpoint: POST /:id/reorder-exercises"}, "fullDescription": {"text": "`backend/src/routes/workouts.ts` declares `POST /:id/reorder-exercises` 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-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`backend/src/routes/programs.ts` 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-51af254a9b02da8f", "name": "Unused endpoint: GET /:id/export", "shortDescription": {"text": "Unused endpoint: GET /:id/export"}, "fullDescription": {"text": "`backend/src/routes/programs.ts` declares `GET /:id/export` 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-be4cb5e3cabcce80", "name": "Unused endpoint: POST /import", "shortDescription": {"text": "Unused endpoint: POST /import"}, "fullDescription": {"text": "`backend/src/routes/programs.ts` declares `POST /import` 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-66e1399b85b1a72a", "name": "Unused endpoint: PUT /:id/set-active", "shortDescription": {"text": "Unused endpoint: PUT /:id/set-active"}, "fullDescription": {"text": "`backend/src/routes/programs.ts` declares `PUT /:id/set-active` 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-30dd5c1ce6f46edc", "name": "Unused endpoint: GET /history-by-name", "shortDescription": {"text": "Unused endpoint: GET /history-by-name"}, "fullDescription": {"text": "`backend/src/routes/exercises.ts` declares `GET /history-by-name` 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-ff644042ea9fe718", "name": "Unused endpoint: GET /all-sets-by-name", "shortDescription": {"text": "Unused endpoint: GET /all-sets-by-name"}, "fullDescription": {"text": "`backend/src/routes/exercises.ts` declares `GET /all-sets-by-name` 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-5293719d857b5a90", "name": "Unused endpoint: GET /suggestions", "shortDescription": {"text": "Unused endpoint: GET /suggestions"}, "fullDescription": {"text": "`backend/src/routes/exercises.ts` declares `GET /suggestions` 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-afc064028ae39ea9", "name": "Unused endpoint: GET /history", "shortDescription": {"text": "Unused endpoint: GET /history"}, "fullDescription": {"text": "`backend/src/routes/sessions.ts` declares `GET /history` 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-72eb8a13269a8eb3", "name": "Unused endpoint: GET /active", "shortDescription": {"text": "Unused endpoint: GET /active"}, "fullDescription": {"text": "`backend/src/routes/sessions.ts` declares `GET /active` 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-b066fd95f062efce", "name": "Unused endpoint: GET /export-csv", "shortDescription": {"text": "Unused endpoint: GET /export-csv"}, "fullDescription": {"text": "`backend/src/routes/sessions.ts` declares `GET /export-csv` 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-cd8dc4599ec52a08", "name": "Unused endpoint: GET /stats", "shortDescription": {"text": "Unused endpoint: GET /stats"}, "fullDescription": {"text": "`backend/src/routes/sessions.ts` declares `GET /stats` 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-6ff7e2fbd437add5", "name": "Unused endpoint: GET /:id/previous", "shortDescription": {"text": "Unused endpoint: GET /:id/previous"}, "fullDescription": {"text": "`backend/src/routes/sessions.ts` declares `GET /:id/previous` 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-a13a7e97aeacf55f", "name": "Unused endpoint: POST /start", "shortDescription": {"text": "Unused endpoint: POST /start"}, "fullDescription": {"text": "`backend/src/routes/sessions.ts` declares `POST /start` 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-d32450e2fe1552e8", "name": "Unused endpoint: POST /:id/sets", "shortDescription": {"text": "Unused endpoint: POST /:id/sets"}, "fullDescription": {"text": "`backend/src/routes/sessions.ts` declares `POST /:id/sets` 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-2b02a31bb174d38d", "name": "Unused endpoint: PUT /:id/sets/:setId", "shortDescription": {"text": "Unused endpoint: PUT /:id/sets/:setId"}, "fullDescription": {"text": "`backend/src/routes/sessions.ts` declares `PUT /:id/sets/:setId` 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-e6599e584244a381", "name": "Unused endpoint: PUT /:id/exercise-note", "shortDescription": {"text": "Unused endpoint: PUT /:id/exercise-note"}, "fullDescription": {"text": "`backend/src/routes/sessions.ts` declares `PUT /:id/exercise-note` 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-a005497d5a71980f", "name": "Unused endpoint: POST /:id/complete", "shortDescription": {"text": "Unused endpoint: POST /:id/complete"}, "fullDescription": {"text": "`backend/src/routes/sessions.ts` declares `POST /:id/complete` 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-f95f219c97504d55", "name": "Unused endpoint: DELETE /:id/sets/:setId", "shortDescription": {"text": "Unused endpoint: DELETE /:id/sets/:setId"}, "fullDescription": {"text": "`backend/src/routes/sessions.ts` declares `DELETE /:id/sets/:setId` 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/18035"}, "properties": {"repository": "RepoBean/workout-tracker", "repoUrl": "https://github.com/RepoBean/workout-tracker", "branch": "main"}, "results": [{"ruleId": "scanner-c613c1f2b2ed3ee3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/shared/api/client.ts:28"}, "properties": {"repobilityId": "ae5bf6c120186951", "scanner": "scanner-primary", "fingerprint": "c613c1f2b2ed3ee3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-742631e8593ebd3a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/shared/ui/Toast.tsx:107"}, "properties": {"repobilityId": "c35c59383fc93a8c", "scanner": "scanner-primary", "fingerprint": "742631e8593ebd3a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ae6c98afc40eda90", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/dashboard/components/NextWorkout.tsx:19"}, "properties": {"repobilityId": "eaf9abd5d0c35adf", "scanner": "scanner-primary", "fingerprint": "ae6c98afc40eda90", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4749925597d609a8", "level": "note", "message": {"text": "\"active\" state uses light bg in a dark theme \u2014 frontend/src/features/progress/components/ExerciseProgressTab.tsx:379"}, "properties": {"repobilityId": "8b6ea651a485f259", "scanner": "scanner-primary", "fingerprint": "4749925597d609a8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.active-light-bg"]}}, {"ruleId": "scanner-c82aea47ab17ee85", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/active-session/components/SessionHeader.tsx:52"}, "properties": {"repobilityId": "a33b06d62b3b9c15", "scanner": "scanner-primary", "fingerprint": "c82aea47ab17ee85", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a3e20f9d9b31a775", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/active-session/components/ExerciseCard.tsx:200"}, "properties": {"repobilityId": "a64e56e177eba0d7", "scanner": "scanner-primary", "fingerprint": "a3e20f9d9b31a775", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-037c1ac52ad10329", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/history/components/SessionCard.tsx:124"}, "properties": {"repobilityId": "56a1856290686e61", "scanner": "scanner-primary", "fingerprint": "037c1ac52ad10329", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2dfed54885cf3279", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/features/program-builder/components/WorkoutCard.tsx:99"}, "properties": {"repobilityId": "5669ab5f9ed020e2", "scanner": "scanner-primary", "fingerprint": "2dfed54885cf3279", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5310acd2f4fb542b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/seed.ts:11"}, "properties": {"repobilityId": "19d5a8a55811b675", "scanner": "scanner-primary", "fingerprint": "5310acd2f4fb542b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-511a217074627cf3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/import_legacy.ts:255"}, "properties": {"repobilityId": "4e29bbc29399902f", "scanner": "scanner-primary", "fingerprint": "511a217074627cf3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-986342d9b64d1b50", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/index.ts:58"}, "properties": {"repobilityId": "db2171a39601fa41", "scanner": "scanner-primary", "fingerprint": "986342d9b64d1b50", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"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-6372cebde0220094", "level": "warning", "message": {"text": "No auth library detected"}, "properties": {"repobilityId": "a5b6035a5bbf8054", "scanner": "scanner-primary", "fingerprint": "6372cebde0220094", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["coverage", "auth"]}}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "9df07bde1239d33e", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "847fe00f88af4cf2", "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": "7fbc04f1327b08d2", "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": "7e985fa086138472", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "f1f7606f9882a4c2", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "edff0f45f82b466f", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "85ee8dbafe1d8cc4", "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": "d4bc978171ae08d2", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-80723261c19bd19d", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/features/active-session/hooks/useExerciseNavigation.ts:158"}, "properties": {"repobilityId": "cdd993ff0bfc6346", "scanner": "scanner-primary", "fingerprint": "80723261c19bd19d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cde791ec7809cab0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/coach/lib/providers/openaiCompatible.ts:96"}, "properties": {"repobilityId": "545375957e3153c5", "scanner": "scanner-primary", "fingerprint": "cde791ec7809cab0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-34869b84ac1ac5b2", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/src/types/associations.ts:7"}, "properties": {"repobilityId": "1b9ded58b5fa7558", "scanner": "scanner-primary", "fingerprint": "34869b84ac1ac5b2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1b5a76780c3df9aa", "level": "none", "message": {"text": "1 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "d04379b337b44a15", "scanner": "scanner-primary", "fingerprint": "1b5a76780c3df9aa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-2863b597e745a918", "level": "warning", "message": {"text": "Frontend route `/workout/:id` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "d152ea804f1a71b4", "scanner": "scanner-primary", "fingerprint": "2863b597e745a918", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-dd7458ee96db5061", "level": "note", "message": {"text": "Unused endpoint: POST /workouts/reorder"}, "properties": {"repobilityId": "cc48f0595381f363", "scanner": "scanner-primary", "fingerprint": "dd7458ee96db5061", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4756b4c4da7d2088", "level": "note", "message": {"text": "Unused endpoint: GET /api/health"}, "properties": {"repobilityId": "ec6d36014b57104d", "scanner": "scanner-primary", "fingerprint": "4756b4c4da7d2088", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0df66f028c953913", "level": "note", "message": {"text": "Unused endpoint: USE /api/programs"}, "properties": {"repobilityId": "08b8b33f2d61e232", "scanner": "scanner-primary", "fingerprint": "0df66f028c953913", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-42ed648ed56fd858", "level": "note", "message": {"text": "Unused endpoint: USE /api/workouts"}, "properties": {"repobilityId": "42dab233b1c37379", "scanner": "scanner-primary", "fingerprint": "42ed648ed56fd858", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-907dc6417f954256", "level": "note", "message": {"text": "Unused endpoint: USE /api/exercises"}, "properties": {"repobilityId": "71bec490da210ad9", "scanner": "scanner-primary", "fingerprint": "907dc6417f954256", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8636dd48e48d1da9", "level": "note", "message": {"text": "Unused endpoint: USE /api/sessions"}, "properties": {"repobilityId": "538c18b5ad6a20e7", "scanner": "scanner-primary", "fingerprint": "8636dd48e48d1da9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ca5756175765b49d", "level": "note", "message": {"text": "Unused endpoint: GET /:id"}, "properties": {"repobilityId": "36ce6055f22c5a5c", "scanner": "scanner-primary", "fingerprint": "ca5756175765b49d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a009b1a56794f45", "level": "note", "message": {"text": "Unused endpoint: POST /"}, "properties": {"repobilityId": "ba6ae2f3f045abe3", "scanner": "scanner-primary", "fingerprint": "7a009b1a56794f45", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8d5b2b188d08ca82", "level": "note", "message": {"text": "Unused endpoint: PUT /:id"}, "properties": {"repobilityId": "8df5fd288e5a3de9", "scanner": "scanner-primary", "fingerprint": "8d5b2b188d08ca82", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a61c112b611f4bb", "level": "note", "message": {"text": "Unused endpoint: DELETE /:id"}, "properties": {"repobilityId": "d8813aced18861a9", "scanner": "scanner-primary", "fingerprint": "7a61c112b611f4bb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2bc61a2eb1cd4064", "level": "note", "message": {"text": "Unused endpoint: POST /:id/duplicate"}, "properties": {"repobilityId": "5cea3e06f4a7503e", "scanner": "scanner-primary", "fingerprint": "2bc61a2eb1cd4064", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8abe937e20321b60", "level": "note", "message": {"text": "Unused endpoint: POST /reorder"}, "properties": {"repobilityId": "3bf7926b4aa06a32", "scanner": "scanner-primary", "fingerprint": "8abe937e20321b60", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-acb6875b3bfe2800", "level": "note", "message": {"text": "Unused endpoint: POST /:id/reorder-exercises"}, "properties": {"repobilityId": "e76ccae7dc3e532d", "scanner": "scanner-primary", "fingerprint": "acb6875b3bfe2800", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "159557bf990a42f6", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-51af254a9b02da8f", "level": "note", "message": {"text": "Unused endpoint: GET /:id/export"}, "properties": {"repobilityId": "027fbc41b3b565a5", "scanner": "scanner-primary", "fingerprint": "51af254a9b02da8f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-be4cb5e3cabcce80", "level": "note", "message": {"text": "Unused endpoint: POST /import"}, "properties": {"repobilityId": "af93d492fbc99b72", "scanner": "scanner-primary", "fingerprint": "be4cb5e3cabcce80", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-66e1399b85b1a72a", "level": "note", "message": {"text": "Unused endpoint: PUT /:id/set-active"}, "properties": {"repobilityId": "05ceaf23920f1338", "scanner": "scanner-primary", "fingerprint": "66e1399b85b1a72a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-30dd5c1ce6f46edc", "level": "note", "message": {"text": "Unused endpoint: GET /history-by-name"}, "properties": {"repobilityId": "ca3e9a1be52231d7", "scanner": "scanner-primary", "fingerprint": "30dd5c1ce6f46edc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ff644042ea9fe718", "level": "note", "message": {"text": "Unused endpoint: GET /all-sets-by-name"}, "properties": {"repobilityId": "48784b764bc9eabb", "scanner": "scanner-primary", "fingerprint": "ff644042ea9fe718", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5293719d857b5a90", "level": "note", "message": {"text": "Unused endpoint: GET /suggestions"}, "properties": {"repobilityId": "76d688cea9c38dae", "scanner": "scanner-primary", "fingerprint": "5293719d857b5a90", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-afc064028ae39ea9", "level": "note", "message": {"text": "Unused endpoint: GET /history"}, "properties": {"repobilityId": "7512744e2dd17216", "scanner": "scanner-primary", "fingerprint": "afc064028ae39ea9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-72eb8a13269a8eb3", "level": "note", "message": {"text": "Unused endpoint: GET /active"}, "properties": {"repobilityId": "fea6123536fa145a", "scanner": "scanner-primary", "fingerprint": "72eb8a13269a8eb3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b066fd95f062efce", "level": "note", "message": {"text": "Unused endpoint: GET /export-csv"}, "properties": {"repobilityId": "c16b4f6e25163fe3", "scanner": "scanner-primary", "fingerprint": "b066fd95f062efce", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cd8dc4599ec52a08", "level": "note", "message": {"text": "Unused endpoint: GET /stats"}, "properties": {"repobilityId": "6ccc4844b40ebf49", "scanner": "scanner-primary", "fingerprint": "cd8dc4599ec52a08", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6ff7e2fbd437add5", "level": "note", "message": {"text": "Unused endpoint: GET /:id/previous"}, "properties": {"repobilityId": "48c52302380f7514", "scanner": "scanner-primary", "fingerprint": "6ff7e2fbd437add5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a13a7e97aeacf55f", "level": "note", "message": {"text": "Unused endpoint: POST /start"}, "properties": {"repobilityId": "970e6c17f0cd615d", "scanner": "scanner-primary", "fingerprint": "a13a7e97aeacf55f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d32450e2fe1552e8", "level": "note", "message": {"text": "Unused endpoint: POST /:id/sets"}, "properties": {"repobilityId": "4fe25a605c1d26cf", "scanner": "scanner-primary", "fingerprint": "d32450e2fe1552e8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2b02a31bb174d38d", "level": "note", "message": {"text": "Unused endpoint: PUT /:id/sets/:setId"}, "properties": {"repobilityId": "704cd2fa0cdad10d", "scanner": "scanner-primary", "fingerprint": "2b02a31bb174d38d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e6599e584244a381", "level": "note", "message": {"text": "Unused endpoint: PUT /:id/exercise-note"}, "properties": {"repobilityId": "2c7ab696571548df", "scanner": "scanner-primary", "fingerprint": "e6599e584244a381", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a005497d5a71980f", "level": "note", "message": {"text": "Unused endpoint: POST /:id/complete"}, "properties": {"repobilityId": "92f1bd7af942d5f5", "scanner": "scanner-primary", "fingerprint": "a005497d5a71980f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f95f219c97504d55", "level": "note", "message": {"text": "Unused endpoint: DELETE /:id/sets/:setId"}, "properties": {"repobilityId": "fbea623c59e5cff2", "scanner": "scanner-primary", "fingerprint": "f95f219c97504d55", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}