{"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-3f1ce6ad59e97597", "name": "Stray `console.log` in TS/JS \u2014 components/shared/timekeeping.tsx:129", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 components/shared/timekeeping.tsx:129"}, "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-9f9506274648705d", "name": "Stray `console.log` in TS/JS \u2014 components/shared/payroll-run-detail.tsx:134", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 components/shared/payroll-run-detail.tsx:134"}, "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-bf0275a9a23c8f99", "name": "Stray `console.log` in TS/JS \u2014 lib/store/db.ts:112", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/store/db.ts:112"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-225f4f8a97db07d1", "name": "Runtime dotenv file present in repo: .env.local", "shortDescription": {"text": "Runtime dotenv file present in repo: .env.local"}, "fullDescription": {"text": "`.env.local` looks like a runtime dotenv file. It contains secret-looking assignments for NEXT_PUBLIC_SUPABASE_ANON_KEY, SUPABASE_SERVICE_ROLE_KEY. Move real values to a secret manager and keep only `.env.example` style templates in source control."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-6372cebde0220094", "name": "No auth library detected", "shortDescription": {"text": "No auth library detected"}, "fullDescription": {"text": "The scanner did not find any standard auth library (JWT, OAuth, NextAuth, Auth0, etc.). The repo has auth/admin/session surface indicators, so auth may live in custom code, in a separate service, or be missing."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-865eee5838587fe1", "name": "Very large file: components/shared/timekeeping.tsx (1942 lines)", "shortDescription": {"text": "Very large file: components/shared/timekeeping.tsx (1942 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-125932b15ce08454", "name": "Very large file: components/shared/job-requests.tsx (1060 lines)", "shortDescription": {"text": "Very large file: components/shared/job-requests.tsx (1060 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-3d5325eb77dd2d5b", "name": "Very large file: components/shared/invoice-draft-editor.tsx (1320 lines)", "shortDescription": {"text": "Very large file: components/shared/invoice-draft-editor.tsx (1320 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-362cf717da52051a", "name": "Very large file: components/shared/quote-draft-editor.tsx (1108 lines)", "shortDescription": {"text": "Very large file: components/shared/quote-draft-editor.tsx (1108 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-79b81f753d5c3428", "name": "Very large file: supabase/seeds/calendar-events-original.ts (9964 lines)", "shortDescription": {"text": "Very large file: supabase/seeds/calendar-events-original.ts (9964 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-b064679d85200fb8", "name": "Very large file: lib/store/payroll.ts (1646 lines)", "shortDescription": {"text": "Very large file: lib/store/payroll.ts (1646 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-98299e151b8df472", "name": "Very large file: lib/store/invoices.ts (1341 lines)", "shortDescription": {"text": "Very large file: lib/store/invoices.ts (1341 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-a3144a6285d21833", "name": "Very large file: lib/store/db.ts (1815 lines)", "shortDescription": {"text": "Very large file: lib/store/db.ts (1815 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": "0 test file(s) for 126 source file(s) (ratio 0.00). 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 15 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 85 placeholder/mock markers across 26 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci, tests. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e34ec0c0f21973fe", "name": "Legacy-named symbol `aes_manual_events_v2` in scripts/import-local-to-supabase.mjs:22", "shortDescription": {"text": "Legacy-named symbol `aes_manual_events_v2` in scripts/import-local-to-supabase.mjs:22"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b8c87a54eddf4634", "name": "Legacy-named symbol `aes_manual_events_v2` in scripts/seed-from-export.mjs:42", "shortDescription": {"text": "Legacy-named symbol `aes_manual_events_v2` in scripts/seed-from-export.mjs:42"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5138c5b04fb15ee6", "name": "Commented-code block (9 lines) in components/layout/app-shell.tsx:9", "shortDescription": {"text": "Commented-code block (9 lines) in components/layout/app-shell.tsx:9"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d72eddf965decb53", "name": "Commented-code block (5 lines) in components/shared/timekeeping.tsx:204", "shortDescription": {"text": "Commented-code block (5 lines) in components/shared/timekeeping.tsx:204"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a1926d44cf662b82", "name": "Commented-code block (6 lines) in components/shared/job-requests.tsx:232", "shortDescription": {"text": "Commented-code block (6 lines) in components/shared/job-requests.tsx:232"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a44762d59a59de06", "name": "Commented-code block (5 lines) in components/shared/invoice-draft-editor.tsx:56", "shortDescription": {"text": "Commented-code block (5 lines) in components/shared/invoice-draft-editor.tsx:56"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-338875c02ea9f2be", "name": "Commented-code block (5 lines) in components/shared/payroll-run-detail.tsx:414", "shortDescription": {"text": "Commented-code block (5 lines) in components/shared/payroll-run-detail.tsx:414"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d18df41d1cc87847", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/shared/user-management.tsx:25", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/shared/user-management.tsx:25"}, "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-8cec9ea1d17e2be8", "name": "Commented-code block (5 lines) in components/shared/timesheet-review.tsx:138", "shortDescription": {"text": "Commented-code block (5 lines) in components/shared/timesheet-review.tsx:138"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5e00c6d6f36afce2", "name": "Commented-code block (5 lines) in components/shared/invoices-list.tsx:159", "shortDescription": {"text": "Commented-code block (5 lines) in components/shared/invoices-list.tsx:159"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4c8d0626e44fcf55", "name": "Commented-code block (5 lines) in components/shared/quote-pdf-view.tsx:179", "shortDescription": {"text": "Commented-code block (5 lines) in components/shared/quote-pdf-view.tsx: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-3973ec6d0530e64f", "name": "Commented-code block (5 lines) in components/shared/employee-picker.tsx:496", "shortDescription": {"text": "Commented-code block (5 lines) in components/shared/employee-picker.tsx:496"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-04dd299f9d44bd56", "name": "Commented-code block (8 lines) in components/shared/quote-draft-editor.tsx:149", "shortDescription": {"text": "Commented-code block (8 lines) in components/shared/quote-draft-editor.tsx:149"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c830f05c67f8c9f2", "name": "Commented-code block (5 lines) in components/shared/dashboard.tsx:283", "shortDescription": {"text": "Commented-code block (5 lines) in components/shared/dashboard.tsx:283"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ff04f04f91b36fe6", "name": "Commented-code block (6 lines) in components/shared/client-maintenance.tsx:226", "shortDescription": {"text": "Commented-code block (6 lines) in components/shared/client-maintenance.tsx:226"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f75457f9897088b1", "name": "Commented-code block (5 lines) in components/shared/payroll-pdf-view.tsx:96", "shortDescription": {"text": "Commented-code block (5 lines) in components/shared/payroll-pdf-view.tsx:96"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dcc17d9a41ef5b73", "name": "Commented-code block (5 lines) in lib/time-utils.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in lib/time-utils.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c91b3b645c622557", "name": "Commented-code block (6 lines) in lib/jobs/job-no.ts:5", "shortDescription": {"text": "Commented-code block (6 lines) in lib/jobs/job-no.ts:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fca87f7941a4608d", "name": "Legacy-named symbol `amplified_rate_active_profile_v1` in lib/rates/storage.ts:40", "shortDescription": {"text": "Legacy-named symbol `amplified_rate_active_profile_v1` in lib/rates/storage.ts:40"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bbc6b39e2fb9fe69", "name": "Commented-code block (7 lines) in lib/rates/line-calc.ts:100", "shortDescription": {"text": "Commented-code block (7 lines) in lib/rates/line-calc.ts:100"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5dc206e5363f63b3", "name": "Commented-code block (5 lines) in lib/rates/defaults.ts:28", "shortDescription": {"text": "Commented-code block (5 lines) in lib/rates/defaults.ts:28"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a80e42f96a07f8cf", "name": "Commented-code block (5 lines) in lib/supabase/client.ts:9", "shortDescription": {"text": "Commented-code block (5 lines) in lib/supabase/client.ts:9"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7d921594ec32a1aa", "name": "Commented-code block (7 lines) in lib/store/payroll.ts:130", "shortDescription": {"text": "Commented-code block (7 lines) in lib/store/payroll.ts:130"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e4805d911384b020", "name": "Commented-code block (6 lines) in lib/store/timekeeping.ts:71", "shortDescription": {"text": "Commented-code block (6 lines) in lib/store/timekeeping.ts:71"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0efe772f388518fb", "name": "Commented-code block (5 lines) in lib/store/invoices.ts:149", "shortDescription": {"text": "Commented-code block (5 lines) in lib/store/invoices.ts:149"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dba3bf35e570660d", "name": "Legacy-named symbol `aes_active_quote_v1` in lib/store/app-store.ts:48", "shortDescription": {"text": "Legacy-named symbol `aes_active_quote_v1` in lib/store/app-store.ts:48"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-dd6843503a65a821", "name": "Commented-code block (5 lines) in lib/store/quotes.ts:618", "shortDescription": {"text": "Commented-code block (5 lines) in lib/store/quotes.ts:618"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f8d232f6162440f0", "name": "Commented-code block (8 lines) in lib/store/types.ts:107", "shortDescription": {"text": "Commented-code block (8 lines) in lib/store/types.ts:107"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ea1379d504353397", "name": "Commented-code block (7 lines) in lib/store/db.ts:332", "shortDescription": {"text": "Commented-code block (7 lines) in lib/store/db.ts:332"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-250f57e8a1dbd3c5", "name": "4 env vars used in code but missing from .env.example", "shortDescription": {"text": "4 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `NEXT_PUBLIC_VERCEL_ENV`, `NEXT_PUBLIC_VERCEL_GIT_COMMIT_SHA`, `SUPABASE_SERVICE_ROLE_KEY`, `VERCEL_GIT_COMMIT_SHA`. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/24150"}, "properties": {"repository": "amplifiedmgtesl/Amplified-AOS", "repoUrl": "https://github.com/amplifiedmgtesl/Amplified-AOS", "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-3f1ce6ad59e97597", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 components/shared/timekeeping.tsx:129"}, "properties": {"repobilityId": "b6afbd368b452004", "scanner": "scanner-primary", "fingerprint": "3f1ce6ad59e97597", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9f9506274648705d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 components/shared/payroll-run-detail.tsx:134"}, "properties": {"repobilityId": "4d8760d133fa0d16", "scanner": "scanner-primary", "fingerprint": "9f9506274648705d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bf0275a9a23c8f99", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/store/db.ts:112"}, "properties": {"repobilityId": "87ecf07338a7a80f", "scanner": "scanner-primary", "fingerprint": "bf0275a9a23c8f99", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-225f4f8a97db07d1", "level": "error", "message": {"text": "Runtime dotenv file present in repo: .env.local"}, "properties": {"repobilityId": "a6b37d8a97ca199c", "scanner": "scanner-primary", "fingerprint": "225f4f8a97db07d1", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets", "config", "env-file", "runtime-env", "env_file_with_secret"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".env.local"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6372cebde0220094", "level": "warning", "message": {"text": "No auth library detected"}, "properties": {"repobilityId": "a5b6035a5bbf8054", "scanner": "scanner-primary", "fingerprint": "6372cebde0220094", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["coverage", "auth"]}}, {"ruleId": "scanner-865eee5838587fe1", "level": "note", "message": {"text": "Very large file: components/shared/timekeeping.tsx (1942 lines)"}, "properties": {"repobilityId": "a4cd2f6d84b70d19", "scanner": "scanner-primary", "fingerprint": "865eee5838587fe1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-125932b15ce08454", "level": "note", "message": {"text": "Very large file: components/shared/job-requests.tsx (1060 lines)"}, "properties": {"repobilityId": "c432132ea16d7839", "scanner": "scanner-primary", "fingerprint": "125932b15ce08454", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3d5325eb77dd2d5b", "level": "note", "message": {"text": "Very large file: components/shared/invoice-draft-editor.tsx (1320 lines)"}, "properties": {"repobilityId": "6e8aafb0492e44f9", "scanner": "scanner-primary", "fingerprint": "3d5325eb77dd2d5b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-362cf717da52051a", "level": "note", "message": {"text": "Very large file: components/shared/quote-draft-editor.tsx (1108 lines)"}, "properties": {"repobilityId": "7e762f8a4ca9c35a", "scanner": "scanner-primary", "fingerprint": "362cf717da52051a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-79b81f753d5c3428", "level": "note", "message": {"text": "Very large file: supabase/seeds/calendar-events-original.ts (9964 lines)"}, "properties": {"repobilityId": "bf47481230b21f24", "scanner": "scanner-primary", "fingerprint": "79b81f753d5c3428", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b064679d85200fb8", "level": "note", "message": {"text": "Very large file: lib/store/payroll.ts (1646 lines)"}, "properties": {"repobilityId": "1daeb1d5f2f95548", "scanner": "scanner-primary", "fingerprint": "b064679d85200fb8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-98299e151b8df472", "level": "note", "message": {"text": "Very large file: lib/store/invoices.ts (1341 lines)"}, "properties": {"repobilityId": "2707a3ad1d694e7f", "scanner": "scanner-primary", "fingerprint": "98299e151b8df472", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a3144a6285d21833", "level": "note", "message": {"text": "Very large file: lib/store/db.ts (1815 lines)"}, "properties": {"repobilityId": "4e91e4f79a21f953", "scanner": "scanner-primary", "fingerprint": "a3144a6285d21833", "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": "a8bd6f3ab5d4f412", "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": "fff0d5b1fd4879c1", "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": "10fc245cdd900eaa", "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": "fd4d7c7029685940", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "4e0b7538583f84fa", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-e34ec0c0f21973fe", "level": "note", "message": {"text": "Legacy-named symbol `aes_manual_events_v2` in scripts/import-local-to-supabase.mjs:22"}, "properties": {"repobilityId": "99d861fa6f4af2d7", "scanner": "scanner-primary", "fingerprint": "e34ec0c0f21973fe", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b8c87a54eddf4634", "level": "note", "message": {"text": "Legacy-named symbol `aes_manual_events_v2` in scripts/seed-from-export.mjs:42"}, "properties": {"repobilityId": "866a0302df2fb4bd", "scanner": "scanner-primary", "fingerprint": "b8c87a54eddf4634", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-5138c5b04fb15ee6", "level": "none", "message": {"text": "Commented-code block (9 lines) in components/layout/app-shell.tsx:9"}, "properties": {"repobilityId": "b76187811e186240", "scanner": "scanner-primary", "fingerprint": "5138c5b04fb15ee6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d72eddf965decb53", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/shared/timekeeping.tsx:204"}, "properties": {"repobilityId": "ace92e662f225fc3", "scanner": "scanner-primary", "fingerprint": "d72eddf965decb53", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a1926d44cf662b82", "level": "none", "message": {"text": "Commented-code block (6 lines) in components/shared/job-requests.tsx:232"}, "properties": {"repobilityId": "af9815fcde368905", "scanner": "scanner-primary", "fingerprint": "a1926d44cf662b82", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a44762d59a59de06", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/shared/invoice-draft-editor.tsx:56"}, "properties": {"repobilityId": "7fea57df6bae4bf6", "scanner": "scanner-primary", "fingerprint": "a44762d59a59de06", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-338875c02ea9f2be", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/shared/payroll-run-detail.tsx:414"}, "properties": {"repobilityId": "5e6749461bd4b9f5", "scanner": "scanner-primary", "fingerprint": "338875c02ea9f2be", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d18df41d1cc87847", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/shared/user-management.tsx:25"}, "properties": {"repobilityId": "4bacf3bfcd130bde", "scanner": "scanner-primary", "fingerprint": "d18df41d1cc87847", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8cec9ea1d17e2be8", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/shared/timesheet-review.tsx:138"}, "properties": {"repobilityId": "4e5db6d311e2f4a1", "scanner": "scanner-primary", "fingerprint": "8cec9ea1d17e2be8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5e00c6d6f36afce2", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/shared/invoices-list.tsx:159"}, "properties": {"repobilityId": "f8a8a466fc85e54a", "scanner": "scanner-primary", "fingerprint": "5e00c6d6f36afce2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4c8d0626e44fcf55", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/shared/quote-pdf-view.tsx:179"}, "properties": {"repobilityId": "94f6040658790aa1", "scanner": "scanner-primary", "fingerprint": "4c8d0626e44fcf55", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3973ec6d0530e64f", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/shared/employee-picker.tsx:496"}, "properties": {"repobilityId": "05fbb16e30dda27e", "scanner": "scanner-primary", "fingerprint": "3973ec6d0530e64f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-04dd299f9d44bd56", "level": "none", "message": {"text": "Commented-code block (8 lines) in components/shared/quote-draft-editor.tsx:149"}, "properties": {"repobilityId": "5f7e6788f0c33d9e", "scanner": "scanner-primary", "fingerprint": "04dd299f9d44bd56", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c830f05c67f8c9f2", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/shared/dashboard.tsx:283"}, "properties": {"repobilityId": "90770c6299352c46", "scanner": "scanner-primary", "fingerprint": "c830f05c67f8c9f2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ff04f04f91b36fe6", "level": "none", "message": {"text": "Commented-code block (6 lines) in components/shared/client-maintenance.tsx:226"}, "properties": {"repobilityId": "a83a449b2ac88801", "scanner": "scanner-primary", "fingerprint": "ff04f04f91b36fe6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f75457f9897088b1", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/shared/payroll-pdf-view.tsx:96"}, "properties": {"repobilityId": "fc3d7344460a54a2", "scanner": "scanner-primary", "fingerprint": "f75457f9897088b1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dcc17d9a41ef5b73", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/time-utils.ts:3"}, "properties": {"repobilityId": "cb154a0096f6205f", "scanner": "scanner-primary", "fingerprint": "dcc17d9a41ef5b73", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c91b3b645c622557", "level": "none", "message": {"text": "Commented-code block (6 lines) in lib/jobs/job-no.ts:5"}, "properties": {"repobilityId": "58ed68d208d571b2", "scanner": "scanner-primary", "fingerprint": "c91b3b645c622557", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fca87f7941a4608d", "level": "note", "message": {"text": "Legacy-named symbol `amplified_rate_active_profile_v1` in lib/rates/storage.ts:40"}, "properties": {"repobilityId": "aba823baf7295740", "scanner": "scanner-primary", "fingerprint": "fca87f7941a4608d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-bbc6b39e2fb9fe69", "level": "none", "message": {"text": "Commented-code block (7 lines) in lib/rates/line-calc.ts:100"}, "properties": {"repobilityId": "a344cd05e0cfa91f", "scanner": "scanner-primary", "fingerprint": "bbc6b39e2fb9fe69", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5dc206e5363f63b3", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/rates/defaults.ts:28"}, "properties": {"repobilityId": "05a3cd7fd395c170", "scanner": "scanner-primary", "fingerprint": "5dc206e5363f63b3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a80e42f96a07f8cf", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/supabase/client.ts:9"}, "properties": {"repobilityId": "d946b38cee484fc7", "scanner": "scanner-primary", "fingerprint": "a80e42f96a07f8cf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7d921594ec32a1aa", "level": "none", "message": {"text": "Commented-code block (7 lines) in lib/store/payroll.ts:130"}, "properties": {"repobilityId": "52995669a18027dd", "scanner": "scanner-primary", "fingerprint": "7d921594ec32a1aa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e4805d911384b020", "level": "none", "message": {"text": "Commented-code block (6 lines) in lib/store/timekeeping.ts:71"}, "properties": {"repobilityId": "d152e0ff0aedc1f7", "scanner": "scanner-primary", "fingerprint": "e4805d911384b020", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0efe772f388518fb", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/store/invoices.ts:149"}, "properties": {"repobilityId": "0ba9b34622d88671", "scanner": "scanner-primary", "fingerprint": "0efe772f388518fb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dba3bf35e570660d", "level": "note", "message": {"text": "Legacy-named symbol `aes_active_quote_v1` in lib/store/app-store.ts:48"}, "properties": {"repobilityId": "6b2b1e9950ee4dff", "scanner": "scanner-primary", "fingerprint": "dba3bf35e570660d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-dd6843503a65a821", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/store/quotes.ts:618"}, "properties": {"repobilityId": "8610d67d55a3d710", "scanner": "scanner-primary", "fingerprint": "dd6843503a65a821", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f8d232f6162440f0", "level": "none", "message": {"text": "Commented-code block (8 lines) in lib/store/types.ts:107"}, "properties": {"repobilityId": "d729294dd3933a59", "scanner": "scanner-primary", "fingerprint": "f8d232f6162440f0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ea1379d504353397", "level": "none", "message": {"text": "Commented-code block (7 lines) in lib/store/db.ts:332"}, "properties": {"repobilityId": "551d103019cb3fea", "scanner": "scanner-primary", "fingerprint": "ea1379d504353397", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-250f57e8a1dbd3c5", "level": "none", "message": {"text": "4 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "57584f22b735b5ee", "scanner": "scanner-primary", "fingerprint": "250f57e8a1dbd3c5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}]}]}