{"version": "2.1.0", "$schema": "https://json.schemastore.org/sarif-2.1.0.json", "runs": [{"tool": {"driver": {"name": "Repobility", "informationUri": "https://repobility.com", "rules": [{"id": "scanner-bead75b0f9233e05", "name": "No API endpoints detected", "shortDescription": {"text": "No API endpoints detected"}, "fullDescription": {"text": "The scanner did not find FastAPI/Flask/Express/NestJS/GraphQL/gRPC routes. If this repo exposes APIs, the framework may be unsupported."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "info", "confidence": 1.0}}, {"id": "scanner-152a72b23a7ee2ed", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-additional-exercises.ts:416", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-additional-exercises.ts:416"}, "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-9a42b13799086e7d", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-exercise-library-expansion.ts:846", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-exercise-library-expansion.ts:846"}, "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-4fc01e4070ac8e26", "name": "Stray `console.log` in TS/JS \u2014 prisma/seed.ts:7", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed.ts:7"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1960adcaa7edb509", "name": "Stray `console.log` in TS/JS \u2014 prisma/seed-progress.ts:593", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed-progress.ts:593"}, "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-351e9f99b94a165e", "name": "Stray `console.log` in TS/JS \u2014 prisma/seed-demo.ts:1443", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed-demo.ts:1443"}, "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-2de554032d0f27e7", "name": "Stray `console.log` in TS/JS \u2014 prisma/seed-dev-ammu.ts:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed-dev-ammu.ts:13"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-526fd80f01b89fd6", "name": "Stray `console.log` in TS/JS \u2014 prisma/seed-ammu-workouts.ts:865", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed-ammu-workouts.ts:865"}, "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-1f50f1e991905fc6", "name": "Stray `console.log` in TS/JS \u2014 prisma/seed-badges.ts:886", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed-badges.ts:886"}, "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-5ec022bf434eb5ed", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/workout/WorkoutHistoryList.tsx:170", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/workout/WorkoutHistoryList.tsx:170"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b276e1cf33cc3e4f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/workout/WorkoutLogger.tsx:1306", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/workout/WorkoutLogger.tsx:1306"}, "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-9068c3bef050be05", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/workout/MuscleGroupPicker.tsx:484", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/workout/MuscleGroupPicker.tsx:484"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-eadf95e88ed6f5a2", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/TopNav.tsx:130", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/TopNav.tsx:130"}, "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-e17284d0631bce51", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/layout/SplashScreen.tsx:114", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/layout/SplashScreen.tsx:114"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9083928281badf0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/charts/WorkoutProgressionPanel.tsx:278", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/charts/WorkoutProgressionPanel.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-59adf4418d210a99", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/exercises/ExerciseLibraryView.tsx:482", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/exercises/ExerciseLibraryView.tsx:482"}, "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-07d479e487bf83ff", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/breadcrumb.tsx:31", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/breadcrumb.tsx:31"}, "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-5b0da9eb6832debf", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/tv/TvPanel.tsx:155", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tv/TvPanel.tsx:155"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d4d0189329e9789c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/session/SessionHero.tsx:287", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/session/SessionHero.tsx:287"}, "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-9e18827373ff9ebe", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/calendar/WorkoutCalendarCard.tsx:358", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/calendar/WorkoutCalendarCard.tsx:358"}, "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-af4b3cb4514878b4", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/layout.tsx:80", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/layout.tsx:80"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bc0e194188a13ec9", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/notifications/diagnostic/route.ts:97", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/notifications/diagnostic/route.ts:97"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c1e46c43f1ac0949", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/client/page.tsx:491", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/client/page.tsx:491"}, "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-6b034050c1ee8c42", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/client/sessions/page.tsx:271", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/client/sessions/page.tsx:271"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1af429ceb06521f5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/client/session/[id]/page.tsx:460", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/client/session/[id]/page.tsx:460"}, "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-f62704e51e668089", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/page.tsx:650", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/page.tsx:650"}, "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-4d465e413f78354c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/settings/tv-devices/page.tsx:309", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/settings/tv-devices/page.tsx:309"}, "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-30c61b58f7fe6951", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/trainers/page.tsx:201", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/trainers/page.tsx:201"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dd6596721a25266a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/trainers/[id]/page.tsx:343", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/trainers/[id]/page.tsx:343"}, "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-5b9c52fdb498c341", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/analytics/page.tsx:441", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/analytics/page.tsx:441"}, "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-ff27825058171117", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/sessions/page.tsx:366", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/sessions/page.tsx:366"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8ba3a9234c86bd8a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/tv-control/page.tsx:459", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/tv-control/page.tsx:459"}, "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-e780fb5ebd59f0bb", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/shifts/page.tsx:730", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/shifts/page.tsx:730"}, "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-148a5a6cdc999ca4", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/clients/page.tsx:70", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/clients/page.tsx:70"}, "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-d1ec0af9c00b0afb", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/clients/[id]/page.tsx:741", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/clients/[id]/page.tsx:741"}, "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-5c1f5e42b29ecfda", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/scheduling/page.tsx:1595", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/scheduling/page.tsx:1595"}, "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-d3c894d7636a59cd", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/badges/page.tsx:534", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/badges/page.tsx:534"}, "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-30c56242dc19a9db", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/crossfit/page.tsx:735", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/crossfit/page.tsx:735"}, "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-38a70c72351fc7a4", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/leaderboards/page.tsx:456", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/leaderboards/page.tsx:456"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b5dece84ace8b8c1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/leaves/page.tsx:627", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/leaves/page.tsx:627"}, "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-87f3de9b4ce09009", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/trainer/page.tsx:384", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/trainer/page.tsx:384"}, "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-e430ef6e7453f035", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/trainer/sessions/[id]/page.tsx:229", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/trainer/sessions/[id]/page.tsx:229"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-836995855554f8de", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/trainer/clients/page.tsx:276", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/trainer/clients/page.tsx:276"}, "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-26c2b7db5887bf8d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/trainer/kickboxing/page.tsx:572", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/trainer/kickboxing/page.tsx:572"}, "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-5104cbcffbb63051", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/trainer/crossfit/page.tsx:578", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/trainer/crossfit/page.tsx:578"}, "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-5ea15fd56f3152ca", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/trainer/session/[id]/page.tsx:262", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/trainer/session/[id]/page.tsx:262"}, "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-25a5bf35adf7a07e", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/notifications.ts:34", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/notifications.ts:34"}, "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-8ca0bac9d76ac823", "name": "Stray `console.log` in TS/JS \u2014 src/lib/notifications.ts:36", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/notifications.ts:36"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0b2175c3fc126489", "name": "Stray `console.log` in TS/JS \u2014 src/lib/pusher-client.ts:28", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/pusher-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-9756ecb143ce2771", "name": "Stray `console.log` in TS/JS \u2014 src/lib/firebase-admin.ts:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/firebase-admin.ts:13"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-41b45e1687ea2aac", "name": "Stray `console.log` in TS/JS \u2014 src/lib/pusher.ts:119", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/pusher.ts:119"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c2c5edd7e79539a6", "name": "Stray `console.log` in TS/JS \u2014 src/hooks/useFcmToken.ts:15", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/hooks/useFcmToken.ts:15"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a9fa110708a1fcd4", "name": "Stray `console.log` in TS/JS \u2014 src/hooks/usePusherChannel.ts:33", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/hooks/usePusherChannel.ts:33"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-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-55b9a4e14b262806", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/layout/SplashScreen.tsx:114", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/layout/SplashScreen.tsx:114"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7203569ec239f820", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/layout.tsx:80", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/layout.tsx:80"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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-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-e58cf00b250afda9", "name": "Very large file: src/components/workout/WorkoutLogger.tsx (2684 lines)", "shortDescription": {"text": "Very large file: src/components/workout/WorkoutLogger.tsx (2684 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-e8fed2a1ab0d17e9", "name": "Very large file: src/app/(dashboard)/admin/clients/[id]/page.tsx (1826 lines)", "shortDescription": {"text": "Very large file: src/app/(dashboard)/admin/clients/[id]/page.tsx (1826 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-85916a8dc1779ff0", "name": "Very large file: src/app/(dashboard)/admin/scheduling/page.tsx (1876 lines)", "shortDescription": {"text": "Very large file: src/app/(dashboard)/admin/scheduling/page.tsx (1876 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea3b5e389d8c9c0f", "name": "Low test-to-source ratio", "shortDescription": {"text": "Low test-to-source ratio"}, "fullDescription": {"text": "53 tests / 359 src (ratio 0.15)."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 106 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 192 placeholder/mock markers across 45 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-ebbbcedd38f841cf", "name": "Commented-code block (5 lines) in tests/unit/workout-service.test.ts:155", "shortDescription": {"text": "Commented-code block (5 lines) in tests/unit/workout-service.test.ts:155"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6972470849a7c3c2", "name": "Commented-code block (8 lines) in tests/unit/workout-completion.test.ts:3", "shortDescription": {"text": "Commented-code block (8 lines) in tests/unit/workout-completion.test.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2ce0e5c8bb766462", "name": "Commented-code block (5 lines) in tests/unit/workout-shared-access.test.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in tests/unit/workout-shared-access.test.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-15099c2961e52568", "name": "Commented-code block (8 lines) in tests/unit/workout-save-payload.test.ts:14", "shortDescription": {"text": "Commented-code block (8 lines) in tests/unit/workout-save-payload.test.ts: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-4bbe0ac06075399b", "name": "Commented-code block (7 lines) in prisma/seed-ammu-workouts.ts:29", "shortDescription": {"text": "Commented-code block (7 lines) in prisma/seed-ammu-workouts.ts: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-5808c646e452bf77", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/trainer-availability-dialog.tsx:257", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/trainer-availability-dialog.tsx:257"}, "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-51cb2643865ceafd", "name": "Commented-code block (7 lines) in src/components/workout/WorkoutLogger.tsx:215", "shortDescription": {"text": "Commented-code block (7 lines) in src/components/workout/WorkoutLogger.tsx:215"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-36653652b72036ba", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/workout/WorkoutLogger.tsx:815", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/workout/WorkoutLogger.tsx:815"}, "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-664e54b20b822d82", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/workout/MuscleGroupPicker.tsx:180", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/workout/MuscleGroupPicker.tsx:180"}, "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-dec6ede8289efc27", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/reschedule/RescheduleReviewPage.tsx:339", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/reschedule/RescheduleReviewPage.tsx:339"}, "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-8b6123278c5aae02", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/exercises/ExerciseLibraryView.tsx:184", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/exercises/ExerciseLibraryView.tsx:184"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-48ad495efcc549d1", "name": "Commented-code block (5 lines) in src/components/tv/TvDashboard.tsx:328", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/tv/TvDashboard.tsx:328"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-87ced4a9875e49f4", "name": "Commented-code block (9 lines) in src/app/api/sessions/[id]/workouts/route.ts:9", "shortDescription": {"text": "Commented-code block (9 lines) in src/app/api/sessions/[id]/workouts/route.ts: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-9c38214b0c6a47ca", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/client/unavailability/page.tsx:92", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/client/unavailability/page.tsx:92"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6d18159629ce8d90", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/client/progress/page.tsx:259", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/client/progress/page.tsx:259"}, "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-76d4ad8b131f5faa", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/client/reschedule-requests/page.tsx:519", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/client/reschedule-requests/page.tsx:519"}, "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-f737b745b2913fe5", "name": "Commented-code block (5 lines) in src/app/(dashboard)/client/session/[id]/page.tsx:146", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/(dashboard)/client/session/[id]/page.tsx: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-f156edd5f9481586", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/client/session/[id]/page.tsx:124", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/client/session/[id]/page.tsx:124"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c75b1604fdc4f167", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/client/workouts/page.tsx:75", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/client/workouts/page.tsx:75"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-69611878c385a472", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/community/page.tsx:593", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/community/page.tsx:593"}, "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-e2da8bc25234f66d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/admin/page.tsx:208", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/admin/page.tsx:208"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b2131de2c9c4a5cc", "name": "Commented-code block (5 lines) in src/app/(dashboard)/admin/settings/tv-devices/page.tsx:32", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/(dashboard)/admin/settings/tv-devices/page.tsx: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-39161656a9fe1510", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/admin/settings/package-plans/page.tsx:135", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/admin/settings/package-plans/page.tsx:135"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b76cdd8dbfb35473", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/admin/trainers/[id]/page.tsx:170", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/admin/trainers/[id]/page.tsx:170"}, "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-a41f61b78b3caa9d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/admin/analytics/page.tsx:192", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/admin/analytics/page.tsx:192"}, "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-952828cb78d4e694", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/admin/audit-log/page.tsx:111", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/admin/audit-log/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-65b909a3ce0dd174", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/admin/sessions/page.tsx:162", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/admin/sessions/page.tsx:162"}, "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-1ffd2ebf65f2551b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/admin/tv-control/page.tsx:103", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/admin/tv-control/page.tsx:103"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1357c357b4caf232", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/admin/shifts/page.tsx:328", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/admin/shifts/page.tsx:328"}, "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-0d1e5c1dd113b3ff", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/admin/clients/page.tsx:175", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/admin/clients/page.tsx:175"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-472ad71d7a27d40a", "name": "Commented-code block (5 lines) in src/app/(dashboard)/admin/clients/[id]/page.tsx:1475", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/(dashboard)/admin/clients/[id]/page.tsx:1475"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b9369aa93787221e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/admin/scheduling/page.tsx:607", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/admin/scheduling/page.tsx:607"}, "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-c8373e5927712679", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/admin/kickboxing/page.tsx:127", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/admin/kickboxing/page.tsx:127"}, "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-092208e425e6aa55", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/admin/badges/page.tsx:162", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/admin/badges/page.tsx:162"}, "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-7a5190477ba8c0ee", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/admin/crossfit/page.tsx:168", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/admin/crossfit/page.tsx:168"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-51b5e7b614cdea65", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/trainer/page.tsx:148", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/trainer/page.tsx:148"}, "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-98b0a2bc815a494d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/trainer/schedule/page.tsx:214", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/trainer/schedule/page.tsx:214"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1f26766986d3be20", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/trainer/sessions/[id]/page.tsx:135", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/trainer/sessions/[id]/page.tsx:135"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6956304d6ea2f2c4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/trainer/clients/[id]/progress/page.tsx:250", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/trainer/clients/[id]/progress/page.tsx:250"}, "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-4c5fbfd5adb1916a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/trainer/kickboxing/page.tsx:296", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/trainer/kickboxing/page.tsx:296"}, "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-6643bcefc54f646c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/trainer/crossfit/page.tsx:302", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/trainer/crossfit/page.tsx:302"}, "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-a0a1b6205f0dcd69", "name": "Commented-code block (11 lines) in src/app/(dashboard)/trainer/session/[id]/page.tsx:82", "shortDescription": {"text": "Commented-code block (11 lines) in src/app/(dashboard)/trainer/session/[id]/page.tsx:82"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c028c0a21be16d74", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/trainer/session/[id]/page.tsx:312", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/trainer/session/[id]/page.tsx:312"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d795dc55eafb12bf", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/trainer/leaves/page.tsx:270", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/trainer/leaves/page.tsx:270"}, "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-11a9a2b1f18f04a2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(auth)/login/page.tsx:50", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(auth)/login/page.tsx:50"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6f0ded7566835597", "name": "Commented-code block (5 lines) in src/hooks/useKeyboardInset.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in src/hooks/useKeyboardInset.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-652c4480119f286f", "name": "Commented-code block (6 lines) in src/hooks/useRestTimer.ts:222", "shortDescription": {"text": "Commented-code block (6 lines) in src/hooks/useRestTimer.ts:222"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bd48de3b21bdf34b", "name": "Commented-code block (10 lines) in src/services/workout.service.ts:58", "shortDescription": {"text": "Commented-code block (10 lines) in src/services/workout.service.ts: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-b298108183ba291e", "name": "Commented-code block (5 lines) in src/services/progress.service.ts:623", "shortDescription": {"text": "Commented-code block (5 lines) in src/services/progress.service.ts:623"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/18950"}, "properties": {"repository": "sarath6622/sector7-trainer-buddy-v2", "repoUrl": "https://github.com/sarath6622/sector7-trainer-buddy-v2", "branch": "main"}, "results": [{"ruleId": "scanner-bead75b0f9233e05", "level": "none", "message": {"text": "No API endpoints detected"}, "properties": {"repobilityId": "0f8bb852027c38f8", "scanner": "scanner-primary", "fingerprint": "bead75b0f9233e05", "layer": "api", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-152a72b23a7ee2ed", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-additional-exercises.ts:416"}, "properties": {"repobilityId": "b7484e9d87b3a0ab", "scanner": "scanner-primary", "fingerprint": "152a72b23a7ee2ed", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9a42b13799086e7d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-exercise-library-expansion.ts:846"}, "properties": {"repobilityId": "c65009e1010ccfd4", "scanner": "scanner-primary", "fingerprint": "9a42b13799086e7d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4fc01e4070ac8e26", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed.ts:7"}, "properties": {"repobilityId": "f77d7e0fb34b08e2", "scanner": "scanner-primary", "fingerprint": "4fc01e4070ac8e26", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1960adcaa7edb509", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed-progress.ts:593"}, "properties": {"repobilityId": "d97b04480258bb34", "scanner": "scanner-primary", "fingerprint": "1960adcaa7edb509", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-351e9f99b94a165e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed-demo.ts:1443"}, "properties": {"repobilityId": "04408501143ae10b", "scanner": "scanner-primary", "fingerprint": "351e9f99b94a165e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2de554032d0f27e7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed-dev-ammu.ts:13"}, "properties": {"repobilityId": "205050db7ae42293", "scanner": "scanner-primary", "fingerprint": "2de554032d0f27e7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-526fd80f01b89fd6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed-ammu-workouts.ts:865"}, "properties": {"repobilityId": "4158368c2cda4e60", "scanner": "scanner-primary", "fingerprint": "526fd80f01b89fd6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1f50f1e991905fc6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed-badges.ts:886"}, "properties": {"repobilityId": "b4fc55f2823d105d", "scanner": "scanner-primary", "fingerprint": "1f50f1e991905fc6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5ec022bf434eb5ed", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/workout/WorkoutHistoryList.tsx:170"}, "properties": {"repobilityId": "da53e7a939df018d", "scanner": "scanner-primary", "fingerprint": "5ec022bf434eb5ed", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b276e1cf33cc3e4f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/workout/WorkoutLogger.tsx:1306"}, "properties": {"repobilityId": "274681a68d42b06d", "scanner": "scanner-primary", "fingerprint": "b276e1cf33cc3e4f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9068c3bef050be05", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/workout/MuscleGroupPicker.tsx:484"}, "properties": {"repobilityId": "120bff822cadfb00", "scanner": "scanner-primary", "fingerprint": "9068c3bef050be05", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-eadf95e88ed6f5a2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/TopNav.tsx:130"}, "properties": {"repobilityId": "bc50875ba53add50", "scanner": "scanner-primary", "fingerprint": "eadf95e88ed6f5a2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e17284d0631bce51", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/layout/SplashScreen.tsx:114"}, "properties": {"repobilityId": "0ee6f3c918586bb9", "scanner": "scanner-primary", "fingerprint": "e17284d0631bce51", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-b9083928281badf0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/charts/WorkoutProgressionPanel.tsx:278"}, "properties": {"repobilityId": "21fc4b52997fd1b4", "scanner": "scanner-primary", "fingerprint": "b9083928281badf0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-59adf4418d210a99", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/exercises/ExerciseLibraryView.tsx:482"}, "properties": {"repobilityId": "b7ba333a21f10d14", "scanner": "scanner-primary", "fingerprint": "59adf4418d210a99", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-07d479e487bf83ff", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/breadcrumb.tsx:31"}, "properties": {"repobilityId": "ef3feb59c129acf6", "scanner": "scanner-primary", "fingerprint": "07d479e487bf83ff", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5b0da9eb6832debf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tv/TvPanel.tsx:155"}, "properties": {"repobilityId": "3ad355c5fe7f6f4b", "scanner": "scanner-primary", "fingerprint": "5b0da9eb6832debf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d4d0189329e9789c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/session/SessionHero.tsx:287"}, "properties": {"repobilityId": "5a32d7e60405102e", "scanner": "scanner-primary", "fingerprint": "d4d0189329e9789c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9e18827373ff9ebe", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/calendar/WorkoutCalendarCard.tsx:358"}, "properties": {"repobilityId": "ab9d0163677e490f", "scanner": "scanner-primary", "fingerprint": "9e18827373ff9ebe", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-af4b3cb4514878b4", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/layout.tsx:80"}, "properties": {"repobilityId": "0d72350965068f5b", "scanner": "scanner-primary", "fingerprint": "af4b3cb4514878b4", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-bc0e194188a13ec9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/notifications/diagnostic/route.ts:97"}, "properties": {"repobilityId": "73bd21a6e53dad0f", "scanner": "scanner-primary", "fingerprint": "bc0e194188a13ec9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c1e46c43f1ac0949", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/client/page.tsx:491"}, "properties": {"repobilityId": "4db2c90b5d7e887c", "scanner": "scanner-primary", "fingerprint": "c1e46c43f1ac0949", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6b034050c1ee8c42", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/client/sessions/page.tsx:271"}, "properties": {"repobilityId": "9c47b286a537c0fe", "scanner": "scanner-primary", "fingerprint": "6b034050c1ee8c42", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1af429ceb06521f5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/client/session/[id]/page.tsx:460"}, "properties": {"repobilityId": "d3a14bee8f9c34ac", "scanner": "scanner-primary", "fingerprint": "1af429ceb06521f5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f62704e51e668089", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/page.tsx:650"}, "properties": {"repobilityId": "77f132678951e5d9", "scanner": "scanner-primary", "fingerprint": "f62704e51e668089", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4d465e413f78354c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/settings/tv-devices/page.tsx:309"}, "properties": {"repobilityId": "f6580358b9ee50ff", "scanner": "scanner-primary", "fingerprint": "4d465e413f78354c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-30c61b58f7fe6951", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/trainers/page.tsx:201"}, "properties": {"repobilityId": "ae613c502f59a093", "scanner": "scanner-primary", "fingerprint": "30c61b58f7fe6951", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dd6596721a25266a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/trainers/[id]/page.tsx:343"}, "properties": {"repobilityId": "da1bfe014ca417a1", "scanner": "scanner-primary", "fingerprint": "dd6596721a25266a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5b9c52fdb498c341", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/analytics/page.tsx:441"}, "properties": {"repobilityId": "9808be6f9df64cd5", "scanner": "scanner-primary", "fingerprint": "5b9c52fdb498c341", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ff27825058171117", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/sessions/page.tsx:366"}, "properties": {"repobilityId": "e9bcd61e1fb671eb", "scanner": "scanner-primary", "fingerprint": "ff27825058171117", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8ba3a9234c86bd8a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/tv-control/page.tsx:459"}, "properties": {"repobilityId": "2f54c78f561fe054", "scanner": "scanner-primary", "fingerprint": "8ba3a9234c86bd8a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e780fb5ebd59f0bb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/shifts/page.tsx:730"}, "properties": {"repobilityId": "5399afa02801e7d5", "scanner": "scanner-primary", "fingerprint": "e780fb5ebd59f0bb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-148a5a6cdc999ca4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/clients/page.tsx:70"}, "properties": {"repobilityId": "f501821ec507983c", "scanner": "scanner-primary", "fingerprint": "148a5a6cdc999ca4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d1ec0af9c00b0afb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/clients/[id]/page.tsx:741"}, "properties": {"repobilityId": "fc370df9938ea904", "scanner": "scanner-primary", "fingerprint": "d1ec0af9c00b0afb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5c1f5e42b29ecfda", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/scheduling/page.tsx:1595"}, "properties": {"repobilityId": "15c59c7ba2c1d640", "scanner": "scanner-primary", "fingerprint": "5c1f5e42b29ecfda", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d3c894d7636a59cd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/badges/page.tsx:534"}, "properties": {"repobilityId": "e8eca8872b424775", "scanner": "scanner-primary", "fingerprint": "d3c894d7636a59cd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-30c56242dc19a9db", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/crossfit/page.tsx:735"}, "properties": {"repobilityId": "41f7d3a591a99bb3", "scanner": "scanner-primary", "fingerprint": "30c56242dc19a9db", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-38a70c72351fc7a4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/leaderboards/page.tsx:456"}, "properties": {"repobilityId": "5fec60f597b11f03", "scanner": "scanner-primary", "fingerprint": "38a70c72351fc7a4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b5dece84ace8b8c1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/leaves/page.tsx:627"}, "properties": {"repobilityId": "6255e07096c34497", "scanner": "scanner-primary", "fingerprint": "b5dece84ace8b8c1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-87f3de9b4ce09009", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/trainer/page.tsx:384"}, "properties": {"repobilityId": "e402da42fc81b19a", "scanner": "scanner-primary", "fingerprint": "87f3de9b4ce09009", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e430ef6e7453f035", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/trainer/sessions/[id]/page.tsx:229"}, "properties": {"repobilityId": "3d7d5ece89c47121", "scanner": "scanner-primary", "fingerprint": "e430ef6e7453f035", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-836995855554f8de", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/trainer/clients/page.tsx:276"}, "properties": {"repobilityId": "b1c895643a553ed0", "scanner": "scanner-primary", "fingerprint": "836995855554f8de", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-26c2b7db5887bf8d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/trainer/kickboxing/page.tsx:572"}, "properties": {"repobilityId": "4687d6daa79db5d8", "scanner": "scanner-primary", "fingerprint": "26c2b7db5887bf8d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5104cbcffbb63051", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/trainer/crossfit/page.tsx:578"}, "properties": {"repobilityId": "639f90f1c2faf6c9", "scanner": "scanner-primary", "fingerprint": "5104cbcffbb63051", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5ea15fd56f3152ca", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/trainer/session/[id]/page.tsx:262"}, "properties": {"repobilityId": "d324d8932a0c96df", "scanner": "scanner-primary", "fingerprint": "5ea15fd56f3152ca", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-25a5bf35adf7a07e", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/notifications.ts:34"}, "properties": {"repobilityId": "c60c18eeab029e88", "scanner": "scanner-primary", "fingerprint": "25a5bf35adf7a07e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-8ca0bac9d76ac823", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/notifications.ts:36"}, "properties": {"repobilityId": "c611a15d414ae821", "scanner": "scanner-primary", "fingerprint": "8ca0bac9d76ac823", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0b2175c3fc126489", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/pusher-client.ts:28"}, "properties": {"repobilityId": "d85de169987188da", "scanner": "scanner-primary", "fingerprint": "0b2175c3fc126489", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9756ecb143ce2771", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/firebase-admin.ts:13"}, "properties": {"repobilityId": "5cb76fb394f2f323", "scanner": "scanner-primary", "fingerprint": "9756ecb143ce2771", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-41b45e1687ea2aac", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/pusher.ts:119"}, "properties": {"repobilityId": "aba13696072cc763", "scanner": "scanner-primary", "fingerprint": "41b45e1687ea2aac", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c2c5edd7e79539a6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/hooks/useFcmToken.ts:15"}, "properties": {"repobilityId": "8e58d85ddba38dc1", "scanner": "scanner-primary", "fingerprint": "c2c5edd7e79539a6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a9fa110708a1fcd4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/hooks/usePusherChannel.ts:33"}, "properties": {"repobilityId": "a26f4ccfc88c27ee", "scanner": "scanner-primary", "fingerprint": "a9fa110708a1fcd4", "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-55b9a4e14b262806", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/layout/SplashScreen.tsx:114"}, "properties": {"repobilityId": "61cc093c826c76f6", "scanner": "scanner-primary", "fingerprint": "55b9a4e14b262806", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/layout/SplashScreen.tsx"}, "region": {"startLine": 114}}}]}, {"ruleId": "scanner-7203569ec239f820", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/layout.tsx:80"}, "properties": {"repobilityId": "0bca654fa2052eb0", "scanner": "scanner-primary", "fingerprint": "7203569ec239f820", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/layout.tsx"}, "region": {"startLine": 80}}}]}, {"ruleId": "scanner-cb639d9a10a47b23", "level": "note", "message": {"text": "package.json defines install-time lifecycle scripts"}, "properties": {"repobilityId": "b86179956da3a4a8", "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-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-e58cf00b250afda9", "level": "note", "message": {"text": "Very large file: src/components/workout/WorkoutLogger.tsx (2684 lines)"}, "properties": {"repobilityId": "85030770311a198f", "scanner": "scanner-primary", "fingerprint": "e58cf00b250afda9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e8fed2a1ab0d17e9", "level": "note", "message": {"text": "Very large file: src/app/(dashboard)/admin/clients/[id]/page.tsx (1826 lines)"}, "properties": {"repobilityId": "cc52f3658370f908", "scanner": "scanner-primary", "fingerprint": "e8fed2a1ab0d17e9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-85916a8dc1779ff0", "level": "note", "message": {"text": "Very large file: src/app/(dashboard)/admin/scheduling/page.tsx (1876 lines)"}, "properties": {"repobilityId": "0d8fded9e7b1753f", "scanner": "scanner-primary", "fingerprint": "85916a8dc1779ff0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ea3b5e389d8c9c0f", "level": "note", "message": {"text": "Low test-to-source ratio"}, "properties": {"repobilityId": "ef7b2552cc00a375", "scanner": "scanner-primary", "fingerprint": "ea3b5e389d8c9c0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["tests"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "5a1d00d8bbdf0415", "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": "005f3ff056cc1d01", "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": "b44e2a4160acc2dd", "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": "fd3a59abbbbacb16", "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": "cda38e5f1fddbbf4", "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": "e145fef1c362cb02", "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": "9fede9314a320251", "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": "e58bc9b1cbb861ea", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-ebbbcedd38f841cf", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/unit/workout-service.test.ts:155"}, "properties": {"repobilityId": "f04710a5155a9dd7", "scanner": "scanner-primary", "fingerprint": "ebbbcedd38f841cf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6972470849a7c3c2", "level": "none", "message": {"text": "Commented-code block (8 lines) in tests/unit/workout-completion.test.ts:3"}, "properties": {"repobilityId": "ac35ca51d5826446", "scanner": "scanner-primary", "fingerprint": "6972470849a7c3c2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2ce0e5c8bb766462", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/unit/workout-shared-access.test.ts:3"}, "properties": {"repobilityId": "6b63aa6f77710675", "scanner": "scanner-primary", "fingerprint": "2ce0e5c8bb766462", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-15099c2961e52568", "level": "none", "message": {"text": "Commented-code block (8 lines) in tests/unit/workout-save-payload.test.ts:14"}, "properties": {"repobilityId": "f19938410f3817d3", "scanner": "scanner-primary", "fingerprint": "15099c2961e52568", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4bbe0ac06075399b", "level": "none", "message": {"text": "Commented-code block (7 lines) in prisma/seed-ammu-workouts.ts:29"}, "properties": {"repobilityId": "565a0157cba6bfda", "scanner": "scanner-primary", "fingerprint": "4bbe0ac06075399b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5808c646e452bf77", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/trainer-availability-dialog.tsx:257"}, "properties": {"repobilityId": "abfc6a2729cf377c", "scanner": "scanner-primary", "fingerprint": "5808c646e452bf77", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-51cb2643865ceafd", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/components/workout/WorkoutLogger.tsx:215"}, "properties": {"repobilityId": "666d397c91270cf1", "scanner": "scanner-primary", "fingerprint": "51cb2643865ceafd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-36653652b72036ba", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/workout/WorkoutLogger.tsx:815"}, "properties": {"repobilityId": "60c4f97ed274ef67", "scanner": "scanner-primary", "fingerprint": "36653652b72036ba", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-664e54b20b822d82", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/workout/MuscleGroupPicker.tsx:180"}, "properties": {"repobilityId": "2a8ce9d6095e81d6", "scanner": "scanner-primary", "fingerprint": "664e54b20b822d82", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-dec6ede8289efc27", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/reschedule/RescheduleReviewPage.tsx:339"}, "properties": {"repobilityId": "7154fed5c0b3c36f", "scanner": "scanner-primary", "fingerprint": "dec6ede8289efc27", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8b6123278c5aae02", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/exercises/ExerciseLibraryView.tsx:184"}, "properties": {"repobilityId": "2c34468c4bc3e16b", "scanner": "scanner-primary", "fingerprint": "8b6123278c5aae02", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-48ad495efcc549d1", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/tv/TvDashboard.tsx:328"}, "properties": {"repobilityId": "12b10adaf7b5250b", "scanner": "scanner-primary", "fingerprint": "48ad495efcc549d1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-87ced4a9875e49f4", "level": "none", "message": {"text": "Commented-code block (9 lines) in src/app/api/sessions/[id]/workouts/route.ts:9"}, "properties": {"repobilityId": "342bef35eb42d6d5", "scanner": "scanner-primary", "fingerprint": "87ced4a9875e49f4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9c38214b0c6a47ca", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/client/unavailability/page.tsx:92"}, "properties": {"repobilityId": "645ce9380df8a432", "scanner": "scanner-primary", "fingerprint": "9c38214b0c6a47ca", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6d18159629ce8d90", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/client/progress/page.tsx:259"}, "properties": {"repobilityId": "442eeb215b9d6736", "scanner": "scanner-primary", "fingerprint": "6d18159629ce8d90", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-76d4ad8b131f5faa", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/client/reschedule-requests/page.tsx:519"}, "properties": {"repobilityId": "28a796fb3cd8b6f7", "scanner": "scanner-primary", "fingerprint": "76d4ad8b131f5faa", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f737b745b2913fe5", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/(dashboard)/client/session/[id]/page.tsx:146"}, "properties": {"repobilityId": "05b99842843ed6d2", "scanner": "scanner-primary", "fingerprint": "f737b745b2913fe5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f156edd5f9481586", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/client/session/[id]/page.tsx:124"}, "properties": {"repobilityId": "b93630ae0758c780", "scanner": "scanner-primary", "fingerprint": "f156edd5f9481586", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c75b1604fdc4f167", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/client/workouts/page.tsx:75"}, "properties": {"repobilityId": "225d018309bdd7c9", "scanner": "scanner-primary", "fingerprint": "c75b1604fdc4f167", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-69611878c385a472", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/community/page.tsx:593"}, "properties": {"repobilityId": "97c2b45d07b051f4", "scanner": "scanner-primary", "fingerprint": "69611878c385a472", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e2da8bc25234f66d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/admin/page.tsx:208"}, "properties": {"repobilityId": "a4e8e90c36c52be4", "scanner": "scanner-primary", "fingerprint": "e2da8bc25234f66d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b2131de2c9c4a5cc", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/(dashboard)/admin/settings/tv-devices/page.tsx:32"}, "properties": {"repobilityId": "213ab34ea608464d", "scanner": "scanner-primary", "fingerprint": "b2131de2c9c4a5cc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-39161656a9fe1510", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/admin/settings/package-plans/page.tsx:135"}, "properties": {"repobilityId": "ee408026a385628e", "scanner": "scanner-primary", "fingerprint": "39161656a9fe1510", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b76cdd8dbfb35473", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/admin/trainers/[id]/page.tsx:170"}, "properties": {"repobilityId": "f38e0ad218cf532d", "scanner": "scanner-primary", "fingerprint": "b76cdd8dbfb35473", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a41f61b78b3caa9d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/admin/analytics/page.tsx:192"}, "properties": {"repobilityId": "b6da1438782dd30c", "scanner": "scanner-primary", "fingerprint": "a41f61b78b3caa9d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-952828cb78d4e694", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/admin/audit-log/page.tsx:111"}, "properties": {"repobilityId": "2f2ddee14095fee1", "scanner": "scanner-primary", "fingerprint": "952828cb78d4e694", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-65b909a3ce0dd174", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/admin/sessions/page.tsx:162"}, "properties": {"repobilityId": "906839945656ec95", "scanner": "scanner-primary", "fingerprint": "65b909a3ce0dd174", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1ffd2ebf65f2551b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/admin/tv-control/page.tsx:103"}, "properties": {"repobilityId": "311601e87b0e591b", "scanner": "scanner-primary", "fingerprint": "1ffd2ebf65f2551b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1357c357b4caf232", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/admin/shifts/page.tsx:328"}, "properties": {"repobilityId": "0d1886877ee22889", "scanner": "scanner-primary", "fingerprint": "1357c357b4caf232", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0d1e5c1dd113b3ff", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/admin/clients/page.tsx:175"}, "properties": {"repobilityId": "78050df4f36ea2e1", "scanner": "scanner-primary", "fingerprint": "0d1e5c1dd113b3ff", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-472ad71d7a27d40a", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/(dashboard)/admin/clients/[id]/page.tsx:1475"}, "properties": {"repobilityId": "60aaab8d339377f3", "scanner": "scanner-primary", "fingerprint": "472ad71d7a27d40a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b9369aa93787221e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/admin/scheduling/page.tsx:607"}, "properties": {"repobilityId": "25082b326bdff53c", "scanner": "scanner-primary", "fingerprint": "b9369aa93787221e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c8373e5927712679", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/admin/kickboxing/page.tsx:127"}, "properties": {"repobilityId": "f886d66cd0317b6c", "scanner": "scanner-primary", "fingerprint": "c8373e5927712679", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-092208e425e6aa55", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/admin/badges/page.tsx:162"}, "properties": {"repobilityId": "60cf70b2f11eb051", "scanner": "scanner-primary", "fingerprint": "092208e425e6aa55", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7a5190477ba8c0ee", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/admin/crossfit/page.tsx:168"}, "properties": {"repobilityId": "af27b35da777e167", "scanner": "scanner-primary", "fingerprint": "7a5190477ba8c0ee", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-51b5e7b614cdea65", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/trainer/page.tsx:148"}, "properties": {"repobilityId": "340194bd574bc440", "scanner": "scanner-primary", "fingerprint": "51b5e7b614cdea65", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-98b0a2bc815a494d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/trainer/schedule/page.tsx:214"}, "properties": {"repobilityId": "b222252c13acc601", "scanner": "scanner-primary", "fingerprint": "98b0a2bc815a494d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1f26766986d3be20", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/trainer/sessions/[id]/page.tsx:135"}, "properties": {"repobilityId": "d64a99069270b7f0", "scanner": "scanner-primary", "fingerprint": "1f26766986d3be20", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6956304d6ea2f2c4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/trainer/clients/[id]/progress/page.tsx:250"}, "properties": {"repobilityId": "75864aff97b13c29", "scanner": "scanner-primary", "fingerprint": "6956304d6ea2f2c4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4c5fbfd5adb1916a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/trainer/kickboxing/page.tsx:296"}, "properties": {"repobilityId": "122b12b62bdf94ae", "scanner": "scanner-primary", "fingerprint": "4c5fbfd5adb1916a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6643bcefc54f646c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/trainer/crossfit/page.tsx:302"}, "properties": {"repobilityId": "91785f3b1ce04461", "scanner": "scanner-primary", "fingerprint": "6643bcefc54f646c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a0a1b6205f0dcd69", "level": "none", "message": {"text": "Commented-code block (11 lines) in src/app/(dashboard)/trainer/session/[id]/page.tsx:82"}, "properties": {"repobilityId": "9994faba4be5fac1", "scanner": "scanner-primary", "fingerprint": "a0a1b6205f0dcd69", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c028c0a21be16d74", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/trainer/session/[id]/page.tsx:312"}, "properties": {"repobilityId": "99c7ce5fc8772044", "scanner": "scanner-primary", "fingerprint": "c028c0a21be16d74", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d795dc55eafb12bf", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/trainer/leaves/page.tsx:270"}, "properties": {"repobilityId": "55729cc2850a161e", "scanner": "scanner-primary", "fingerprint": "d795dc55eafb12bf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-11a9a2b1f18f04a2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(auth)/login/page.tsx:50"}, "properties": {"repobilityId": "613704a765bd470e", "scanner": "scanner-primary", "fingerprint": "11a9a2b1f18f04a2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6f0ded7566835597", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/hooks/useKeyboardInset.ts:5"}, "properties": {"repobilityId": "cb4ed12fa1d1635c", "scanner": "scanner-primary", "fingerprint": "6f0ded7566835597", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-652c4480119f286f", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/hooks/useRestTimer.ts:222"}, "properties": {"repobilityId": "eab91d4c0675b7fe", "scanner": "scanner-primary", "fingerprint": "652c4480119f286f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bd48de3b21bdf34b", "level": "none", "message": {"text": "Commented-code block (10 lines) in src/services/workout.service.ts:58"}, "properties": {"repobilityId": "1a53437b8848326d", "scanner": "scanner-primary", "fingerprint": "bd48de3b21bdf34b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b298108183ba291e", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/services/progress.service.ts:623"}, "properties": {"repobilityId": "0eb2490d3a9ce973", "scanner": "scanner-primary", "fingerprint": "b298108183ba291e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}]}]}