{"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-cb66dff00cb246cd", "name": "Stray `console.log` in TS/JS \u2014 plugins/vite-plugin-shipper-ids.ts:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 plugins/vite-plugin-shipper-ids.ts:32"}, "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-d70f8cc093558297", "name": "Icon-only button without accessible name \u2014 src/components/AdminBookingDetailsModal.tsx:229", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/AdminBookingDetailsModal.tsx:229"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d976b8f2e10e5aa4", "name": "Icon-only button without accessible name \u2014 src/components/AthleteAllocationEditor.tsx:409", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/AthleteAllocationEditor.tsx:409"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f686e2a8af448893", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/AthleteAllocationEditor.tsx:449", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/AthleteAllocationEditor.tsx:449"}, "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-ed4f1702d1712708", "name": "Icon-only button without accessible name \u2014 src/components/AdminManualBookingModal.tsx:252", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/AdminManualBookingModal.tsx:252"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-114d34f12a6635dc", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/AdminManualBookingModal.tsx:262", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/AdminManualBookingModal.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-3939f0e3b5fd2079", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/AdminBroadcast.tsx:247", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/AdminBroadcast.tsx:247"}, "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-de88e5e7627cdca0", "name": "Icon-only button without accessible name \u2014 src/components/LaneBlockModal.tsx:68", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/LaneBlockModal.tsx:68"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a3028798c01c5a95", "name": "Icon-only button without accessible name \u2014 src/components/FaultReportModal.tsx:70", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/FaultReportModal.tsx:70"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4ec8d27158bab5cb", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/AdminAnnouncements.tsx:444", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/AdminAnnouncements.tsx:444"}, "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-45f21962036ed756", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/MyAthletesCard.tsx:184", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/MyAthletesCard.tsx:184"}, "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-cd8ab8164b0dbf76", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ClosureManager.tsx:116", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ClosureManager.tsx:116"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b74fea1e89a635bb", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/BookingModal.tsx:852", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/BookingModal.tsx:852"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-79136462d2c05d8b", "name": "Icon-only button without accessible name \u2014 src/components/WaitlistModal.tsx:109", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/WaitlistModal.tsx:109"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-18c58ed5399baba9", "name": "Icon-only button without accessible name \u2014 src/components/RepeatBookingButton.tsx:136", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/RepeatBookingButton.tsx:136"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-feb06c1be33d961c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/WaitlistAdmin.tsx:163", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/WaitlistAdmin.tsx:163"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c5ae69a88d4a7681", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/CoverageTimeline.tsx:102", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/CoverageTimeline.tsx:102"}, "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-d686dfb8509bdc5d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/AdminBookingCalendar.tsx:389", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/AdminBookingCalendar.tsx:389"}, "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-0550ba2791d7aaa4", "name": "\"active\" state uses light bg in a dark theme \u2014 src/components/AdminBookingCalendar.tsx:364", "shortDescription": {"text": "\"active\" state uses light bg in a dark theme \u2014 src/components/AdminBookingCalendar.tsx:364"}, "fullDescription": {"text": "A ternary like `active ? 'bg-white' : '...'` (or bg-gray-100/200) on a dark theme produces jarring white pills. Use a dark-emphasized active state instead \u2014 border + ring or slightly brighter dark bg. Example: `active ? 'bg-gray-800 border-gray-500 ring-1 ring-blue-500/30' : '\u2026'`.\n\nWhy: P-E in CHECKLIST.md \u2014 light bg in a dark theme is a class of regression.\nRule id: fq.active-light-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a4c95b96ce14f42f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/StatementAdjustmentsManager.tsx:93", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/StatementAdjustmentsManager.tsx:93"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c1f80a996a1bdde1", "name": "Icon-only button without accessible name \u2014 src/components/ModifyBookingModal.tsx:246", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/ModifyBookingModal.tsx:246"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f0b20c75ce77d6a2", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/MyBookings.tsx:1054", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/MyBookings.tsx:1054"}, "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-8d602265d0ab1e9c", "name": "Icon-only button without accessible name \u2014 src/components/RescheduleModal.tsx:206", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/RescheduleModal.tsx:206"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-daf15b627fbcf94b", "name": "Icon-only button without accessible name \u2014 src/components/LaneOverrideModal.tsx:111", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/LaneOverrideModal.tsx:111"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c8ae5e0274f893b3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/AdminDiscountCodesTab.tsx:326", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/AdminDiscountCodesTab.tsx:326"}, "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-488445de2cf1337d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/BookingCalendar.tsx:644", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/BookingCalendar.tsx:644"}, "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-9e9c8b897897b5dd", "name": "\"active\" state uses light bg in a dark theme \u2014 src/components/BookingCalendar.tsx:441", "shortDescription": {"text": "\"active\" state uses light bg in a dark theme \u2014 src/components/BookingCalendar.tsx:441"}, "fullDescription": {"text": "A ternary like `active ? 'bg-white' : '...'` (or bg-gray-100/200) on a dark theme produces jarring white pills. Use a dark-emphasized active state instead \u2014 border + ring or slightly brighter dark bg. Example: `active ? 'bg-gray-800 border-gray-500 ring-1 ring-blue-500/30' : '\u2026'`.\n\nWhy: P-E in CHECKLIST.md \u2014 light bg in a dark theme is a class of regression.\nRule id: fq.active-light-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ce81889d5a9d271f", "name": "Icon-only button without accessible name \u2014 src/components/AuthModal.tsx:308", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/AuthModal.tsx:308"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1cdb4c43efc7076e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/analytics/FunnelTab.tsx:79", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/analytics/FunnelTab.tsx:79"}, "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-22b121f15aaf391c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/analytics/ServerActivityTab.tsx:138", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/analytics/ServerActivityTab.tsx:138"}, "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-1148dcf8261f7b2d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/analytics/OccupancyTab.tsx:222", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/analytics/OccupancyTab.tsx:222"}, "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-cdf74fd9a356c034", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/analytics/shared.tsx:329", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/analytics/shared.tsx:329"}, "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-8007cec21cbd6e22", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/auth-client.ts:9", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/auth-client.ts:9"}, "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-7a5005086b48fa57", "name": "Stray `console.log` in TS/JS \u2014 src/lib/auth-client.ts:256", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/auth-client.ts:256"}, "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-d896d29a352b5d15", "name": "Icon-only button without accessible name \u2014 src/routes/rev-ops-7k2p.tsx:627", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/routes/rev-ops-7k2p.tsx:627"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b4b1334984861981", "name": "`truncate` class without `title=` for hover reveal \u2014 src/routes/rev-ops-7k2p.tsx:1068", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/routes/rev-ops-7k2p.tsx:1068"}, "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-c2d997b2a2ef21fa", "name": "`truncate` class without `title=` for hover reveal \u2014 src/routes/__root.tsx:174", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/routes/__root.tsx:174"}, "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-10256bd5bcbdeb00", "name": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 convex/analyticsAdmin.ts:873", "shortDescription": {"text": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 convex/analyticsAdmin.ts:873"}, "fullDescription": {"text": "React Flow edge labels render with a white rectangle behind the text by default, which scatters bright boxes across a dark canvas. Either drop the label, or override `.react-flow__edge-textbg` and `.react-flow__edge-text` in your stylesheet.\n\nWhy: P-H in CHECKLIST.md \u2014 vendor edge labels bleed white through a dark canvas.\nRule id: fq.edge-label.no-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-de93a1b5a44118f5", "name": "Stray `console.log` in TS/JS \u2014 convex/googleCalendar.ts:303", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 convex/googleCalendar.ts:303"}, "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-626d2db901d6fa65", "name": "Stray `console.log` in TS/JS \u2014 convex/locks.ts:147", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 convex/locks.ts:147"}, "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-c821bc5ceb8f2611", "name": "Stray `console.log` in TS/JS \u2014 convex/emails.ts:233", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 convex/emails.ts:233"}, "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-0ed37589ee7e3a37", "name": "Stray `console.log` in TS/JS \u2014 convex/adminPassword.ts:44", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 convex/adminPassword.ts:44"}, "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-eec0781c9a2ef560", "name": "Stray `console.log` in TS/JS \u2014 convex/weeklySummary.ts:123", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 convex/weeklySummary.ts:123"}, "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-c8c67ea3cf403e01", "name": "Stray `console.log` in TS/JS \u2014 convex/push.ts:121", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 convex/push.ts:121"}, "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-ca6e0aaa70cd287e", "name": "Stray `console.log` in TS/JS \u2014 convex/testEmails.ts:171", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 convex/testEmails.ts:171"}, "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-6d548ed323d8035a", "name": "Insecure pattern 'local_storage_auth_token' in src/lib/user-store.ts:85", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in src/lib/user-store.ts:85"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9b3b268efe8b5d62", "name": "Possible secret in src/routes/rev-ops-7k2p.tsx", "shortDescription": {"text": "Possible secret in src/routes/rev-ops-7k2p.tsx"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-6e6b6cf7179ae56a", "name": "Very large file: src/components/BookingModal.tsx (968 lines)", "shortDescription": {"text": "Very large file: src/components/BookingModal.tsx (968 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-e84a4149542f8b6f", "name": "Very large file: src/components/MyBookings.tsx (1225 lines)", "shortDescription": {"text": "Very large file: src/components/MyBookings.tsx (1225 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-5f1d05839d66f9a6", "name": "Very large file: src/routes/rev-ops-7k2p.tsx (1856 lines)", "shortDescription": {"text": "Very large file: src/routes/rev-ops-7k2p.tsx (1856 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-253f75a6bac997d8", "name": "Very large file: convex/mutations.ts (4450 lines)", "shortDescription": {"text": "Very large file: convex/mutations.ts (4450 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-931dc1a0133ee5f0", "name": "Very large file: convex/betterAuth/_generated/component.ts (1869 lines)", "shortDescription": {"text": "Very large file: convex/betterAuth/_generated/component.ts (1869 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "1 test file(s) for 191 source file(s) (ratio 0.01). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 31 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 93 placeholder/mock markers across 25 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, tests. 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": "medium", "confidence": 1.0}}, {"id": "scanner-bd24d64268162d36", "name": "Commented-code block (6 lines) in vite.config.ts:20", "shortDescription": {"text": "Commented-code block (6 lines) in vite.config.ts:20"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9aa1021bc895cd85", "name": "Commented-code block (5 lines) in src/main.tsx:21", "shortDescription": {"text": "Commented-code block (5 lines) in src/main.tsx:21"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ec18b5de63b7f773", "name": "Commented-code block (5 lines) in src/hooks/useAuth.ts:34", "shortDescription": {"text": "Commented-code block (5 lines) in src/hooks/useAuth.ts:34"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-60d1e683b14a660a", "name": "Commented-code block (8 lines) in src/hooks/useBookingStore.ts:44", "shortDescription": {"text": "Commented-code block (8 lines) in src/hooks/useBookingStore.ts:44"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9077fbd12080421f", "name": "Commented-code block (7 lines) in src/components/InstallPrompt.tsx:4", "shortDescription": {"text": "Commented-code block (7 lines) in src/components/InstallPrompt.tsx:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ba60d77131a041c5", "name": "Commented-code block (5 lines) in src/components/AthleteAllocationEditor.tsx:36", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/AthleteAllocationEditor.tsx:36"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2f2092a4214e6a23", "name": "Commented-code block (5 lines) in src/components/LaneSegmentEditor.tsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/LaneSegmentEditor.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-baf56177739f2ad5", "name": "Commented-code block (7 lines) in src/components/AdminAnalyticsDashboard.tsx:1", "shortDescription": {"text": "Commented-code block (7 lines) in src/components/AdminAnalyticsDashboard.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e7238e8161f4d52f", "name": "Commented-code block (6 lines) in src/components/AdminAnnouncements.tsx:1", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/AdminAnnouncements.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ffc085d202376ccb", "name": "Commented-code block (7 lines) in src/components/EmailVerificationGate.tsx:1", "shortDescription": {"text": "Commented-code block (7 lines) in src/components/EmailVerificationGate.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4459d9ed83b71859", "name": "Commented-code block (6 lines) in src/components/BookingModal.tsx:391", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/BookingModal.tsx:391"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-84db6a4ca3fc530f", "name": "Commented-code block (5 lines) in src/components/RepeatBookingButton.tsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/RepeatBookingButton.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3bef721d7e69c5f1", "name": "Commented-code block (5 lines) in src/components/CoverageTimeline.tsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/CoverageTimeline.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1e2c3acdeac76782", "name": "Commented-code block (6 lines) in src/components/MyBookings.tsx:305", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/MyBookings.tsx:305"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f28ea5a024a11e9c", "name": "Commented-code block (6 lines) in src/components/LaneOverrideModal.tsx:1", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/LaneOverrideModal.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-72ba0d694bf35b3e", "name": "Commented-code block (5 lines) in src/components/laneDisplay.tsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/laneDisplay.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-07d6bc034d742dfb", "name": "Commented-code block (6 lines) in src/components/BookingCalendar.tsx:220", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/BookingCalendar.tsx:220"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0b411661cdb462b8", "name": "Commented-code block (6 lines) in src/components/AuthModal.tsx:227", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/AuthModal.tsx:227"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-922ea6595397db6e", "name": "Commented-code block (5 lines) in src/components/AnnouncementHost.tsx:6", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/AnnouncementHost.tsx:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-628b9f8c77454e82", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/analytics/MapTab.tsx:52", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/analytics/MapTab.tsx:52"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e562cbbca7cf81e3", "name": "Commented-code block (5 lines) in src/components/analytics/RevenueTab.tsx:159", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/analytics/RevenueTab.tsx:159"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7ea37002544d2428", "name": "Commented-code block (6 lines) in src/components/analytics/OverviewTab.tsx:1", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/analytics/OverviewTab.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-873770daedbd7104", "name": "Commented-code block (5 lines) in src/components/analytics/ServerActivityTab.tsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/analytics/ServerActivityTab.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5534fe246fe31dc2", "name": "Commented-code block (7 lines) in src/components/analytics/shared.tsx:87", "shortDescription": {"text": "Commented-code block (7 lines) in src/components/analytics/shared.tsx:87"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2f5f44880b479427", "name": "Commented-code block (5 lines) in src/lib/phone.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/phone.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-979691a7f76a13ea", "name": "Commented-code block (7 lines) in src/lib/auth-client.ts:13", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/auth-client.ts:13"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7de190e9acdab1db", "name": "Commented-code block (5 lines) in src/lib/booking-data.ts:110", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/booking-data.ts:110"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1572c94bb04698b9", "name": "Commented-code block (9 lines) in src/lib/lanes.ts:1", "shortDescription": {"text": "Commented-code block (9 lines) in src/lib/lanes.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-632f973d14fb5396", "name": "Commented-code block (7 lines) in src/lib/errors.ts:3", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/errors.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-d45cac8e9dda47f9", "name": "Commented-code block (5 lines) in src/lib/wa-postcodes.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/wa-postcodes.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-405fdc8b2738ddf9", "name": "Commented-code block (6 lines) in src/lib/coverage.ts:68", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/coverage.ts:68"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e59d0b08a3631619", "name": "Commented-code block (8 lines) in src/routes/rev-ops-7k2p.tsx:1407", "shortDescription": {"text": "Commented-code block (8 lines) in src/routes/rev-ops-7k2p.tsx:1407"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-00ac0185ac989b38", "name": "Commented-code block (6 lines) in convex/analytics.ts:23", "shortDescription": {"text": "Commented-code block (6 lines) in convex/analytics.ts:23"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a71535a1e6e54369", "name": "Commented-code block (8 lines) in convex/schema.ts:33", "shortDescription": {"text": "Commented-code block (8 lines) in convex/schema.ts:33"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9c44a86f7fa2b016", "name": "Commented-code block (6 lines) in convex/convex.config.ts:2", "shortDescription": {"text": "Commented-code block (6 lines) in convex/convex.config.ts:2"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0e23a5f401c6ead0", "name": "Commented-code block (7 lines) in convex/waitlist.ts:179", "shortDescription": {"text": "Commented-code block (7 lines) in convex/waitlist.ts:179"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-29b1ae01138d1c84", "name": "Commented-code block (6 lines) in convex/analyticsAdmin.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in convex/analyticsAdmin.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-16322010f59b6442", "name": "Legacy-named symbol `formattedOld` in convex/mutations.ts:352", "shortDescription": {"text": "Legacy-named symbol `formattedOld` in convex/mutations.ts:352"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b07cd91c1369c449", "name": "Commented-code block (9 lines) in convex/mutations.ts:101", "shortDescription": {"text": "Commented-code block (9 lines) in convex/mutations.ts:101"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f36cfbf775cabf88", "name": "Commented-code block (7 lines) in convex/auth.ts:39", "shortDescription": {"text": "Commented-code block (7 lines) in convex/auth.ts:39"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4e6d00d4eb25a944", "name": "Commented-code block (5 lines) in convex/statements.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in convex/statements.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-2263444aed48a419", "name": "Commented-code block (5 lines) in convex/pushNotifications.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in convex/pushNotifications.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f3053a84edb6f957", "name": "`fetch()` without try/.catch or AbortSignal \u2014 convex/googleCalendar.ts:98", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 convex/googleCalendar.ts:98"}, "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-24c4f769ac7273b3", "name": "Commented-code block (5 lines) in convex/serverActivity.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in convex/serverActivity.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f2d6f558ceae9e36", "name": "Commented-code block (10 lines) in convex/webhooks.ts:37", "shortDescription": {"text": "Commented-code block (10 lines) in convex/webhooks.ts:37"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fe9cb7cdb1d42d12", "name": "Commented-code block (5 lines) in convex/emails.ts:32", "shortDescription": {"text": "Commented-code block (5 lines) in convex/emails.ts: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-c9734eb9b7b6cade", "name": "Commented-code block (5 lines) in convex/seedDeanHolder.ts:9", "shortDescription": {"text": "Commented-code block (5 lines) in convex/seedDeanHolder.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-87f85ccaba4ba997", "name": "Commented-code block (5 lines) in convex/laneBlocks.ts:38", "shortDescription": {"text": "Commented-code block (5 lines) in convex/laneBlocks.ts:38"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-10355da928627870", "name": "Commented-code block (5 lines) in convex/analyticsSnapshot.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in convex/analyticsSnapshot.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-25cce4b411ece1f4", "name": "Commented-code block (6 lines) in convex/queries.ts:284", "shortDescription": {"text": "Commented-code block (6 lines) in convex/queries.ts:284"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a04c236619f73bb3", "name": "Commented-code block (5 lines) in convex/reminderQueries.ts:92", "shortDescription": {"text": "Commented-code block (5 lines) in convex/reminderQueries.ts:92"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-991b0a8c097b6cf7", "name": "Commented-code block (5 lines) in convex/push.ts:45", "shortDescription": {"text": "Commented-code block (5 lines) in convex/push.ts:45"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dae0d8499d20764a", "name": "Commented-code block (6 lines) in convex/mates.ts:8", "shortDescription": {"text": "Commented-code block (6 lines) in convex/mates.ts:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8cb52c3c53179d20", "name": "Commented-code block (8 lines) in convex/slotHolds.ts:20", "shortDescription": {"text": "Commented-code block (8 lines) in convex/slotHolds.ts:20"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-11c3ee19f773fd9f", "name": "Commented-code block (10 lines) in convex/athletes.ts:230", "shortDescription": {"text": "Commented-code block (10 lines) in convex/athletes.ts:230"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-22db449fc07835c6", "name": "Commented-code block (9 lines) in convex/http.ts:34", "shortDescription": {"text": "Commented-code block (9 lines) in convex/http.ts:34"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7a9c0d6cc3ac422e", "name": "Commented-code block (6 lines) in convex/announcements.ts:11", "shortDescription": {"text": "Commented-code block (6 lines) in convex/announcements.ts:11"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-446c45a34fc9c564", "name": "Commented-code block (6 lines) in convex/analyticsUsage.ts:187", "shortDescription": {"text": "Commented-code block (6 lines) in convex/analyticsUsage.ts:187"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-36f0e96e5cda29e1", "name": "Commented-code block (5 lines) in convex/testEmails.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in convex/testEmails.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bc8b48b4d12715de", "name": "Commented-code block (5 lines) in convex/broadcast.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in convex/broadcast.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-3e14bd5be9cb216f", "name": "Commented-code block (5 lines) in convex/digestAction.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in convex/digestAction.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d108fdafe26392cd", "name": "Commented-code block (5 lines) in convex/lib/email.ts:536", "shortDescription": {"text": "Commented-code block (5 lines) in convex/lib/email.ts:536"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-11027811adfbe759", "name": "Commented-code block (7 lines) in convex/lib/bookingWindow.ts:8", "shortDescription": {"text": "Commented-code block (7 lines) in convex/lib/bookingWindow.ts:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-73c6f0ee3e7e2d52", "name": "Commented-code block (6 lines) in convex/lib/pricing.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in convex/lib/pricing.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-32f3d6f34896b32d", "name": "Commented-code block (8 lines) in convex/lib/lanes.ts:1", "shortDescription": {"text": "Commented-code block (8 lines) in convex/lib/lanes.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8d71f2f586d0ecbd", "name": "Commented-code block (5 lines) in convex/lib/priceDefaults.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in convex/lib/priceDefaults.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-56ddac46c633942c", "name": "Commented-code block (5 lines) in convex/lib/waPostcodes.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in convex/lib/waPostcodes.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-141c013aecb0c29f", "name": "Commented-code block (7 lines) in convex/lib/slotHolds.ts:14", "shortDescription": {"text": "Commented-code block (7 lines) in convex/lib/slotHolds.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-8e2b9792f58f45db", "name": "Commented-code block (6 lines) in convex/lib/identity.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in convex/lib/identity.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-f480fd551079c9c6", "name": "Commented-code block (6 lines) in convex/lib/unsubscribe.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in convex/lib/unsubscribe.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/23906"}, "properties": {"repository": "adminrevo37/Krickora1", "repoUrl": "https://github.com/adminrevo37/Krickora1", "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-cb66dff00cb246cd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 plugins/vite-plugin-shipper-ids.ts:32"}, "properties": {"repobilityId": "1b81dc76dc2eb4e4", "scanner": "scanner-primary", "fingerprint": "cb66dff00cb246cd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d70f8cc093558297", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/AdminBookingDetailsModal.tsx:229"}, "properties": {"repobilityId": "6f69c219485f4dbe", "scanner": "scanner-primary", "fingerprint": "d70f8cc093558297", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-d976b8f2e10e5aa4", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/AthleteAllocationEditor.tsx:409"}, "properties": {"repobilityId": "9334ac34af530b1f", "scanner": "scanner-primary", "fingerprint": "d976b8f2e10e5aa4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-f686e2a8af448893", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/AthleteAllocationEditor.tsx:449"}, "properties": {"repobilityId": "2d499b0a2f92f481", "scanner": "scanner-primary", "fingerprint": "f686e2a8af448893", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ed4f1702d1712708", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/AdminManualBookingModal.tsx:252"}, "properties": {"repobilityId": "6c3415cca23465f7", "scanner": "scanner-primary", "fingerprint": "ed4f1702d1712708", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-114d34f12a6635dc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/AdminManualBookingModal.tsx:262"}, "properties": {"repobilityId": "ab26b19132b00cff", "scanner": "scanner-primary", "fingerprint": "114d34f12a6635dc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3939f0e3b5fd2079", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/AdminBroadcast.tsx:247"}, "properties": {"repobilityId": "11e4be08701850b4", "scanner": "scanner-primary", "fingerprint": "3939f0e3b5fd2079", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-de88e5e7627cdca0", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/LaneBlockModal.tsx:68"}, "properties": {"repobilityId": "4780bb9989f50a4d", "scanner": "scanner-primary", "fingerprint": "de88e5e7627cdca0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-a3028798c01c5a95", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/FaultReportModal.tsx:70"}, "properties": {"repobilityId": "ec31915b73f76b74", "scanner": "scanner-primary", "fingerprint": "a3028798c01c5a95", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-4ec8d27158bab5cb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/AdminAnnouncements.tsx:444"}, "properties": {"repobilityId": "3f4dd503718be054", "scanner": "scanner-primary", "fingerprint": "4ec8d27158bab5cb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-45f21962036ed756", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/MyAthletesCard.tsx:184"}, "properties": {"repobilityId": "31ea3ac9614f22bb", "scanner": "scanner-primary", "fingerprint": "45f21962036ed756", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cd8ab8164b0dbf76", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ClosureManager.tsx:116"}, "properties": {"repobilityId": "5257bd47b98fb6cd", "scanner": "scanner-primary", "fingerprint": "cd8ab8164b0dbf76", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b74fea1e89a635bb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/BookingModal.tsx:852"}, "properties": {"repobilityId": "627352f99bbc61de", "scanner": "scanner-primary", "fingerprint": "b74fea1e89a635bb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-79136462d2c05d8b", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/WaitlistModal.tsx:109"}, "properties": {"repobilityId": "0eb06bd39d4c9527", "scanner": "scanner-primary", "fingerprint": "79136462d2c05d8b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-18c58ed5399baba9", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/RepeatBookingButton.tsx:136"}, "properties": {"repobilityId": "3584916087afaf99", "scanner": "scanner-primary", "fingerprint": "18c58ed5399baba9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-feb06c1be33d961c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/WaitlistAdmin.tsx:163"}, "properties": {"repobilityId": "18570d5dfca27cec", "scanner": "scanner-primary", "fingerprint": "feb06c1be33d961c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c5ae69a88d4a7681", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/CoverageTimeline.tsx:102"}, "properties": {"repobilityId": "e0693f8803b618e6", "scanner": "scanner-primary", "fingerprint": "c5ae69a88d4a7681", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d686dfb8509bdc5d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/AdminBookingCalendar.tsx:389"}, "properties": {"repobilityId": "35ba341f9870827d", "scanner": "scanner-primary", "fingerprint": "d686dfb8509bdc5d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0550ba2791d7aaa4", "level": "note", "message": {"text": "\"active\" state uses light bg in a dark theme \u2014 src/components/AdminBookingCalendar.tsx:364"}, "properties": {"repobilityId": "e94c2867a8cdab01", "scanner": "scanner-primary", "fingerprint": "0550ba2791d7aaa4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.active-light-bg"]}}, {"ruleId": "scanner-a4c95b96ce14f42f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/StatementAdjustmentsManager.tsx:93"}, "properties": {"repobilityId": "1109dce9398a007d", "scanner": "scanner-primary", "fingerprint": "a4c95b96ce14f42f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c1f80a996a1bdde1", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/ModifyBookingModal.tsx:246"}, "properties": {"repobilityId": "cf7f441449c2fb32", "scanner": "scanner-primary", "fingerprint": "c1f80a996a1bdde1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-f0b20c75ce77d6a2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/MyBookings.tsx:1054"}, "properties": {"repobilityId": "c805d62d1601f542", "scanner": "scanner-primary", "fingerprint": "f0b20c75ce77d6a2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8d602265d0ab1e9c", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/RescheduleModal.tsx:206"}, "properties": {"repobilityId": "a5f48b44e0294ae0", "scanner": "scanner-primary", "fingerprint": "8d602265d0ab1e9c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-daf15b627fbcf94b", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/LaneOverrideModal.tsx:111"}, "properties": {"repobilityId": "0dda28fde929539c", "scanner": "scanner-primary", "fingerprint": "daf15b627fbcf94b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-c8ae5e0274f893b3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/AdminDiscountCodesTab.tsx:326"}, "properties": {"repobilityId": "36f56beef6dfaca4", "scanner": "scanner-primary", "fingerprint": "c8ae5e0274f893b3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-488445de2cf1337d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/BookingCalendar.tsx:644"}, "properties": {"repobilityId": "09d8091425ffec1e", "scanner": "scanner-primary", "fingerprint": "488445de2cf1337d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9e9c8b897897b5dd", "level": "note", "message": {"text": "\"active\" state uses light bg in a dark theme \u2014 src/components/BookingCalendar.tsx:441"}, "properties": {"repobilityId": "8f3d77ffdcc14521", "scanner": "scanner-primary", "fingerprint": "9e9c8b897897b5dd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.active-light-bg"]}}, {"ruleId": "scanner-ce81889d5a9d271f", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/AuthModal.tsx:308"}, "properties": {"repobilityId": "3ae98a919befee89", "scanner": "scanner-primary", "fingerprint": "ce81889d5a9d271f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-1cdb4c43efc7076e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/analytics/FunnelTab.tsx:79"}, "properties": {"repobilityId": "b08c10bafa18a004", "scanner": "scanner-primary", "fingerprint": "1cdb4c43efc7076e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-22b121f15aaf391c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/analytics/ServerActivityTab.tsx:138"}, "properties": {"repobilityId": "84e994bf79e154fa", "scanner": "scanner-primary", "fingerprint": "22b121f15aaf391c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1148dcf8261f7b2d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/analytics/OccupancyTab.tsx:222"}, "properties": {"repobilityId": "c1cf4487afccd69d", "scanner": "scanner-primary", "fingerprint": "1148dcf8261f7b2d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cdf74fd9a356c034", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/analytics/shared.tsx:329"}, "properties": {"repobilityId": "adcbebcb74c62ff0", "scanner": "scanner-primary", "fingerprint": "cdf74fd9a356c034", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8007cec21cbd6e22", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/auth-client.ts:9"}, "properties": {"repobilityId": "76cec8295aff30d5", "scanner": "scanner-primary", "fingerprint": "8007cec21cbd6e22", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-7a5005086b48fa57", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/auth-client.ts:256"}, "properties": {"repobilityId": "358e4a771d1b071e", "scanner": "scanner-primary", "fingerprint": "7a5005086b48fa57", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d896d29a352b5d15", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/routes/rev-ops-7k2p.tsx:627"}, "properties": {"repobilityId": "b18aac659654fd51", "scanner": "scanner-primary", "fingerprint": "d896d29a352b5d15", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-b4b1334984861981", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/routes/rev-ops-7k2p.tsx:1068"}, "properties": {"repobilityId": "0744a44eb27e7bf7", "scanner": "scanner-primary", "fingerprint": "b4b1334984861981", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c2d997b2a2ef21fa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/routes/__root.tsx:174"}, "properties": {"repobilityId": "41aef4570fc4486b", "scanner": "scanner-primary", "fingerprint": "c2d997b2a2ef21fa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-10256bd5bcbdeb00", "level": "note", "message": {"text": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 convex/analyticsAdmin.ts:873"}, "properties": {"repobilityId": "2470d4f3f5058d0a", "scanner": "scanner-primary", "fingerprint": "10256bd5bcbdeb00", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.edge-label.no-bg"]}}, {"ruleId": "scanner-de93a1b5a44118f5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 convex/googleCalendar.ts:303"}, "properties": {"repobilityId": "d2c1a4aa97e70a6b", "scanner": "scanner-primary", "fingerprint": "de93a1b5a44118f5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-626d2db901d6fa65", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 convex/locks.ts:147"}, "properties": {"repobilityId": "f07a06b3a9a7211a", "scanner": "scanner-primary", "fingerprint": "626d2db901d6fa65", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c821bc5ceb8f2611", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 convex/emails.ts:233"}, "properties": {"repobilityId": "81cd9ccdb98b2e1e", "scanner": "scanner-primary", "fingerprint": "c821bc5ceb8f2611", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0ed37589ee7e3a37", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 convex/adminPassword.ts:44"}, "properties": {"repobilityId": "c1fd2b3ab13a2e17", "scanner": "scanner-primary", "fingerprint": "0ed37589ee7e3a37", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-eec0781c9a2ef560", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 convex/weeklySummary.ts:123"}, "properties": {"repobilityId": "b2d4f65302692835", "scanner": "scanner-primary", "fingerprint": "eec0781c9a2ef560", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c8c67ea3cf403e01", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 convex/push.ts:121"}, "properties": {"repobilityId": "9488c9e1d788e486", "scanner": "scanner-primary", "fingerprint": "c8c67ea3cf403e01", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ca6e0aaa70cd287e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 convex/testEmails.ts:171"}, "properties": {"repobilityId": "7da9f2f013a0b063", "scanner": "scanner-primary", "fingerprint": "ca6e0aaa70cd287e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6d548ed323d8035a", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in src/lib/user-store.ts:85"}, "properties": {"repobilityId": "812b1588a20bcf76", "scanner": "scanner-primary", "fingerprint": "6d548ed323d8035a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/user-store.ts"}, "region": {"startLine": 85}}}]}, {"ruleId": "scanner-9b3b268efe8b5d62", "level": "error", "message": {"text": "Possible secret in src/routes/rev-ops-7k2p.tsx"}, "properties": {"repobilityId": "5c8945cd1b41c9f6", "scanner": "scanner-primary", "fingerprint": "9b3b268efe8b5d62", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/routes/rev-ops-7k2p.tsx"}, "region": {"startLine": 1011}}}]}, {"ruleId": "scanner-9b3b268efe8b5d62", "level": "error", "message": {"text": "Possible secret in src/routes/rev-ops-7k2p.tsx"}, "properties": {"repobilityId": "5c8945cd1b41c9f6", "scanner": "scanner-primary", "fingerprint": "9b3b268efe8b5d62", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/routes/rev-ops-7k2p.tsx"}, "region": {"startLine": 1401}}}]}, {"ruleId": "scanner-6e6b6cf7179ae56a", "level": "note", "message": {"text": "Very large file: src/components/BookingModal.tsx (968 lines)"}, "properties": {"repobilityId": "d9d05d583d005451", "scanner": "scanner-primary", "fingerprint": "6e6b6cf7179ae56a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e84a4149542f8b6f", "level": "note", "message": {"text": "Very large file: src/components/MyBookings.tsx (1225 lines)"}, "properties": {"repobilityId": "c6c126812d8a3169", "scanner": "scanner-primary", "fingerprint": "e84a4149542f8b6f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-5f1d05839d66f9a6", "level": "note", "message": {"text": "Very large file: src/routes/rev-ops-7k2p.tsx (1856 lines)"}, "properties": {"repobilityId": "7cb1a1146a2203aa", "scanner": "scanner-primary", "fingerprint": "5f1d05839d66f9a6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-253f75a6bac997d8", "level": "note", "message": {"text": "Very large file: convex/mutations.ts (4450 lines)"}, "properties": {"repobilityId": "9b46c6bc84095f6e", "scanner": "scanner-primary", "fingerprint": "253f75a6bac997d8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-931dc1a0133ee5f0", "level": "note", "message": {"text": "Very large file: convex/betterAuth/_generated/component.ts (1869 lines)"}, "properties": {"repobilityId": "d41f19fe60d39463", "scanner": "scanner-primary", "fingerprint": "931dc1a0133ee5f0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "e24fee2bcbc28e60", "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": "dabea86f6938f9ef", "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": "5cad2eabd50fd5e6", "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": "f75f8fce8f09367a", "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": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "008c540a96696efe", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-bd24d64268162d36", "level": "none", "message": {"text": "Commented-code block (6 lines) in vite.config.ts:20"}, "properties": {"repobilityId": "46c7d989e2998ca7", "scanner": "scanner-primary", "fingerprint": "bd24d64268162d36", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9aa1021bc895cd85", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/main.tsx:21"}, "properties": {"repobilityId": "3bbb75aeb1549f74", "scanner": "scanner-primary", "fingerprint": "9aa1021bc895cd85", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ec18b5de63b7f773", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/hooks/useAuth.ts:34"}, "properties": {"repobilityId": "9879ef3e930f57c3", "scanner": "scanner-primary", "fingerprint": "ec18b5de63b7f773", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-60d1e683b14a660a", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/hooks/useBookingStore.ts:44"}, "properties": {"repobilityId": "35d6dc303b9fdfc8", "scanner": "scanner-primary", "fingerprint": "60d1e683b14a660a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9077fbd12080421f", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/components/InstallPrompt.tsx:4"}, "properties": {"repobilityId": "51768b0ff646dfa3", "scanner": "scanner-primary", "fingerprint": "9077fbd12080421f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ba60d77131a041c5", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/AthleteAllocationEditor.tsx:36"}, "properties": {"repobilityId": "14cd26241a19b82e", "scanner": "scanner-primary", "fingerprint": "ba60d77131a041c5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2f2092a4214e6a23", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/LaneSegmentEditor.tsx:1"}, "properties": {"repobilityId": "58562127f0624c83", "scanner": "scanner-primary", "fingerprint": "2f2092a4214e6a23", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-baf56177739f2ad5", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/components/AdminAnalyticsDashboard.tsx:1"}, "properties": {"repobilityId": "c0639be1244c7d95", "scanner": "scanner-primary", "fingerprint": "baf56177739f2ad5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e7238e8161f4d52f", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/AdminAnnouncements.tsx:1"}, "properties": {"repobilityId": "b8526b6b82035e2b", "scanner": "scanner-primary", "fingerprint": "e7238e8161f4d52f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ffc085d202376ccb", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/components/EmailVerificationGate.tsx:1"}, "properties": {"repobilityId": "3e4285b33ea57ad9", "scanner": "scanner-primary", "fingerprint": "ffc085d202376ccb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4459d9ed83b71859", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/BookingModal.tsx:391"}, "properties": {"repobilityId": "7670300bf75461f5", "scanner": "scanner-primary", "fingerprint": "4459d9ed83b71859", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-84db6a4ca3fc530f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/RepeatBookingButton.tsx:1"}, "properties": {"repobilityId": "d7c83d9b8457ae27", "scanner": "scanner-primary", "fingerprint": "84db6a4ca3fc530f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3bef721d7e69c5f1", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/CoverageTimeline.tsx:1"}, "properties": {"repobilityId": "c90b540304170e1e", "scanner": "scanner-primary", "fingerprint": "3bef721d7e69c5f1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1e2c3acdeac76782", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/MyBookings.tsx:305"}, "properties": {"repobilityId": "1834e8961c2e478d", "scanner": "scanner-primary", "fingerprint": "1e2c3acdeac76782", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f28ea5a024a11e9c", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/LaneOverrideModal.tsx:1"}, "properties": {"repobilityId": "938ac6cd4f47161f", "scanner": "scanner-primary", "fingerprint": "f28ea5a024a11e9c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-72ba0d694bf35b3e", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/laneDisplay.tsx:1"}, "properties": {"repobilityId": "b746255a2cd6f699", "scanner": "scanner-primary", "fingerprint": "72ba0d694bf35b3e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-07d6bc034d742dfb", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/BookingCalendar.tsx:220"}, "properties": {"repobilityId": "b740670b9d5b1c53", "scanner": "scanner-primary", "fingerprint": "07d6bc034d742dfb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0b411661cdb462b8", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/AuthModal.tsx:227"}, "properties": {"repobilityId": "8b02707f36aaafa5", "scanner": "scanner-primary", "fingerprint": "0b411661cdb462b8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-922ea6595397db6e", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/AnnouncementHost.tsx:6"}, "properties": {"repobilityId": "95b074e23c95265a", "scanner": "scanner-primary", "fingerprint": "922ea6595397db6e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-628b9f8c77454e82", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/analytics/MapTab.tsx:52"}, "properties": {"repobilityId": "28c25450d5a02479", "scanner": "scanner-primary", "fingerprint": "628b9f8c77454e82", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e562cbbca7cf81e3", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/analytics/RevenueTab.tsx:159"}, "properties": {"repobilityId": "251708b862310ada", "scanner": "scanner-primary", "fingerprint": "e562cbbca7cf81e3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7ea37002544d2428", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/analytics/OverviewTab.tsx:1"}, "properties": {"repobilityId": "a0d6426365bd3612", "scanner": "scanner-primary", "fingerprint": "7ea37002544d2428", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-873770daedbd7104", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/analytics/ServerActivityTab.tsx:1"}, "properties": {"repobilityId": "9ca7c36061f3ff8d", "scanner": "scanner-primary", "fingerprint": "873770daedbd7104", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5534fe246fe31dc2", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/components/analytics/shared.tsx:87"}, "properties": {"repobilityId": "a278b19fe13fc6a7", "scanner": "scanner-primary", "fingerprint": "5534fe246fe31dc2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2f5f44880b479427", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/phone.ts:1"}, "properties": {"repobilityId": "fecb8372bebccd4f", "scanner": "scanner-primary", "fingerprint": "2f5f44880b479427", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-979691a7f76a13ea", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/auth-client.ts:13"}, "properties": {"repobilityId": "054aa5ce76883d2c", "scanner": "scanner-primary", "fingerprint": "979691a7f76a13ea", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7de190e9acdab1db", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/booking-data.ts:110"}, "properties": {"repobilityId": "f756ff12c3cb908a", "scanner": "scanner-primary", "fingerprint": "7de190e9acdab1db", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1572c94bb04698b9", "level": "none", "message": {"text": "Commented-code block (9 lines) in src/lib/lanes.ts:1"}, "properties": {"repobilityId": "fa0b7d0b49dea1cd", "scanner": "scanner-primary", "fingerprint": "1572c94bb04698b9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-632f973d14fb5396", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/errors.ts:3"}, "properties": {"repobilityId": "da6947bc49c1c20d", "scanner": "scanner-primary", "fingerprint": "632f973d14fb5396", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d45cac8e9dda47f9", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/wa-postcodes.ts:1"}, "properties": {"repobilityId": "c7b0b49026ec293d", "scanner": "scanner-primary", "fingerprint": "d45cac8e9dda47f9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-405fdc8b2738ddf9", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/coverage.ts:68"}, "properties": {"repobilityId": "4aa41f8e0652a943", "scanner": "scanner-primary", "fingerprint": "405fdc8b2738ddf9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e59d0b08a3631619", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/routes/rev-ops-7k2p.tsx:1407"}, "properties": {"repobilityId": "40ad1dded525e74f", "scanner": "scanner-primary", "fingerprint": "e59d0b08a3631619", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-00ac0185ac989b38", "level": "none", "message": {"text": "Commented-code block (6 lines) in convex/analytics.ts:23"}, "properties": {"repobilityId": "963bc907f110dbc2", "scanner": "scanner-primary", "fingerprint": "00ac0185ac989b38", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a71535a1e6e54369", "level": "none", "message": {"text": "Commented-code block (8 lines) in convex/schema.ts:33"}, "properties": {"repobilityId": "bb2b956050ca8844", "scanner": "scanner-primary", "fingerprint": "a71535a1e6e54369", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9c44a86f7fa2b016", "level": "none", "message": {"text": "Commented-code block (6 lines) in convex/convex.config.ts:2"}, "properties": {"repobilityId": "7a72c4701f4160b4", "scanner": "scanner-primary", "fingerprint": "9c44a86f7fa2b016", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0e23a5f401c6ead0", "level": "none", "message": {"text": "Commented-code block (7 lines) in convex/waitlist.ts:179"}, "properties": {"repobilityId": "0e041d7da239f72c", "scanner": "scanner-primary", "fingerprint": "0e23a5f401c6ead0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-29b1ae01138d1c84", "level": "none", "message": {"text": "Commented-code block (6 lines) in convex/analyticsAdmin.ts:1"}, "properties": {"repobilityId": "528e8732ad0512c0", "scanner": "scanner-primary", "fingerprint": "29b1ae01138d1c84", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-16322010f59b6442", "level": "note", "message": {"text": "Legacy-named symbol `formattedOld` in convex/mutations.ts:352"}, "properties": {"repobilityId": "5baa9179594e0d53", "scanner": "scanner-primary", "fingerprint": "16322010f59b6442", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b07cd91c1369c449", "level": "none", "message": {"text": "Commented-code block (9 lines) in convex/mutations.ts:101"}, "properties": {"repobilityId": "0b40157e448dcdda", "scanner": "scanner-primary", "fingerprint": "b07cd91c1369c449", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f36cfbf775cabf88", "level": "none", "message": {"text": "Commented-code block (7 lines) in convex/auth.ts:39"}, "properties": {"repobilityId": "6a5a093f6dd64336", "scanner": "scanner-primary", "fingerprint": "f36cfbf775cabf88", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4e6d00d4eb25a944", "level": "none", "message": {"text": "Commented-code block (5 lines) in convex/statements.ts:3"}, "properties": {"repobilityId": "fe0d4ee9bbc487e1", "scanner": "scanner-primary", "fingerprint": "4e6d00d4eb25a944", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2263444aed48a419", "level": "none", "message": {"text": "Commented-code block (5 lines) in convex/pushNotifications.ts:1"}, "properties": {"repobilityId": "87cb0eb9951ba51a", "scanner": "scanner-primary", "fingerprint": "2263444aed48a419", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f3053a84edb6f957", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 convex/googleCalendar.ts:98"}, "properties": {"repobilityId": "02c8e57331975bb7", "scanner": "scanner-primary", "fingerprint": "f3053a84edb6f957", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-24c4f769ac7273b3", "level": "none", "message": {"text": "Commented-code block (5 lines) in convex/serverActivity.ts:1"}, "properties": {"repobilityId": "fb110db7f569c245", "scanner": "scanner-primary", "fingerprint": "24c4f769ac7273b3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f2d6f558ceae9e36", "level": "none", "message": {"text": "Commented-code block (10 lines) in convex/webhooks.ts:37"}, "properties": {"repobilityId": "6353e451d02d4249", "scanner": "scanner-primary", "fingerprint": "f2d6f558ceae9e36", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fe9cb7cdb1d42d12", "level": "none", "message": {"text": "Commented-code block (5 lines) in convex/emails.ts:32"}, "properties": {"repobilityId": "ccf952b612b50ca5", "scanner": "scanner-primary", "fingerprint": "fe9cb7cdb1d42d12", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c9734eb9b7b6cade", "level": "none", "message": {"text": "Commented-code block (5 lines) in convex/seedDeanHolder.ts:9"}, "properties": {"repobilityId": "c9b1f84297f7ac77", "scanner": "scanner-primary", "fingerprint": "c9734eb9b7b6cade", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-87f85ccaba4ba997", "level": "none", "message": {"text": "Commented-code block (5 lines) in convex/laneBlocks.ts:38"}, "properties": {"repobilityId": "3a843d47a4cb819a", "scanner": "scanner-primary", "fingerprint": "87f85ccaba4ba997", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-10355da928627870", "level": "none", "message": {"text": "Commented-code block (5 lines) in convex/analyticsSnapshot.ts:1"}, "properties": {"repobilityId": "d5effed040293305", "scanner": "scanner-primary", "fingerprint": "10355da928627870", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-25cce4b411ece1f4", "level": "none", "message": {"text": "Commented-code block (6 lines) in convex/queries.ts:284"}, "properties": {"repobilityId": "7764aabc6f17720f", "scanner": "scanner-primary", "fingerprint": "25cce4b411ece1f4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a04c236619f73bb3", "level": "none", "message": {"text": "Commented-code block (5 lines) in convex/reminderQueries.ts:92"}, "properties": {"repobilityId": "60e313aa0bee7154", "scanner": "scanner-primary", "fingerprint": "a04c236619f73bb3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-991b0a8c097b6cf7", "level": "none", "message": {"text": "Commented-code block (5 lines) in convex/push.ts:45"}, "properties": {"repobilityId": "0482d8869e288600", "scanner": "scanner-primary", "fingerprint": "991b0a8c097b6cf7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dae0d8499d20764a", "level": "none", "message": {"text": "Commented-code block (6 lines) in convex/mates.ts:8"}, "properties": {"repobilityId": "b084c84d21ac1bb5", "scanner": "scanner-primary", "fingerprint": "dae0d8499d20764a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8cb52c3c53179d20", "level": "none", "message": {"text": "Commented-code block (8 lines) in convex/slotHolds.ts:20"}, "properties": {"repobilityId": "35f639b2959f656e", "scanner": "scanner-primary", "fingerprint": "8cb52c3c53179d20", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-11c3ee19f773fd9f", "level": "none", "message": {"text": "Commented-code block (10 lines) in convex/athletes.ts:230"}, "properties": {"repobilityId": "85b6314a2ae3a533", "scanner": "scanner-primary", "fingerprint": "11c3ee19f773fd9f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-22db449fc07835c6", "level": "none", "message": {"text": "Commented-code block (9 lines) in convex/http.ts:34"}, "properties": {"repobilityId": "acb4e85e4b48234f", "scanner": "scanner-primary", "fingerprint": "22db449fc07835c6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7a9c0d6cc3ac422e", "level": "none", "message": {"text": "Commented-code block (6 lines) in convex/announcements.ts:11"}, "properties": {"repobilityId": "a0fb75a87bd28154", "scanner": "scanner-primary", "fingerprint": "7a9c0d6cc3ac422e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-446c45a34fc9c564", "level": "none", "message": {"text": "Commented-code block (6 lines) in convex/analyticsUsage.ts:187"}, "properties": {"repobilityId": "80e43ad3fd807564", "scanner": "scanner-primary", "fingerprint": "446c45a34fc9c564", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-36f0e96e5cda29e1", "level": "none", "message": {"text": "Commented-code block (5 lines) in convex/testEmails.ts:1"}, "properties": {"repobilityId": "9288fea09ff6b65b", "scanner": "scanner-primary", "fingerprint": "36f0e96e5cda29e1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bc8b48b4d12715de", "level": "none", "message": {"text": "Commented-code block (5 lines) in convex/broadcast.ts:3"}, "properties": {"repobilityId": "2c86c5e6953356c0", "scanner": "scanner-primary", "fingerprint": "bc8b48b4d12715de", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3e14bd5be9cb216f", "level": "none", "message": {"text": "Commented-code block (5 lines) in convex/digestAction.ts:1"}, "properties": {"repobilityId": "10c36a9c0b6db7ad", "scanner": "scanner-primary", "fingerprint": "3e14bd5be9cb216f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d108fdafe26392cd", "level": "none", "message": {"text": "Commented-code block (5 lines) in convex/lib/email.ts:536"}, "properties": {"repobilityId": "018f38136467643d", "scanner": "scanner-primary", "fingerprint": "d108fdafe26392cd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-11027811adfbe759", "level": "none", "message": {"text": "Commented-code block (7 lines) in convex/lib/bookingWindow.ts:8"}, "properties": {"repobilityId": "e1d51ddff2b0e333", "scanner": "scanner-primary", "fingerprint": "11027811adfbe759", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-73c6f0ee3e7e2d52", "level": "none", "message": {"text": "Commented-code block (6 lines) in convex/lib/pricing.ts:3"}, "properties": {"repobilityId": "21f59835251a8a2b", "scanner": "scanner-primary", "fingerprint": "73c6f0ee3e7e2d52", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-32f3d6f34896b32d", "level": "none", "message": {"text": "Commented-code block (8 lines) in convex/lib/lanes.ts:1"}, "properties": {"repobilityId": "a32f6e95cf726d3f", "scanner": "scanner-primary", "fingerprint": "32f3d6f34896b32d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8d71f2f586d0ecbd", "level": "none", "message": {"text": "Commented-code block (5 lines) in convex/lib/priceDefaults.ts:1"}, "properties": {"repobilityId": "f39c98e31ac674a4", "scanner": "scanner-primary", "fingerprint": "8d71f2f586d0ecbd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-56ddac46c633942c", "level": "none", "message": {"text": "Commented-code block (5 lines) in convex/lib/waPostcodes.ts:1"}, "properties": {"repobilityId": "a591c201a17d9eb3", "scanner": "scanner-primary", "fingerprint": "56ddac46c633942c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-141c013aecb0c29f", "level": "none", "message": {"text": "Commented-code block (7 lines) in convex/lib/slotHolds.ts:14"}, "properties": {"repobilityId": "9025cf374d5e3e01", "scanner": "scanner-primary", "fingerprint": "141c013aecb0c29f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8e2b9792f58f45db", "level": "none", "message": {"text": "Commented-code block (6 lines) in convex/lib/identity.ts:3"}, "properties": {"repobilityId": "54c5dbd6966b31e4", "scanner": "scanner-primary", "fingerprint": "8e2b9792f58f45db", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f480fd551079c9c6", "level": "none", "message": {"text": "Commented-code block (6 lines) in convex/lib/unsubscribe.ts:1"}, "properties": {"repobilityId": "9eff92a97d690746", "scanner": "scanner-primary", "fingerprint": "f480fd551079c9c6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}]}]}