{"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-41ea51c94c4203ba", "name": "Stray `console.log` in TS/JS \u2014 .tmp-check-notification-jobs.ts:15", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .tmp-check-notification-jobs.ts:15"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f1fdcb893a40c383", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(clinic)/[clinicId]/settings/_components/ClinicSetupServices.ts", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(clinic)/[clinicId]/settings/_components/ClinicSetupServices.tsx:242"}, "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-15b09ac0b567f1e8", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(clinic)/[clinicId]/settings/_components/ClinicSetupDoctors.tsx", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(clinic)/[clinicId]/settings/_components/ClinicSetupDoctors.tsx:385"}, "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-6cc56b1e0fe15a34", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(clinic)/[clinicId]/calendar/CalendarClient.tsx:169", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(clinic)/[clinicId]/calendar/CalendarClient.tsx:169"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-39e2b18f3bb1bc0f", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(clinic)/[clinicId]/inbox/page.tsx:1235", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(clinic)/[clinicId]/inbox/page.tsx:1235"}, "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-1d7d4360cc872ac3", "name": "Stray `console.log` in TS/JS \u2014 app/(clinic)/[clinicId]/inbox/page.tsx:963", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/(clinic)/[clinicId]/inbox/page.tsx:963"}, "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-9d99c90eae528f28", "name": "Stray `console.log` in TS/JS \u2014 app/api/cron/expire-trials/route.ts:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/cron/expire-trials/route.ts:18"}, "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-90afbeef61e84226", "name": "Stray `console.log` in TS/JS \u2014 app/api/whatsapp/webhook-v2/route.ts:145", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/whatsapp/webhook-v2/route.ts:145"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fb2d0e3561b98123", "name": "Stray `console.log` in TS/JS \u2014 app/api/whatsapp/status/route.ts:78", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/whatsapp/status/route.ts:78"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0d44acbc679ce7fe", "name": "Stray `console.log` in TS/JS \u2014 app/api/whatsapp/webhook/route.ts:549", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/whatsapp/webhook/route.ts:549"}, "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-3b33e2bf47318558", "name": "`truncate` class without `title=` for hover reveal \u2014 app/patients/page.tsx:177", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/patients/page.tsx:177"}, "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-f322fb0d1d8903d5", "name": "`truncate` class without `title=` for hover reveal \u2014 app/onboarding/OnboardingWizard.tsx:948", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/onboarding/OnboardingWizard.tsx:948"}, "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-ffb76e0af10de661", "name": "Stray `console.log` in TS/JS \u2014 scripts/verify-activity-log.js:436", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/verify-activity-log.js:436"}, "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-af508e193872393c", "name": "Stray `console.log` in TS/JS \u2014 scripts/qa-duplicate-confirmation.ts:46", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/qa-duplicate-confirmation.ts:46"}, "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-7cb55cae306efd78", "name": "Stray `console.log` in TS/JS \u2014 scripts/verify-role-permissions.js:424", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/verify-role-permissions.js:424"}, "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-3b3bddbd230891fa", "name": "Stray `console.log` in TS/JS \u2014 scripts/qa-reschedule-e2e.ts:50", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/qa-reschedule-e2e.ts:50"}, "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-b3a3951db0f1647f", "name": "Stray `console.log` in TS/JS \u2014 scripts/qa-check-transitions.ts:15", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/qa-check-transitions.ts:15"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a50ffb5e3fb59d3c", "name": "Stray `console.log` in TS/JS \u2014 scripts/qa-period-test.ts:38", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/qa-period-test.ts:38"}, "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-a456bd30c9be6d8d", "name": "Stray `console.log` in TS/JS \u2014 scripts/qa-cancel-full-e2e.ts:41", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/qa-cancel-full-e2e.ts:41"}, "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-7e4fbb7d41a9470c", "name": "Stray `console.log` in TS/JS \u2014 scripts/verify-dashboard-metrics.js:481", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/verify-dashboard-metrics.js:481"}, "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-56c380000bb42690", "name": "Stray `console.log` in TS/JS \u2014 scripts/verify-notification-center.js:413", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/verify-notification-center.js:413"}, "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-a047d2cdcfaf2330", "name": "Stray `console.log` in TS/JS \u2014 scripts/verify-whatsapp-status-callback.js:17", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/verify-whatsapp-status-callback.js:17"}, "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-1c669a7819a43f00", "name": "Stray `console.log` in TS/JS \u2014 scripts/verify-fsm-e2e.js:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/verify-fsm-e2e.js:13"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2d6bd4b1fc07d22b", "name": "Stray `console.log` in TS/JS \u2014 scripts/qa-override-check.ts:55", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/qa-override-check.ts:55"}, "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-72ff3a0e94af5f28", "name": "Stray `console.log` in TS/JS \u2014 scripts/qa-followup.ts:38", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/qa-followup.ts:38"}, "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-76e3130f3c06ad93", "name": "Stray `console.log` in TS/JS \u2014 scripts/qa-inspect.ts:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/qa-inspect.ts:18"}, "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-19602499153b6b6b", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-resolve-session.ts:5", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-resolve-session.ts:5"}, "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-0f619f7ef54c9899", "name": "Stray `console.log` in TS/JS \u2014 scripts/qa-runner.ts:100", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/qa-runner.ts:100"}, "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-6e94858ad82230aa", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-future-slots.ts:52", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-future-slots.ts:52"}, "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-eab0d48350a1829a", "name": "Stray `console.log` in TS/JS \u2014 scripts/_signin_probe.js:49", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/_signin_probe.js:49"}, "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-781bad01811137ce", "name": "Stray `console.log` in TS/JS \u2014 scripts/qa-cancel-e2e.ts:34", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/qa-cancel-e2e.ts:34"}, "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-947af0c023f5e467", "name": "Stray `console.log` in TS/JS \u2014 scripts/_auth_probe.js:80", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/_auth_probe.js:80"}, "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-f91103d9eb8cb8c2", "name": "Stray `console.log` in TS/JS \u2014 scripts/verify-prod-hardening.js:67", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/verify-prod-hardening.js:67"}, "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-d36636b84d793e1c", "name": "Stray `console.log` in TS/JS \u2014 scripts/verify-executor-runtime.js:85", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/verify-executor-runtime.js:85"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-72c45889647ba459", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-session-insert.js:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-session-insert.js:14"}, "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-7e9440523f1d691f", "name": "Stray `console.log` in TS/JS \u2014 scripts/verify-reschedule-auth.js:664", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/verify-reschedule-auth.js:664"}, "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-5a3d2e67d86dbd9e", "name": "Stray `console.log` in TS/JS \u2014 scripts/verify-operator-audit.js:515", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/verify-operator-audit.js:515"}, "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-8ae74307bf0d093d", "name": "Stray `console.log` in TS/JS \u2014 scripts/qa-escalation-validate.ts:34", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/qa-escalation-validate.ts:34"}, "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-33944a4990cfb755", "name": "Stray `console.log` in TS/JS \u2014 scripts/qa-state.ts:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/qa-state.ts:20"}, "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-1b1300e4567c680e", "name": "Stray `console.log` in TS/JS \u2014 scripts/qa-query.ts:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/qa-query.ts:16"}, "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-488a60b510cedcfb", "name": "Stray `console.log` in TS/JS \u2014 scripts/verify-executor.js:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/verify-executor.js:22"}, "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-6fee97f2dd30cb59", "name": "Stray `console.log` in TS/JS \u2014 scripts/qa/conversation-regression.ts:125", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/qa/conversation-regression.ts:125"}, "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-ef65c0ba97a5a2c8", "name": "`truncate` class without `title=` for hover reveal \u2014 components/layouts/ClinicSidebar.tsx:113", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/layouts/ClinicSidebar.tsx:113"}, "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-78d0caff58c09463", "name": "Icon-only button without accessible name \u2014 components/velora/footer-section.tsx:420", "shortDescription": {"text": "Icon-only button without accessible name \u2014 components/velora/footer-section.tsx:420"}, "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-454ee76e5c7de962", "name": "Stray `console.log` in TS/JS \u2014 lib/google/sync.ts:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/google/sync.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-ed9478edd729dcd1", "name": "Stray `console.log` in TS/JS \u2014 lib/google/oauth.ts:27", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/google/oauth.ts:27"}, "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-7b82e30448bd687a", "name": "Stray `console.log` in TS/JS \u2014 lib/whatsapp/ai-interpretation-pipeline.ts:587", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/whatsapp/ai-interpretation-pipeline.ts:587"}, "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-ae633d46c1597d94", "name": "Stray `console.log` in TS/JS \u2014 lib/notifications/staff-whatsapp.ts:54", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/notifications/staff-whatsapp.ts:54"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-77afaf8403a75cf2", "name": "Possible secret in scripts/verify-activity-log.js", "shortDescription": {"text": "Possible secret in scripts/verify-activity-log.js"}, "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-bd8106ac76337801", "name": "Possible secret in scripts/verify-login.mjs", "shortDescription": {"text": "Possible secret in scripts/verify-login.mjs"}, "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-c5ed1ac419fc0d51", "name": "Possible secret in scripts/verify-role-permissions.js", "shortDescription": {"text": "Possible secret in scripts/verify-role-permissions.js"}, "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-4b9ff6d7e0826381", "name": "Possible secret in scripts/verify-recovery.mjs", "shortDescription": {"text": "Possible secret in scripts/verify-recovery.mjs"}, "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-a5e6335f727b9a7f", "name": "Possible secret in scripts/verify-dashboard-metrics.js", "shortDescription": {"text": "Possible secret in scripts/verify-dashboard-metrics.js"}, "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-413a9770374aa266", "name": "Possible secret in scripts/verify-notification-center.js", "shortDescription": {"text": "Possible secret in scripts/verify-notification-center.js"}, "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-46f1827404e5ac54", "name": "Possible secret in scripts/_signin_probe.js", "shortDescription": {"text": "Possible secret in scripts/_signin_probe.js"}, "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-6e1c3797989fc546", "name": "Possible secret in scripts/_auth_probe.js", "shortDescription": {"text": "Possible secret in scripts/_auth_probe.js"}, "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-568e69d9c651c86a", "name": "Possible secret in scripts/verify-reschedule-auth.js", "shortDescription": {"text": "Possible secret in scripts/verify-reschedule-auth.js"}, "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-d1c7c673af9fda87", "name": "Possible secret in scripts/verify-operator-audit.js", "shortDescription": {"text": "Possible secret in scripts/verify-operator-audit.js"}, "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-974d39ad70d2744c", "name": "Possible secret in scripts/reset-user-password.mjs", "shortDescription": {"text": "Possible secret in scripts/reset-user-password.mjs"}, "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-19d66528069acccb", "name": "Very large file: app/(clinic)/[clinicId]/calendar/CalendarClient.tsx (1498 lines)", "shortDescription": {"text": "Very large file: app/(clinic)/[clinicId]/calendar/CalendarClient.tsx (1498 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-19e6259c0b5fc1aa", "name": "Very large file: app/(clinic)/[clinicId]/inbox/page.tsx (1441 lines)", "shortDescription": {"text": "Very large file: app/(clinic)/[clinicId]/inbox/page.tsx (1441 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-fea2808a915f2068", "name": "Very large file: app/api/whatsapp/webhook-v2/route.ts (3036 lines)", "shortDescription": {"text": "Very large file: app/api/whatsapp/webhook-v2/route.ts (3036 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-403a92cf67ed16a2", "name": "Very large file: app/api/whatsapp/webhook/route.ts (3101 lines)", "shortDescription": {"text": "Very large file: app/api/whatsapp/webhook/route.ts (3101 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-18b246ca36b6778f", "name": "Very large file: app/onboarding/OnboardingWizard.tsx (1606 lines)", "shortDescription": {"text": "Very large file: app/onboarding/OnboardingWizard.tsx (1606 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-0c8a3642b9e6b3e3", "name": "Very large file: lib/prisma-client/commonInputTypes.ts (1136 lines)", "shortDescription": {"text": "Very large file: lib/prisma-client/commonInputTypes.ts (1136 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-ec1bfe7e3217efd8", "name": "Very large file: lib/prisma-client/models/Reminder.ts (1891 lines)", "shortDescription": {"text": "Very large file: lib/prisma-client/models/Reminder.ts (1891 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-9e097945ef7203e6", "name": "Very large file: lib/prisma-client/models/AvailableSlot.ts (1878 lines)", "shortDescription": {"text": "Very large file: lib/prisma-client/models/AvailableSlot.ts (1878 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-9d60cb5e78dcf6da", "name": "Very large file: lib/prisma-client/models/EscalationLog.ts (1691 lines)", "shortDescription": {"text": "Very large file: lib/prisma-client/models/EscalationLog.ts (1691 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-dddde9745464f443", "name": "Very large file: lib/prisma-client/models/Membership.ts (1849 lines)", "shortDescription": {"text": "Very large file: lib/prisma-client/models/Membership.ts (1849 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-e704ba097b900a63", "name": "Very large file: lib/prisma-client/models/Message.ts (1820 lines)", "shortDescription": {"text": "Very large file: lib/prisma-client/models/Message.ts (1820 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-410618a0b31d54c3", "name": "Very large file: lib/prisma-client/models/Patient.ts (2290 lines)", "shortDescription": {"text": "Very large file: lib/prisma-client/models/Patient.ts (2290 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-78fc7eb126cc90ef", "name": "Very large file: lib/prisma-client/models/BusinessHours.ts (1570 lines)", "shortDescription": {"text": "Very large file: lib/prisma-client/models/BusinessHours.ts (1570 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-964fc0759b62c58f", "name": "Very large file: lib/prisma-client/models/StateTransitionLog.ts (1479 lines)", "shortDescription": {"text": "Very large file: lib/prisma-client/models/StateTransitionLog.ts (1479 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-a0dd6913b37240c5", "name": "Very large file: lib/prisma-client/models/Campaign.ts (1880 lines)", "shortDescription": {"text": "Very large file: lib/prisma-client/models/Campaign.ts (1880 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-d18958afb01a6a0b", "name": "Very large file: lib/prisma-client/models/User.ts (2800 lines)", "shortDescription": {"text": "Very large file: lib/prisma-client/models/User.ts (2800 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-5dbe82b0d0cb64b7", "name": "Very large file: lib/prisma-client/models/NotificationJob.ts (2396 lines)", "shortDescription": {"text": "Very large file: lib/prisma-client/models/NotificationJob.ts (2396 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-150db5a284d380e6", "name": "Very large file: lib/prisma-client/models/Clinic.ts (5687 lines)", "shortDescription": {"text": "Very large file: lib/prisma-client/models/Clinic.ts (5687 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-96297343e9d8b88f", "name": "Very large file: lib/prisma-client/models/Conversation.ts (2004 lines)", "shortDescription": {"text": "Very large file: lib/prisma-client/models/Conversation.ts (2004 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-746b073a081c1a53", "name": "Very large file: lib/prisma-client/models/Lead.ts (1485 lines)", "shortDescription": {"text": "Very large file: lib/prisma-client/models/Lead.ts (1485 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-b893c8e226fa3bd1", "name": "Very large file: lib/prisma-client/models/Doctor.ts (1981 lines)", "shortDescription": {"text": "Very large file: lib/prisma-client/models/Doctor.ts (1981 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-451fe6dc20a86a32", "name": "Very large file: lib/prisma-client/models/ConversationMessage.ts (1747 lines)", "shortDescription": {"text": "Very large file: lib/prisma-client/models/ConversationMessage.ts (1747 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-386a09e3d740b551", "name": "Very large file: lib/prisma-client/models/GoogleCalendarConnection.ts (1592 lines)", "shortDescription": {"text": "Very large file: lib/prisma-client/models/GoogleCalendarConnection.ts (1592 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-e734e418ef61bb0e", "name": "Very large file: lib/prisma-client/models/ConversationSession.ts (3396 lines)", "shortDescription": {"text": "Very large file: lib/prisma-client/models/ConversationSession.ts (3396 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-b9c99bbb49d3f621", "name": "Very large file: lib/prisma-client/models/Service.ts (2026 lines)", "shortDescription": {"text": "Very large file: lib/prisma-client/models/Service.ts (2026 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-2256faea67ef9146", "name": "Very large file: lib/prisma-client/models/Appointment.ts (3884 lines)", "shortDescription": {"text": "Very large file: lib/prisma-client/models/Appointment.ts (3884 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-213f4ea42d9926e4", "name": "Very large file: lib/prisma-client/models/ClinicSettings.ts (1519 lines)", "shortDescription": {"text": "Very large file: lib/prisma-client/models/ClinicSettings.ts (1519 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-8c81d70c65eefea0", "name": "Very large file: lib/prisma-client/internal/prismaNamespace.ts (2972 lines)", "shortDescription": {"text": "Very large file: lib/prisma-client/internal/prismaNamespace.ts (2972 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": "9 test file(s) for 255 source file(s) (ratio 0.04). 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 302 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 92 placeholder/mock markers across 35 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-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e725d2ab884fbd49", "name": "Multiple root agent instruction files without precedence", "shortDescription": {"text": "Multiple root agent instruction files without precedence"}, "fullDescription": {"text": "The repo has multiple top-level AI-coder instruction files. Without precedence rules, different agents may follow different policies."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-78f70a2d6302f5d3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(clinic)/[clinicId]/settings/_components/ClinicSetupServices.tsx:40", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(clinic)/[clinicId]/settings/_components/ClinicSetupServices.tsx:40"}, "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-74d56902fc44311f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(clinic)/[clinicId]/settings/_components/ClinicSetupDoctors.tsx:130", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(clinic)/[clinicId]/settings/_components/ClinicSetupDoctors.tsx:130"}, "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-b04f3245035aca3f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(clinic)/[clinicId]/calendar/CalendarClient.tsx:478", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(clinic)/[clinicId]/calendar/CalendarClient.tsx:478"}, "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-ab4407670687ae88", "name": "Commented-code block (5 lines) in app/api/cron/noshow-confirmation/route.ts:25", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/cron/noshow-confirmation/route.ts:25"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6e4ccbc9e6cb2386", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/payment/complete/page.tsx:70", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/payment/complete/page.tsx:70"}, "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-add3837bbef177f4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/onboarding/OnboardingWizard.tsx:409", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/onboarding/OnboardingWizard.tsx:409"}, "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-e76ef92fbbfc3ddd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/verify-recovery.mjs:63", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/verify-recovery.mjs:63"}, "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-a92f616e129976ab", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/qa-period-test.ts:18", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/qa-period-test.ts:18"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-32964a3011874673", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/qa-override-check.ts:19", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/qa-override-check.ts:19"}, "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-6819604d71000cda", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/qa-followup.ts:111", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/qa-followup.ts:111"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0b53eeffab51a2c3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/qa-runner.ts:456", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/qa-runner.ts:456"}, "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-b1e78df070ad7ab9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/qa-escalation-validate.ts:45", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/qa-escalation-validate.ts:45"}, "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-76e7939ca520d217", "name": "Commented-code block (6 lines) in scripts/qa/conversation-regression.ts:179", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/qa/conversation-regression.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-ffec93d38cdbe0bb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/whatsapp/context-router.ts:130", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/whatsapp/context-router.ts:130"}, "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-74c04b4928fb05a7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/whatsapp/slot-extractor.ts:142", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/whatsapp/slot-extractor.ts:142"}, "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-68fd93bdf7d5d4bf", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/whatsapp/meta-sender.ts:5", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/whatsapp/meta-sender.ts:5"}, "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-0539905c0e0d55ee", "name": "Commented-code block (5 lines) in lib/notifications/send-whatsapp-job.ts:267", "shortDescription": {"text": "Commented-code block (5 lines) in lib/notifications/send-whatsapp-job.ts:267"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. 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/24432"}, "properties": {"repository": "azizz766/airclinic-clone", "repoUrl": "https://github.com/azizz766/airclinic-clone", "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-41ea51c94c4203ba", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .tmp-check-notification-jobs.ts:15"}, "properties": {"repobilityId": "d8975d22e55fb639", "scanner": "scanner-primary", "fingerprint": "41ea51c94c4203ba", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f1fdcb893a40c383", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(clinic)/[clinicId]/settings/_components/ClinicSetupServices.tsx:242"}, "properties": {"repobilityId": "9924807d61fd08c8", "scanner": "scanner-primary", "fingerprint": "f1fdcb893a40c383", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-15b09ac0b567f1e8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(clinic)/[clinicId]/settings/_components/ClinicSetupDoctors.tsx:385"}, "properties": {"repobilityId": "7c4ab50643c93f14", "scanner": "scanner-primary", "fingerprint": "15b09ac0b567f1e8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6cc56b1e0fe15a34", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(clinic)/[clinicId]/calendar/CalendarClient.tsx:169"}, "properties": {"repobilityId": "be2b8cd870fed2c8", "scanner": "scanner-primary", "fingerprint": "6cc56b1e0fe15a34", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-39e2b18f3bb1bc0f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(clinic)/[clinicId]/inbox/page.tsx:1235"}, "properties": {"repobilityId": "716a06012a4f7c8e", "scanner": "scanner-primary", "fingerprint": "39e2b18f3bb1bc0f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1d7d4360cc872ac3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/(clinic)/[clinicId]/inbox/page.tsx:963"}, "properties": {"repobilityId": "8befc823ccfa0352", "scanner": "scanner-primary", "fingerprint": "1d7d4360cc872ac3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9d99c90eae528f28", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/cron/expire-trials/route.ts:18"}, "properties": {"repobilityId": "53ec8106adcbdbaf", "scanner": "scanner-primary", "fingerprint": "9d99c90eae528f28", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-90afbeef61e84226", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/whatsapp/webhook-v2/route.ts:145"}, "properties": {"repobilityId": "f1e3844da45a829f", "scanner": "scanner-primary", "fingerprint": "90afbeef61e84226", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fb2d0e3561b98123", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/whatsapp/status/route.ts:78"}, "properties": {"repobilityId": "62da1c504735d7ca", "scanner": "scanner-primary", "fingerprint": "fb2d0e3561b98123", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0d44acbc679ce7fe", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/whatsapp/webhook/route.ts:549"}, "properties": {"repobilityId": "7ccb858d35243d74", "scanner": "scanner-primary", "fingerprint": "0d44acbc679ce7fe", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3b33e2bf47318558", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/patients/page.tsx:177"}, "properties": {"repobilityId": "008a09179462097d", "scanner": "scanner-primary", "fingerprint": "3b33e2bf47318558", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f322fb0d1d8903d5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/onboarding/OnboardingWizard.tsx:948"}, "properties": {"repobilityId": "53017c0168891e60", "scanner": "scanner-primary", "fingerprint": "f322fb0d1d8903d5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ffb76e0af10de661", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/verify-activity-log.js:436"}, "properties": {"repobilityId": "41c30d6fbef06d99", "scanner": "scanner-primary", "fingerprint": "ffb76e0af10de661", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-af508e193872393c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/qa-duplicate-confirmation.ts:46"}, "properties": {"repobilityId": "3f9952b19511fe76", "scanner": "scanner-primary", "fingerprint": "af508e193872393c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7cb55cae306efd78", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/verify-role-permissions.js:424"}, "properties": {"repobilityId": "fc2e5330e14e6bcb", "scanner": "scanner-primary", "fingerprint": "7cb55cae306efd78", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3b3bddbd230891fa", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/qa-reschedule-e2e.ts:50"}, "properties": {"repobilityId": "c4df44d0747739d0", "scanner": "scanner-primary", "fingerprint": "3b3bddbd230891fa", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b3a3951db0f1647f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/qa-check-transitions.ts:15"}, "properties": {"repobilityId": "72da2d283240f768", "scanner": "scanner-primary", "fingerprint": "b3a3951db0f1647f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a50ffb5e3fb59d3c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/qa-period-test.ts:38"}, "properties": {"repobilityId": "9f8f3dcd42413105", "scanner": "scanner-primary", "fingerprint": "a50ffb5e3fb59d3c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a456bd30c9be6d8d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/qa-cancel-full-e2e.ts:41"}, "properties": {"repobilityId": "139f8079dd7e92f6", "scanner": "scanner-primary", "fingerprint": "a456bd30c9be6d8d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7e4fbb7d41a9470c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/verify-dashboard-metrics.js:481"}, "properties": {"repobilityId": "ad35841e1ec6eadb", "scanner": "scanner-primary", "fingerprint": "7e4fbb7d41a9470c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-56c380000bb42690", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/verify-notification-center.js:413"}, "properties": {"repobilityId": "fc38c6b794d04434", "scanner": "scanner-primary", "fingerprint": "56c380000bb42690", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a047d2cdcfaf2330", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/verify-whatsapp-status-callback.js:17"}, "properties": {"repobilityId": "4a47196b849d6403", "scanner": "scanner-primary", "fingerprint": "a047d2cdcfaf2330", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1c669a7819a43f00", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/verify-fsm-e2e.js:13"}, "properties": {"repobilityId": "d72df33ab378f7af", "scanner": "scanner-primary", "fingerprint": "1c669a7819a43f00", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2d6bd4b1fc07d22b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/qa-override-check.ts:55"}, "properties": {"repobilityId": "d93c44d3bcb9d8a2", "scanner": "scanner-primary", "fingerprint": "2d6bd4b1fc07d22b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-72ff3a0e94af5f28", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/qa-followup.ts:38"}, "properties": {"repobilityId": "0a0e3fa6aa8f8bdb", "scanner": "scanner-primary", "fingerprint": "72ff3a0e94af5f28", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-76e3130f3c06ad93", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/qa-inspect.ts:18"}, "properties": {"repobilityId": "cb62dd3898d876fc", "scanner": "scanner-primary", "fingerprint": "76e3130f3c06ad93", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-19602499153b6b6b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-resolve-session.ts:5"}, "properties": {"repobilityId": "38250b09745e0642", "scanner": "scanner-primary", "fingerprint": "19602499153b6b6b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0f619f7ef54c9899", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/qa-runner.ts:100"}, "properties": {"repobilityId": "6a81b95e2375892d", "scanner": "scanner-primary", "fingerprint": "0f619f7ef54c9899", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6e94858ad82230aa", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-future-slots.ts:52"}, "properties": {"repobilityId": "dc9e3dadc19d3065", "scanner": "scanner-primary", "fingerprint": "6e94858ad82230aa", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-eab0d48350a1829a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/_signin_probe.js:49"}, "properties": {"repobilityId": "a8ab80374c708cce", "scanner": "scanner-primary", "fingerprint": "eab0d48350a1829a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-781bad01811137ce", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/qa-cancel-e2e.ts:34"}, "properties": {"repobilityId": "ae1efd8aaa8f3db3", "scanner": "scanner-primary", "fingerprint": "781bad01811137ce", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-947af0c023f5e467", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/_auth_probe.js:80"}, "properties": {"repobilityId": "97addfef58e7bbdb", "scanner": "scanner-primary", "fingerprint": "947af0c023f5e467", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f91103d9eb8cb8c2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/verify-prod-hardening.js:67"}, "properties": {"repobilityId": "c2f87f80511515b4", "scanner": "scanner-primary", "fingerprint": "f91103d9eb8cb8c2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d36636b84d793e1c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/verify-executor-runtime.js:85"}, "properties": {"repobilityId": "5f144004353746d6", "scanner": "scanner-primary", "fingerprint": "d36636b84d793e1c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-72c45889647ba459", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-session-insert.js:14"}, "properties": {"repobilityId": "a95e08c5c7366d08", "scanner": "scanner-primary", "fingerprint": "72c45889647ba459", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7e9440523f1d691f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/verify-reschedule-auth.js:664"}, "properties": {"repobilityId": "4a9250f1358770f7", "scanner": "scanner-primary", "fingerprint": "7e9440523f1d691f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5a3d2e67d86dbd9e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/verify-operator-audit.js:515"}, "properties": {"repobilityId": "8fc2b3c62099dd2a", "scanner": "scanner-primary", "fingerprint": "5a3d2e67d86dbd9e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8ae74307bf0d093d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/qa-escalation-validate.ts:34"}, "properties": {"repobilityId": "0455d4d6af2b74d7", "scanner": "scanner-primary", "fingerprint": "8ae74307bf0d093d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-33944a4990cfb755", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/qa-state.ts:20"}, "properties": {"repobilityId": "3b0248b2f17bf3fc", "scanner": "scanner-primary", "fingerprint": "33944a4990cfb755", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1b1300e4567c680e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/qa-query.ts:16"}, "properties": {"repobilityId": "fb62760ccc28d705", "scanner": "scanner-primary", "fingerprint": "1b1300e4567c680e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-488a60b510cedcfb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/verify-executor.js:22"}, "properties": {"repobilityId": "3e5f8da12a64846c", "scanner": "scanner-primary", "fingerprint": "488a60b510cedcfb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6fee97f2dd30cb59", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/qa/conversation-regression.ts:125"}, "properties": {"repobilityId": "883742c04a018269", "scanner": "scanner-primary", "fingerprint": "6fee97f2dd30cb59", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ef65c0ba97a5a2c8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/layouts/ClinicSidebar.tsx:113"}, "properties": {"repobilityId": "4fb747934bac3710", "scanner": "scanner-primary", "fingerprint": "ef65c0ba97a5a2c8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-78d0caff58c09463", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 components/velora/footer-section.tsx:420"}, "properties": {"repobilityId": "8c6788ae2f39a4c7", "scanner": "scanner-primary", "fingerprint": "78d0caff58c09463", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-454ee76e5c7de962", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/google/sync.ts:32"}, "properties": {"repobilityId": "12c2ee888aef642a", "scanner": "scanner-primary", "fingerprint": "454ee76e5c7de962", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ed9478edd729dcd1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/google/oauth.ts:27"}, "properties": {"repobilityId": "caf87d88e0525a6f", "scanner": "scanner-primary", "fingerprint": "ed9478edd729dcd1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7b82e30448bd687a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/whatsapp/ai-interpretation-pipeline.ts:587"}, "properties": {"repobilityId": "5476cf3c33bfce76", "scanner": "scanner-primary", "fingerprint": "7b82e30448bd687a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ae633d46c1597d94", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/notifications/staff-whatsapp.ts:54"}, "properties": {"repobilityId": "5b43629e51b99e26", "scanner": "scanner-primary", "fingerprint": "ae633d46c1597d94", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-77afaf8403a75cf2", "level": "error", "message": {"text": "Possible secret in scripts/verify-activity-log.js"}, "properties": {"repobilityId": "37c271fa1e8dbb9e", "scanner": "scanner-primary", "fingerprint": "77afaf8403a75cf2", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/verify-activity-log.js"}, "region": {"startLine": 9}}}]}, {"ruleId": "scanner-bd8106ac76337801", "level": "error", "message": {"text": "Possible secret in scripts/verify-login.mjs"}, "properties": {"repobilityId": "056c20c586c07643", "scanner": "scanner-primary", "fingerprint": "bd8106ac76337801", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/verify-login.mjs"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-c5ed1ac419fc0d51", "level": "error", "message": {"text": "Possible secret in scripts/verify-role-permissions.js"}, "properties": {"repobilityId": "23e058ff478dedc4", "scanner": "scanner-primary", "fingerprint": "c5ed1ac419fc0d51", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/verify-role-permissions.js"}, "region": {"startLine": 9}}}]}, {"ruleId": "scanner-4b9ff6d7e0826381", "level": "error", "message": {"text": "Possible secret in scripts/verify-recovery.mjs"}, "properties": {"repobilityId": "767cd7b051039531", "scanner": "scanner-primary", "fingerprint": "4b9ff6d7e0826381", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/verify-recovery.mjs"}, "region": {"startLine": 33}}}]}, {"ruleId": "scanner-a5e6335f727b9a7f", "level": "error", "message": {"text": "Possible secret in scripts/verify-dashboard-metrics.js"}, "properties": {"repobilityId": "61d83519b6475092", "scanner": "scanner-primary", "fingerprint": "a5e6335f727b9a7f", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/verify-dashboard-metrics.js"}, "region": {"startLine": 9}}}]}, {"ruleId": "scanner-413a9770374aa266", "level": "error", "message": {"text": "Possible secret in scripts/verify-notification-center.js"}, "properties": {"repobilityId": "cda9bd48fb4ee248", "scanner": "scanner-primary", "fingerprint": "413a9770374aa266", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/verify-notification-center.js"}, "region": {"startLine": 9}}}]}, {"ruleId": "scanner-46f1827404e5ac54", "level": "error", "message": {"text": "Possible secret in scripts/_signin_probe.js"}, "properties": {"repobilityId": "ff1b1174c0005126", "scanner": "scanner-primary", "fingerprint": "46f1827404e5ac54", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/_signin_probe.js"}, "region": {"startLine": 27}}}]}, {"ruleId": "scanner-6e1c3797989fc546", "level": "error", "message": {"text": "Possible secret in scripts/_auth_probe.js"}, "properties": {"repobilityId": "36b2e8a84c75a663", "scanner": "scanner-primary", "fingerprint": "6e1c3797989fc546", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/_auth_probe.js"}, "region": {"startLine": 9}}}]}, {"ruleId": "scanner-568e69d9c651c86a", "level": "error", "message": {"text": "Possible secret in scripts/verify-reschedule-auth.js"}, "properties": {"repobilityId": "1e3cb4aa7ef4f48c", "scanner": "scanner-primary", "fingerprint": "568e69d9c651c86a", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/verify-reschedule-auth.js"}, "region": {"startLine": 9}}}]}, {"ruleId": "scanner-d1c7c673af9fda87", "level": "error", "message": {"text": "Possible secret in scripts/verify-operator-audit.js"}, "properties": {"repobilityId": "51bf67119189907c", "scanner": "scanner-primary", "fingerprint": "d1c7c673af9fda87", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/verify-operator-audit.js"}, "region": {"startLine": 9}}}]}, {"ruleId": "scanner-974d39ad70d2744c", "level": "error", "message": {"text": "Possible secret in scripts/reset-user-password.mjs"}, "properties": {"repobilityId": "0a163bdc4d824264", "scanner": "scanner-primary", "fingerprint": "974d39ad70d2744c", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/reset-user-password.mjs"}, "region": {"startLine": 44}}}]}, {"ruleId": "scanner-19d66528069acccb", "level": "note", "message": {"text": "Very large file: app/(clinic)/[clinicId]/calendar/CalendarClient.tsx (1498 lines)"}, "properties": {"repobilityId": "ceba28666e7ff205", "scanner": "scanner-primary", "fingerprint": "19d66528069acccb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-19e6259c0b5fc1aa", "level": "note", "message": {"text": "Very large file: app/(clinic)/[clinicId]/inbox/page.tsx (1441 lines)"}, "properties": {"repobilityId": "e073fa69d070ba0a", "scanner": "scanner-primary", "fingerprint": "19e6259c0b5fc1aa", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-fea2808a915f2068", "level": "note", "message": {"text": "Very large file: app/api/whatsapp/webhook-v2/route.ts (3036 lines)"}, "properties": {"repobilityId": "1b673c0d91a5c723", "scanner": "scanner-primary", "fingerprint": "fea2808a915f2068", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-403a92cf67ed16a2", "level": "note", "message": {"text": "Very large file: app/api/whatsapp/webhook/route.ts (3101 lines)"}, "properties": {"repobilityId": "428a23953d03c625", "scanner": "scanner-primary", "fingerprint": "403a92cf67ed16a2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-18b246ca36b6778f", "level": "note", "message": {"text": "Very large file: app/onboarding/OnboardingWizard.tsx (1606 lines)"}, "properties": {"repobilityId": "27d481356fa5ec6d", "scanner": "scanner-primary", "fingerprint": "18b246ca36b6778f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-0c8a3642b9e6b3e3", "level": "note", "message": {"text": "Very large file: lib/prisma-client/commonInputTypes.ts (1136 lines)"}, "properties": {"repobilityId": "2a12dac652bb0e5f", "scanner": "scanner-primary", "fingerprint": "0c8a3642b9e6b3e3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ec1bfe7e3217efd8", "level": "note", "message": {"text": "Very large file: lib/prisma-client/models/Reminder.ts (1891 lines)"}, "properties": {"repobilityId": "8502a09cf47b2093", "scanner": "scanner-primary", "fingerprint": "ec1bfe7e3217efd8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9e097945ef7203e6", "level": "note", "message": {"text": "Very large file: lib/prisma-client/models/AvailableSlot.ts (1878 lines)"}, "properties": {"repobilityId": "967496151bd3152a", "scanner": "scanner-primary", "fingerprint": "9e097945ef7203e6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9d60cb5e78dcf6da", "level": "note", "message": {"text": "Very large file: lib/prisma-client/models/EscalationLog.ts (1691 lines)"}, "properties": {"repobilityId": "d83dd3036e41fe54", "scanner": "scanner-primary", "fingerprint": "9d60cb5e78dcf6da", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-dddde9745464f443", "level": "note", "message": {"text": "Very large file: lib/prisma-client/models/Membership.ts (1849 lines)"}, "properties": {"repobilityId": "0bb3ff3f24e971ce", "scanner": "scanner-primary", "fingerprint": "dddde9745464f443", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e704ba097b900a63", "level": "note", "message": {"text": "Very large file: lib/prisma-client/models/Message.ts (1820 lines)"}, "properties": {"repobilityId": "5f23e2cd159ed65a", "scanner": "scanner-primary", "fingerprint": "e704ba097b900a63", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-410618a0b31d54c3", "level": "note", "message": {"text": "Very large file: lib/prisma-client/models/Patient.ts (2290 lines)"}, "properties": {"repobilityId": "f111cf0485f421bb", "scanner": "scanner-primary", "fingerprint": "410618a0b31d54c3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-78fc7eb126cc90ef", "level": "note", "message": {"text": "Very large file: lib/prisma-client/models/BusinessHours.ts (1570 lines)"}, "properties": {"repobilityId": "257ed6f56e1ed423", "scanner": "scanner-primary", "fingerprint": "78fc7eb126cc90ef", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-964fc0759b62c58f", "level": "note", "message": {"text": "Very large file: lib/prisma-client/models/StateTransitionLog.ts (1479 lines)"}, "properties": {"repobilityId": "82226dfd967b6cde", "scanner": "scanner-primary", "fingerprint": "964fc0759b62c58f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a0dd6913b37240c5", "level": "note", "message": {"text": "Very large file: lib/prisma-client/models/Campaign.ts (1880 lines)"}, "properties": {"repobilityId": "dea6335ca4a043e7", "scanner": "scanner-primary", "fingerprint": "a0dd6913b37240c5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d18958afb01a6a0b", "level": "note", "message": {"text": "Very large file: lib/prisma-client/models/User.ts (2800 lines)"}, "properties": {"repobilityId": "f20c67a2ff36e453", "scanner": "scanner-primary", "fingerprint": "d18958afb01a6a0b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-5dbe82b0d0cb64b7", "level": "note", "message": {"text": "Very large file: lib/prisma-client/models/NotificationJob.ts (2396 lines)"}, "properties": {"repobilityId": "363d54ea86769611", "scanner": "scanner-primary", "fingerprint": "5dbe82b0d0cb64b7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-150db5a284d380e6", "level": "note", "message": {"text": "Very large file: lib/prisma-client/models/Clinic.ts (5687 lines)"}, "properties": {"repobilityId": "41006b16de41b079", "scanner": "scanner-primary", "fingerprint": "150db5a284d380e6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-96297343e9d8b88f", "level": "note", "message": {"text": "Very large file: lib/prisma-client/models/Conversation.ts (2004 lines)"}, "properties": {"repobilityId": "c1166a02a7a2c51b", "scanner": "scanner-primary", "fingerprint": "96297343e9d8b88f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-746b073a081c1a53", "level": "note", "message": {"text": "Very large file: lib/prisma-client/models/Lead.ts (1485 lines)"}, "properties": {"repobilityId": "6629ade4ac3f9f88", "scanner": "scanner-primary", "fingerprint": "746b073a081c1a53", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b893c8e226fa3bd1", "level": "note", "message": {"text": "Very large file: lib/prisma-client/models/Doctor.ts (1981 lines)"}, "properties": {"repobilityId": "d6a0417ce5d5bb19", "scanner": "scanner-primary", "fingerprint": "b893c8e226fa3bd1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-451fe6dc20a86a32", "level": "note", "message": {"text": "Very large file: lib/prisma-client/models/ConversationMessage.ts (1747 lines)"}, "properties": {"repobilityId": "97fa194421fefebb", "scanner": "scanner-primary", "fingerprint": "451fe6dc20a86a32", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-386a09e3d740b551", "level": "note", "message": {"text": "Very large file: lib/prisma-client/models/GoogleCalendarConnection.ts (1592 lines)"}, "properties": {"repobilityId": "d7f319d5085a9b54", "scanner": "scanner-primary", "fingerprint": "386a09e3d740b551", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e734e418ef61bb0e", "level": "note", "message": {"text": "Very large file: lib/prisma-client/models/ConversationSession.ts (3396 lines)"}, "properties": {"repobilityId": "87ad09f5fc44b273", "scanner": "scanner-primary", "fingerprint": "e734e418ef61bb0e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b9c99bbb49d3f621", "level": "note", "message": {"text": "Very large file: lib/prisma-client/models/Service.ts (2026 lines)"}, "properties": {"repobilityId": "b9a0221fd7b0db66", "scanner": "scanner-primary", "fingerprint": "b9c99bbb49d3f621", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-2256faea67ef9146", "level": "note", "message": {"text": "Very large file: lib/prisma-client/models/Appointment.ts (3884 lines)"}, "properties": {"repobilityId": "89e02816aaabbef6", "scanner": "scanner-primary", "fingerprint": "2256faea67ef9146", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-213f4ea42d9926e4", "level": "note", "message": {"text": "Very large file: lib/prisma-client/models/ClinicSettings.ts (1519 lines)"}, "properties": {"repobilityId": "d82224e4ccfb1e75", "scanner": "scanner-primary", "fingerprint": "213f4ea42d9926e4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-8c81d70c65eefea0", "level": "note", "message": {"text": "Very large file: lib/prisma-client/internal/prismaNamespace.ts (2972 lines)"}, "properties": {"repobilityId": "c5acb4b8f445d64b", "scanner": "scanner-primary", "fingerprint": "8c81d70c65eefea0", "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": "87a7f690df6f31b8", "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": "1ede357f0222c7b0", "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": "2d9810d4774a1b6f", "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": "d74a89599fac88db", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "c192736ff6e1fac4", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-e725d2ab884fbd49", "level": "note", "message": {"text": "Multiple root agent instruction files without precedence"}, "properties": {"repobilityId": "1953db6c89508d22", "scanner": "scanner-primary", "fingerprint": "e725d2ab884fbd49", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["agent-instructions", "governance"]}}, {"ruleId": "scanner-78f70a2d6302f5d3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(clinic)/[clinicId]/settings/_components/ClinicSetupServices.tsx:40"}, "properties": {"repobilityId": "4f15db4d46de0c35", "scanner": "scanner-primary", "fingerprint": "78f70a2d6302f5d3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-74d56902fc44311f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(clinic)/[clinicId]/settings/_components/ClinicSetupDoctors.tsx:130"}, "properties": {"repobilityId": "84ac7cc0b1e6a6d4", "scanner": "scanner-primary", "fingerprint": "74d56902fc44311f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b04f3245035aca3f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(clinic)/[clinicId]/calendar/CalendarClient.tsx:478"}, "properties": {"repobilityId": "e5ab180caa51ce7c", "scanner": "scanner-primary", "fingerprint": "b04f3245035aca3f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ab4407670687ae88", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/cron/noshow-confirmation/route.ts:25"}, "properties": {"repobilityId": "c79ad0f775fd44c8", "scanner": "scanner-primary", "fingerprint": "ab4407670687ae88", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6e4ccbc9e6cb2386", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/payment/complete/page.tsx:70"}, "properties": {"repobilityId": "afc950a768d109a7", "scanner": "scanner-primary", "fingerprint": "6e4ccbc9e6cb2386", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-add3837bbef177f4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/onboarding/OnboardingWizard.tsx:409"}, "properties": {"repobilityId": "879c04731c598d98", "scanner": "scanner-primary", "fingerprint": "add3837bbef177f4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e76ef92fbbfc3ddd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/verify-recovery.mjs:63"}, "properties": {"repobilityId": "9606f77da4f0e180", "scanner": "scanner-primary", "fingerprint": "e76ef92fbbfc3ddd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a92f616e129976ab", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/qa-period-test.ts:18"}, "properties": {"repobilityId": "c99a9dbf86d61863", "scanner": "scanner-primary", "fingerprint": "a92f616e129976ab", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-32964a3011874673", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/qa-override-check.ts:19"}, "properties": {"repobilityId": "102c98c3e06e3d55", "scanner": "scanner-primary", "fingerprint": "32964a3011874673", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6819604d71000cda", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/qa-followup.ts:111"}, "properties": {"repobilityId": "91acb99e8936b86f", "scanner": "scanner-primary", "fingerprint": "6819604d71000cda", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0b53eeffab51a2c3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/qa-runner.ts:456"}, "properties": {"repobilityId": "4d42f56c457c3221", "scanner": "scanner-primary", "fingerprint": "0b53eeffab51a2c3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b1e78df070ad7ab9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/qa-escalation-validate.ts:45"}, "properties": {"repobilityId": "1b4490b6a0426e98", "scanner": "scanner-primary", "fingerprint": "b1e78df070ad7ab9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-76e7939ca520d217", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/qa/conversation-regression.ts:179"}, "properties": {"repobilityId": "74d3e6d593a2ebbf", "scanner": "scanner-primary", "fingerprint": "76e7939ca520d217", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ffec93d38cdbe0bb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/whatsapp/context-router.ts:130"}, "properties": {"repobilityId": "aa3212a75f7a36c6", "scanner": "scanner-primary", "fingerprint": "ffec93d38cdbe0bb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-74c04b4928fb05a7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/whatsapp/slot-extractor.ts:142"}, "properties": {"repobilityId": "98037ee95e996140", "scanner": "scanner-primary", "fingerprint": "74c04b4928fb05a7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-68fd93bdf7d5d4bf", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/whatsapp/meta-sender.ts:5"}, "properties": {"repobilityId": "9f15e2048b7fb948", "scanner": "scanner-primary", "fingerprint": "68fd93bdf7d5d4bf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0539905c0e0d55ee", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/notifications/send-whatsapp-job.ts:267"}, "properties": {"repobilityId": "33c60e3ca7f5076b", "scanner": "scanner-primary", "fingerprint": "0539905c0e0d55ee", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}]}]}