{"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-319542724bf70d10", "name": "Stray `console.log` in TS/JS \u2014 proxy.ts:53", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 proxy.ts:53"}, "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-79652537f5544acf", "name": "Stray `console.log` in TS/JS \u2014 scripts/generate-footer-band.ts:85", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generate-footer-band.ts: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-69251e840d9e72c0", "name": "`truncate` class without `title=` for hover reveal \u2014 components/sidebar.tsx:178", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/sidebar.tsx:178"}, "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-48ca5c012e503a01", "name": "`truncate` class without `title=` for hover reveal \u2014 components/bookings/booking-modal.tsx:753", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/bookings/booking-modal.tsx:753"}, "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-c02b59cf24dfaceb", "name": "`truncate` class without `title=` for hover reveal \u2014 components/ui/photo-upload.tsx:330", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ui/photo-upload.tsx:330"}, "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-c2458d736110da8c", "name": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/service-sheets-to-fill.tsx:46", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/service-sheets-to-fill.tsx:46"}, "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-36393b4d49fc44a3", "name": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/customers-to-contact.tsx:53", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/customers-to-contact.tsx:53"}, "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-5e92ed4cca464b1a", "name": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/upcoming-visits.tsx:98", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/upcoming-visits.tsx:98"}, "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-aad7f8b302d154da", "name": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/jobs-today.tsx:54", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/jobs-today.tsx:54"}, "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-d21ebfc2957ce97d", "name": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/tasks-due.tsx:40", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/tasks-due.tsx:40"}, "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-d8f8ecd6345648e2", "name": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/review-requests.tsx:142", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/review-requests.tsx:142"}, "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-3f098cd52870abe9", "name": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/expiring-agreements.tsx:74", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/expiring-agreements.tsx:74"}, "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-bbf84ad52a66e2b1", "name": "`truncate` class without `title=` for hover reveal \u2014 components/customers/customers-table.tsx:101", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/customers/customers-table.tsx:101"}, "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-dc32f87e45adf444", "name": "`truncate` class without `title=` for hover reveal \u2014 components/customers/customer-side-panel.tsx:333", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/customers/customer-side-panel.tsx:333"}, "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-3aa678cb1d4b9e1b", "name": "`truncate` class without `title=` for hover reveal \u2014 components/calendar/month-calendar.tsx:207", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/calendar/month-calendar.tsx:207"}, "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-b120416e7352c9a2", "name": "`truncate` class without `title=` for hover reveal \u2014 components/invoices/invoice-creator-modal.tsx:446", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/invoices/invoice-creator-modal.tsx:446"}, "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-a226b80c704a4e19", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/jobs/page.tsx:453", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/jobs/page.tsx:453"}, "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-a361d36dfd5a8a87", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/calendar/page.tsx:202", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/calendar/page.tsx:202"}, "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-23164f12d36757cd", "name": "Stray `console.log` in TS/JS \u2014 lib/services/email.ts:78", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/services/email.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-7e558b6fc4a44939", "name": "TODO/FIXME marker in shipping code \u2014 lib/services/review-message.ts:88", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 lib/services/review-message.ts:88"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-495c795e1e7c4e4f", "name": "Stray `console.log` in TS/JS \u2014 lib/services/review-message.ts:86", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/services/review-message.ts:86"}, "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-1706a59f9dddf4cb", "name": "Stray `console.log` in TS/JS \u2014 lib/db/dev.ts:30", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/db/dev.ts:30"}, "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-3af732bcb6a49112", "name": "Possible secret in scripts/local-db-rebuild.sh", "shortDescription": {"text": "Possible secret in scripts/local-db-rebuild.sh"}, "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-ef48ac64bf9d18a1", "name": "Possible secret in app/(app)/settings/actions.ts", "shortDescription": {"text": "Possible secret in app/(app)/settings/actions.ts"}, "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-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-18e7693720710036", "name": "Very large file: components/customers/customer-side-panel.tsx (1281 lines)", "shortDescription": {"text": "Very large file: components/customers/customer-side-panel.tsx (1281 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-30154b1efeb934f9", "name": "Very large file: components/jobs/service-sheet-form.tsx (1228 lines)", "shortDescription": {"text": "Very large file: components/jobs/service-sheet-form.tsx (1228 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-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 8 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 105 placeholder/mock markers across 32 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-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-c7f2eed1d5c3fb8c", "name": "Commented-code block (9 lines) in eslint.config.mjs:18", "shortDescription": {"text": "Commented-code block (9 lines) in eslint.config.mjs:18"}, "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-7cddc61aa5d92e6b", "name": "Commented-code block (8 lines) in proxy.ts:14", "shortDescription": {"text": "Commented-code block (8 lines) in proxy.ts:14"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-661bbf6f5e1f3dd4", "name": "Commented-code block (11 lines) in next.config.ts:15", "shortDescription": {"text": "Commented-code block (11 lines) in next.config.ts:15"}, "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-95d63b6c4e04242e", "name": "Commented-code block (6 lines) in test/sync/server-reachable.test.ts:36", "shortDescription": {"text": "Commented-code block (6 lines) in test/sync/server-reachable.test.ts:36"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dfd95a8b74e2e715", "name": "Commented-code block (6 lines) in test/components/sync/sync-boot.test.tsx:124", "shortDescription": {"text": "Commented-code block (6 lines) in test/components/sync/sync-boot.test.tsx:124"}, "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-cc3b1784f1f78d2e", "name": "Commented-code block (5 lines) in test/components/customers/customer-side-panel.test.tsx:28", "shortDescription": {"text": "Commented-code block (5 lines) in test/components/customers/customer-side-panel.test.tsx: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-3a35d65ebc30b35f", "name": "Commented-code block (8 lines) in test/components/jobs/complete-page-gate.test.tsx:212", "shortDescription": {"text": "Commented-code block (8 lines) in test/components/jobs/complete-page-gate.test.tsx:212"}, "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-2536eedf0989aa7a", "name": "Commented-code block (6 lines) in test/app/customers-list.test.tsx:43", "shortDescription": {"text": "Commented-code block (6 lines) in test/app/customers-list.test.tsx:43"}, "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-314fc79f8028cd2e", "name": "Commented-code block (5 lines) in scripts/generate-footer-band.ts:75", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/generate-footer-band.ts:75"}, "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-cae2b4ccaef03b7c", "name": "Commented-code block (5 lines) in components/sync/sync-boot.tsx:90", "shortDescription": {"text": "Commented-code block (5 lines) in components/sync/sync-boot.tsx:90"}, "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-240a68010bfabb19", "name": "Commented-code block (7 lines) in components/bookings/booking-modal.tsx:33", "shortDescription": {"text": "Commented-code block (7 lines) in components/bookings/booking-modal.tsx:33"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2f9e21d117432705", "name": "Commented-code block (8 lines) in components/ui/photo-upload.tsx:91", "shortDescription": {"text": "Commented-code block (8 lines) in components/ui/photo-upload.tsx:91"}, "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-4fa94cd656923497", "name": "Commented-code block (8 lines) in components/ui/signature-pad.tsx:49", "shortDescription": {"text": "Commented-code block (8 lines) in components/ui/signature-pad.tsx:49"}, "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-056d159facd9d17a", "name": "Commented-code block (5 lines) in components/dashboard/upcoming-visits.tsx:16", "shortDescription": {"text": "Commented-code block (5 lines) in components/dashboard/upcoming-visits.tsx:16"}, "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-bb385041bbab5f70", "name": "Commented-code block (6 lines) in components/dashboard/dashboard-customisation-bar.tsx:34", "shortDescription": {"text": "Commented-code block (6 lines) in components/dashboard/dashboard-customisation-bar.tsx:34"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f3a17d751b0bcc6f", "name": "Commented-code block (5 lines) in components/customers/customers-table.tsx:16", "shortDescription": {"text": "Commented-code block (5 lines) in components/customers/customers-table.tsx:16"}, "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-095ef3c7539f1914", "name": "Commented-code block (5 lines) in components/customers/delete-customer-confirm.tsx:11", "shortDescription": {"text": "Commented-code block (5 lines) in components/customers/delete-customer-confirm.tsx:11"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6bcf88312a64fc59", "name": "Commented-code block (6 lines) in components/customers/customer-side-panel.tsx:22", "shortDescription": {"text": "Commented-code block (6 lines) in components/customers/customer-side-panel.tsx:22"}, "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-0679e6817ec9de4a", "name": "Commented-code block (5 lines) in components/agreements/add-agreement-form.tsx:58", "shortDescription": {"text": "Commented-code block (5 lines) in components/agreements/add-agreement-form.tsx:58"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f27e2cfa0f0cc424", "name": "Commented-code block (5 lines) in components/documents/doc-ready-provider.tsx:142", "shortDescription": {"text": "Commented-code block (5 lines) in components/documents/doc-ready-provider.tsx:142"}, "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-0c706eb2078b5390", "name": "Commented-code block (5 lines) in components/jobs/service-sheet-form.tsx:79", "shortDescription": {"text": "Commented-code block (5 lines) in components/jobs/service-sheet-form.tsx:79"}, "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-fec7210e837caa5d", "name": "Commented-code block (5 lines) in components/jobs/report-actions.tsx:20", "shortDescription": {"text": "Commented-code block (5 lines) in components/jobs/report-actions.tsx:20"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-83655c3e6c92d1d2", "name": "Commented-code block (5 lines) in components/invoices/create-invoice-button.tsx:17", "shortDescription": {"text": "Commented-code block (5 lines) in components/invoices/create-invoice-button.tsx:17"}, "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-ac05b195640030a8", "name": "Commented-code block (6 lines) in app/(app)/layout.tsx:6", "shortDescription": {"text": "Commented-code block (6 lines) in app/(app)/layout.tsx:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1735c5b263b9ddcb", "name": "Commented-code block (6 lines) in app/(app)/error.tsx:52", "shortDescription": {"text": "Commented-code block (6 lines) in app/(app)/error.tsx:52"}, "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-ede7c2c9159dca28", "name": "Commented-code block (6 lines) in app/(app)/bookings/actions.ts:133", "shortDescription": {"text": "Commented-code block (6 lines) in app/(app)/bookings/actions.ts:133"}, "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-09bb101b41b0534e", "name": "Commented-code block (5 lines) in app/(app)/dashboard/page.tsx:181", "shortDescription": {"text": "Commented-code block (5 lines) in app/(app)/dashboard/page.tsx:181"}, "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-0a9c5b9dc5f52e4c", "name": "Commented-code block (6 lines) in app/(app)/customers/actions.ts:30", "shortDescription": {"text": "Commented-code block (6 lines) in app/(app)/customers/actions.ts:30"}, "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-919b8f4569ce568a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/customers/actions.ts:231", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/customers/actions.ts:231"}, "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-1fe845a4c19480ed", "name": "Commented-code block (6 lines) in app/(app)/customers/[id]/sites/actions.ts:27", "shortDescription": {"text": "Commented-code block (6 lines) in app/(app)/customers/[id]/sites/actions.ts:27"}, "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-efcbc5511ea5877d", "name": "Commented-code block (7 lines) in app/(app)/jobs/page.tsx:334", "shortDescription": {"text": "Commented-code block (7 lines) in app/(app)/jobs/page.tsx:334"}, "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-84de4e1a65661f0d", "name": "Commented-code block (6 lines) in app/(app)/jobs/[id]/complete/actions.ts:95", "shortDescription": {"text": "Commented-code block (6 lines) in app/(app)/jobs/[id]/complete/actions.ts:95"}, "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-7a2d7299a77a0206", "name": "Commented-code block (6 lines) in app/(app)/jobs/[id]/complete/page.tsx:133", "shortDescription": {"text": "Commented-code block (6 lines) in app/(app)/jobs/[id]/complete/page.tsx:133"}, "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-ecf3fb08c20243e3", "name": "Commented-code block (5 lines) in app/(app)/sites/[id]/bookings/actions.ts:46", "shortDescription": {"text": "Commented-code block (5 lines) in app/(app)/sites/[id]/bookings/actions.ts:46"}, "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-f0cbdc95541903d0", "name": "Commented-code block (6 lines) in app/(app)/sites/[id]/agreements/actions.ts:48", "shortDescription": {"text": "Commented-code block (6 lines) in app/(app)/sites/[id]/agreements/actions.ts:48"}, "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-a00d986affd34058", "name": "Commented-code block (5 lines) in lib/sync/registry.ts:81", "shortDescription": {"text": "Commented-code block (5 lines) in lib/sync/registry.ts:81"}, "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-675bb4e9def2b8b8", "name": "Commented-code block (8 lines) in lib/sync/push.ts:142", "shortDescription": {"text": "Commented-code block (8 lines) in lib/sync/push.ts:142"}, "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-773ff11115763099", "name": "Commented-code block (8 lines) in lib/sync/pull.ts:150", "shortDescription": {"text": "Commented-code block (8 lines) in lib/sync/pull.ts:150"}, "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-4290c963132d60b7", "name": "Commented-code block (7 lines) in lib/sync/http-classify.ts:111", "shortDescription": {"text": "Commented-code block (7 lines) in lib/sync/http-classify.ts:111"}, "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-3f3f9fc8ab5d78bb", "name": "Commented-code block (9 lines) in lib/sync/engine.ts:115", "shortDescription": {"text": "Commented-code block (9 lines) in lib/sync/engine.ts:115"}, "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-1c2144aa67d2d529", "name": "Commented-code block (7 lines) in lib/services/job-events.ts:78", "shortDescription": {"text": "Commented-code block (7 lines) in lib/services/job-events.ts:78"}, "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-3ed2bd95b5919231", "name": "Commented-code block (7 lines) in lib/db/index.ts:187", "shortDescription": {"text": "Commented-code block (7 lines) in lib/db/index.ts:187"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7e43dcf554cdc664", "name": "Commented-code block (5 lines) in lib/actions/wrap.ts:74", "shortDescription": {"text": "Commented-code block (5 lines) in lib/actions/wrap.ts:74"}, "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-de11041897cf333e", "name": "Commented-code block (6 lines) in lib/pdf/footer-band.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in lib/pdf/footer-band.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9a7f23414a276277", "name": "Commented-code block (5 lines) in lib/pdf/html-to-pdf.ts:109", "shortDescription": {"text": "Commented-code block (5 lines) in lib/pdf/html-to-pdf.ts:109"}, "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-75c81508d2a2b615", "name": "Commented-code block (5 lines) in lib/pdf/templates/invoice-template.ts:74", "shortDescription": {"text": "Commented-code block (5 lines) in lib/pdf/templates/invoice-template.ts:74"}, "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-12f85bb3a5f3fb30", "name": "Commented-code block (5 lines) in public/sw.js:171", "shortDescription": {"text": "Commented-code block (5 lines) in public/sw.js:171"}, "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-8e047ab7af03962f", "name": "7 env vars used in code but missing from .env.example", "shortDescription": {"text": "7 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `AWS_LAMBDA_FUNCTION_NAME`, `NODE_ENV`, `REVIEW_LINK_URL`, `TWILIO_ACCOUNT_SID`, `TWILIO_AUTH_TOKEN`, `TWILIO_FROM`, `VERCEL`. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/20847"}, "properties": {"repository": "taverncreative/GEMcrm", "repoUrl": "https://github.com/taverncreative/GEMcrm", "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-319542724bf70d10", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 proxy.ts:53"}, "properties": {"repobilityId": "6ae6c27d89f1b987", "scanner": "scanner-primary", "fingerprint": "319542724bf70d10", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-79652537f5544acf", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generate-footer-band.ts:85"}, "properties": {"repobilityId": "f18fe512033f248f", "scanner": "scanner-primary", "fingerprint": "79652537f5544acf", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-69251e840d9e72c0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/sidebar.tsx:178"}, "properties": {"repobilityId": "cfa5ec5bb6df9c4f", "scanner": "scanner-primary", "fingerprint": "69251e840d9e72c0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-48ca5c012e503a01", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/bookings/booking-modal.tsx:753"}, "properties": {"repobilityId": "5aa60c416d2e8586", "scanner": "scanner-primary", "fingerprint": "48ca5c012e503a01", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c02b59cf24dfaceb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ui/photo-upload.tsx:330"}, "properties": {"repobilityId": "45172f6d236b24a6", "scanner": "scanner-primary", "fingerprint": "c02b59cf24dfaceb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c2458d736110da8c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/service-sheets-to-fill.tsx:46"}, "properties": {"repobilityId": "5664e6629e33c995", "scanner": "scanner-primary", "fingerprint": "c2458d736110da8c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-36393b4d49fc44a3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/customers-to-contact.tsx:53"}, "properties": {"repobilityId": "53bef4dc4e73c23f", "scanner": "scanner-primary", "fingerprint": "36393b4d49fc44a3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5e92ed4cca464b1a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/upcoming-visits.tsx:98"}, "properties": {"repobilityId": "c10732a9a53cde7f", "scanner": "scanner-primary", "fingerprint": "5e92ed4cca464b1a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-aad7f8b302d154da", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/jobs-today.tsx:54"}, "properties": {"repobilityId": "4b88bf1b900ede45", "scanner": "scanner-primary", "fingerprint": "aad7f8b302d154da", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d21ebfc2957ce97d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/tasks-due.tsx:40"}, "properties": {"repobilityId": "cce054bb727e806f", "scanner": "scanner-primary", "fingerprint": "d21ebfc2957ce97d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d8f8ecd6345648e2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/review-requests.tsx:142"}, "properties": {"repobilityId": "17639053d2d5966a", "scanner": "scanner-primary", "fingerprint": "d8f8ecd6345648e2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3f098cd52870abe9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/expiring-agreements.tsx:74"}, "properties": {"repobilityId": "b32e329ca287aa8e", "scanner": "scanner-primary", "fingerprint": "3f098cd52870abe9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bbf84ad52a66e2b1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/customers/customers-table.tsx:101"}, "properties": {"repobilityId": "1fc95e2eb0088814", "scanner": "scanner-primary", "fingerprint": "bbf84ad52a66e2b1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dc32f87e45adf444", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/customers/customer-side-panel.tsx:333"}, "properties": {"repobilityId": "ef46ea7fddc257ea", "scanner": "scanner-primary", "fingerprint": "dc32f87e45adf444", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3aa678cb1d4b9e1b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/calendar/month-calendar.tsx:207"}, "properties": {"repobilityId": "00010fad42d72e17", "scanner": "scanner-primary", "fingerprint": "3aa678cb1d4b9e1b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b120416e7352c9a2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/invoices/invoice-creator-modal.tsx:446"}, "properties": {"repobilityId": "1d0ecec19ca0a56d", "scanner": "scanner-primary", "fingerprint": "b120416e7352c9a2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a226b80c704a4e19", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/jobs/page.tsx:453"}, "properties": {"repobilityId": "fe7bc7d3dc3029c2", "scanner": "scanner-primary", "fingerprint": "a226b80c704a4e19", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a361d36dfd5a8a87", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/calendar/page.tsx:202"}, "properties": {"repobilityId": "3925af2237c50190", "scanner": "scanner-primary", "fingerprint": "a361d36dfd5a8a87", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-23164f12d36757cd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/services/email.ts:78"}, "properties": {"repobilityId": "cc43c64cf02de9b3", "scanner": "scanner-primary", "fingerprint": "23164f12d36757cd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7e558b6fc4a44939", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 lib/services/review-message.ts:88"}, "properties": {"repobilityId": "9bc09ca5cc6fc8fd", "scanner": "scanner-primary", "fingerprint": "7e558b6fc4a44939", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-495c795e1e7c4e4f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/services/review-message.ts:86"}, "properties": {"repobilityId": "5477a882dca5cf61", "scanner": "scanner-primary", "fingerprint": "495c795e1e7c4e4f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1706a59f9dddf4cb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/db/dev.ts:30"}, "properties": {"repobilityId": "309fc34ad2403e35", "scanner": "scanner-primary", "fingerprint": "1706a59f9dddf4cb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3af732bcb6a49112", "level": "error", "message": {"text": "Possible secret in scripts/local-db-rebuild.sh"}, "properties": {"repobilityId": "bd0ed848876fd5d1", "scanner": "scanner-primary", "fingerprint": "3af732bcb6a49112", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/local-db-rebuild.sh"}, "region": {"startLine": 23}}}]}, {"ruleId": "scanner-ef48ac64bf9d18a1", "level": "error", "message": {"text": "Possible secret in app/(app)/settings/actions.ts"}, "properties": {"repobilityId": "782103d63b9f0f53", "scanner": "scanner-primary", "fingerprint": "ef48ac64bf9d18a1", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/(app)/settings/actions.ts"}, "region": {"startLine": 187}}}]}, {"ruleId": "scanner-ef48ac64bf9d18a1", "level": "error", "message": {"text": "Possible secret in app/(app)/settings/actions.ts"}, "properties": {"repobilityId": "782103d63b9f0f53", "scanner": "scanner-primary", "fingerprint": "ef48ac64bf9d18a1", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/(app)/settings/actions.ts"}, "region": {"startLine": 188}}}]}, {"ruleId": "scanner-ef48ac64bf9d18a1", "level": "error", "message": {"text": "Possible secret in app/(app)/settings/actions.ts"}, "properties": {"repobilityId": "782103d63b9f0f53", "scanner": "scanner-primary", "fingerprint": "ef48ac64bf9d18a1", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/(app)/settings/actions.ts"}, "region": {"startLine": 189}}}]}, {"ruleId": "scanner-ef48ac64bf9d18a1", "level": "error", "message": {"text": "Possible secret in app/(app)/settings/actions.ts"}, "properties": {"repobilityId": "782103d63b9f0f53", "scanner": "scanner-primary", "fingerprint": "ef48ac64bf9d18a1", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/(app)/settings/actions.ts"}, "region": {"startLine": 208}}}]}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-18e7693720710036", "level": "note", "message": {"text": "Very large file: components/customers/customer-side-panel.tsx (1281 lines)"}, "properties": {"repobilityId": "d6be8fbc850ef3a8", "scanner": "scanner-primary", "fingerprint": "18e7693720710036", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-30154b1efeb934f9", "level": "note", "message": {"text": "Very large file: components/jobs/service-sheet-form.tsx (1228 lines)"}, "properties": {"repobilityId": "993eeefb55c5d487", "scanner": "scanner-primary", "fingerprint": "30154b1efeb934f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "96a4908076ece733", "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": "f1f51db60d0a4cf5", "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": "4734a5f24efacbb3", "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": "df32f1eadde68cba", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "3f53e031a430c851", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "22a71ed4014da139", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "72bdcc639f97f888", "scanner": "scanner-primary", "fingerprint": "ea8f3013f588db25", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-8424db9c75e04ba4", "level": "none", "message": {"text": "Very short observed git history"}, "properties": {"repobilityId": "9abc23a17ccfdcaf", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "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-c7f2eed1d5c3fb8c", "level": "none", "message": {"text": "Commented-code block (9 lines) in eslint.config.mjs:18"}, "properties": {"repobilityId": "052481a8897160eb", "scanner": "scanner-primary", "fingerprint": "c7f2eed1d5c3fb8c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7cddc61aa5d92e6b", "level": "none", "message": {"text": "Commented-code block (8 lines) in proxy.ts:14"}, "properties": {"repobilityId": "2ff317cf788a5eb5", "scanner": "scanner-primary", "fingerprint": "7cddc61aa5d92e6b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-661bbf6f5e1f3dd4", "level": "none", "message": {"text": "Commented-code block (11 lines) in next.config.ts:15"}, "properties": {"repobilityId": "74269c032303c901", "scanner": "scanner-primary", "fingerprint": "661bbf6f5e1f3dd4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-95d63b6c4e04242e", "level": "none", "message": {"text": "Commented-code block (6 lines) in test/sync/server-reachable.test.ts:36"}, "properties": {"repobilityId": "02e350ae935222a1", "scanner": "scanner-primary", "fingerprint": "95d63b6c4e04242e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dfd95a8b74e2e715", "level": "none", "message": {"text": "Commented-code block (6 lines) in test/components/sync/sync-boot.test.tsx:124"}, "properties": {"repobilityId": "e9038fda58dd4410", "scanner": "scanner-primary", "fingerprint": "dfd95a8b74e2e715", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cc3b1784f1f78d2e", "level": "none", "message": {"text": "Commented-code block (5 lines) in test/components/customers/customer-side-panel.test.tsx:28"}, "properties": {"repobilityId": "b0523d34031c4b0e", "scanner": "scanner-primary", "fingerprint": "cc3b1784f1f78d2e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3a35d65ebc30b35f", "level": "none", "message": {"text": "Commented-code block (8 lines) in test/components/jobs/complete-page-gate.test.tsx:212"}, "properties": {"repobilityId": "69da825833827b69", "scanner": "scanner-primary", "fingerprint": "3a35d65ebc30b35f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2536eedf0989aa7a", "level": "none", "message": {"text": "Commented-code block (6 lines) in test/app/customers-list.test.tsx:43"}, "properties": {"repobilityId": "2116f5ffee034f7a", "scanner": "scanner-primary", "fingerprint": "2536eedf0989aa7a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-314fc79f8028cd2e", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/generate-footer-band.ts:75"}, "properties": {"repobilityId": "64ab3b77a8948ad8", "scanner": "scanner-primary", "fingerprint": "314fc79f8028cd2e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cae2b4ccaef03b7c", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/sync/sync-boot.tsx:90"}, "properties": {"repobilityId": "d8deb97cb0488ca2", "scanner": "scanner-primary", "fingerprint": "cae2b4ccaef03b7c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-240a68010bfabb19", "level": "none", "message": {"text": "Commented-code block (7 lines) in components/bookings/booking-modal.tsx:33"}, "properties": {"repobilityId": "0316ef41ac487b95", "scanner": "scanner-primary", "fingerprint": "240a68010bfabb19", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2f9e21d117432705", "level": "none", "message": {"text": "Commented-code block (8 lines) in components/ui/photo-upload.tsx:91"}, "properties": {"repobilityId": "1fded6ba96ec5b76", "scanner": "scanner-primary", "fingerprint": "2f9e21d117432705", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4fa94cd656923497", "level": "none", "message": {"text": "Commented-code block (8 lines) in components/ui/signature-pad.tsx:49"}, "properties": {"repobilityId": "14ca7f9b1defc18b", "scanner": "scanner-primary", "fingerprint": "4fa94cd656923497", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-056d159facd9d17a", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/dashboard/upcoming-visits.tsx:16"}, "properties": {"repobilityId": "2f7c2337713a655f", "scanner": "scanner-primary", "fingerprint": "056d159facd9d17a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bb385041bbab5f70", "level": "none", "message": {"text": "Commented-code block (6 lines) in components/dashboard/dashboard-customisation-bar.tsx:34"}, "properties": {"repobilityId": "554c0875aa2d97a4", "scanner": "scanner-primary", "fingerprint": "bb385041bbab5f70", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f3a17d751b0bcc6f", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/customers/customers-table.tsx:16"}, "properties": {"repobilityId": "74e633a3794e2f76", "scanner": "scanner-primary", "fingerprint": "f3a17d751b0bcc6f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-095ef3c7539f1914", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/customers/delete-customer-confirm.tsx:11"}, "properties": {"repobilityId": "67976c7a98fdb260", "scanner": "scanner-primary", "fingerprint": "095ef3c7539f1914", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6bcf88312a64fc59", "level": "none", "message": {"text": "Commented-code block (6 lines) in components/customers/customer-side-panel.tsx:22"}, "properties": {"repobilityId": "8b5a7529d936df44", "scanner": "scanner-primary", "fingerprint": "6bcf88312a64fc59", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0679e6817ec9de4a", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/agreements/add-agreement-form.tsx:58"}, "properties": {"repobilityId": "95b1268f9b1a676b", "scanner": "scanner-primary", "fingerprint": "0679e6817ec9de4a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f27e2cfa0f0cc424", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/documents/doc-ready-provider.tsx:142"}, "properties": {"repobilityId": "e48930b86e53d440", "scanner": "scanner-primary", "fingerprint": "f27e2cfa0f0cc424", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0c706eb2078b5390", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/jobs/service-sheet-form.tsx:79"}, "properties": {"repobilityId": "215a6674e9a052aa", "scanner": "scanner-primary", "fingerprint": "0c706eb2078b5390", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fec7210e837caa5d", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/jobs/report-actions.tsx:20"}, "properties": {"repobilityId": "d764fa37f71b4212", "scanner": "scanner-primary", "fingerprint": "fec7210e837caa5d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-83655c3e6c92d1d2", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/invoices/create-invoice-button.tsx:17"}, "properties": {"repobilityId": "88c8dfc3dcf9b499", "scanner": "scanner-primary", "fingerprint": "83655c3e6c92d1d2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ac05b195640030a8", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/(app)/layout.tsx:6"}, "properties": {"repobilityId": "55b491d10e4f5a28", "scanner": "scanner-primary", "fingerprint": "ac05b195640030a8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1735c5b263b9ddcb", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/(app)/error.tsx:52"}, "properties": {"repobilityId": "94fd08177bd8af20", "scanner": "scanner-primary", "fingerprint": "1735c5b263b9ddcb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ede7c2c9159dca28", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/(app)/bookings/actions.ts:133"}, "properties": {"repobilityId": "dd90c426e06bdd3d", "scanner": "scanner-primary", "fingerprint": "ede7c2c9159dca28", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-09bb101b41b0534e", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/(app)/dashboard/page.tsx:181"}, "properties": {"repobilityId": "923219af1959f8bb", "scanner": "scanner-primary", "fingerprint": "09bb101b41b0534e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0a9c5b9dc5f52e4c", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/(app)/customers/actions.ts:30"}, "properties": {"repobilityId": "1ffd04df7ba75a78", "scanner": "scanner-primary", "fingerprint": "0a9c5b9dc5f52e4c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-919b8f4569ce568a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/customers/actions.ts:231"}, "properties": {"repobilityId": "2c530235d12e16d3", "scanner": "scanner-primary", "fingerprint": "919b8f4569ce568a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1fe845a4c19480ed", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/(app)/customers/[id]/sites/actions.ts:27"}, "properties": {"repobilityId": "cd917ef74d2e6e83", "scanner": "scanner-primary", "fingerprint": "1fe845a4c19480ed", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-efcbc5511ea5877d", "level": "none", "message": {"text": "Commented-code block (7 lines) in app/(app)/jobs/page.tsx:334"}, "properties": {"repobilityId": "5207b6f6137d5e61", "scanner": "scanner-primary", "fingerprint": "efcbc5511ea5877d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-84de4e1a65661f0d", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/(app)/jobs/[id]/complete/actions.ts:95"}, "properties": {"repobilityId": "698d7d00ff1ea3fa", "scanner": "scanner-primary", "fingerprint": "84de4e1a65661f0d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7a2d7299a77a0206", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/(app)/jobs/[id]/complete/page.tsx:133"}, "properties": {"repobilityId": "78a830a7437b9c29", "scanner": "scanner-primary", "fingerprint": "7a2d7299a77a0206", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ecf3fb08c20243e3", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/(app)/sites/[id]/bookings/actions.ts:46"}, "properties": {"repobilityId": "2d8cd688e7406b9e", "scanner": "scanner-primary", "fingerprint": "ecf3fb08c20243e3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f0cbdc95541903d0", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/(app)/sites/[id]/agreements/actions.ts:48"}, "properties": {"repobilityId": "e69819fafb2a0af7", "scanner": "scanner-primary", "fingerprint": "f0cbdc95541903d0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a00d986affd34058", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/sync/registry.ts:81"}, "properties": {"repobilityId": "35b42f483cf7032a", "scanner": "scanner-primary", "fingerprint": "a00d986affd34058", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-675bb4e9def2b8b8", "level": "none", "message": {"text": "Commented-code block (8 lines) in lib/sync/push.ts:142"}, "properties": {"repobilityId": "282681d4d9b92533", "scanner": "scanner-primary", "fingerprint": "675bb4e9def2b8b8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-773ff11115763099", "level": "none", "message": {"text": "Commented-code block (8 lines) in lib/sync/pull.ts:150"}, "properties": {"repobilityId": "a4f16a791ccb5d69", "scanner": "scanner-primary", "fingerprint": "773ff11115763099", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4290c963132d60b7", "level": "none", "message": {"text": "Commented-code block (7 lines) in lib/sync/http-classify.ts:111"}, "properties": {"repobilityId": "09cbc60b9d059baf", "scanner": "scanner-primary", "fingerprint": "4290c963132d60b7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3f3f9fc8ab5d78bb", "level": "none", "message": {"text": "Commented-code block (9 lines) in lib/sync/engine.ts:115"}, "properties": {"repobilityId": "c1cf705a482d86cf", "scanner": "scanner-primary", "fingerprint": "3f3f9fc8ab5d78bb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1c2144aa67d2d529", "level": "none", "message": {"text": "Commented-code block (7 lines) in lib/services/job-events.ts:78"}, "properties": {"repobilityId": "2d659875091190b6", "scanner": "scanner-primary", "fingerprint": "1c2144aa67d2d529", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3ed2bd95b5919231", "level": "none", "message": {"text": "Commented-code block (7 lines) in lib/db/index.ts:187"}, "properties": {"repobilityId": "58db1675f0c3c128", "scanner": "scanner-primary", "fingerprint": "3ed2bd95b5919231", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7e43dcf554cdc664", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/actions/wrap.ts:74"}, "properties": {"repobilityId": "a1c084c44a4ee2cc", "scanner": "scanner-primary", "fingerprint": "7e43dcf554cdc664", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-de11041897cf333e", "level": "none", "message": {"text": "Commented-code block (6 lines) in lib/pdf/footer-band.ts:1"}, "properties": {"repobilityId": "e1fdf0d9da1729cb", "scanner": "scanner-primary", "fingerprint": "de11041897cf333e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9a7f23414a276277", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/pdf/html-to-pdf.ts:109"}, "properties": {"repobilityId": "d97584584073d4ab", "scanner": "scanner-primary", "fingerprint": "9a7f23414a276277", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-75c81508d2a2b615", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/pdf/templates/invoice-template.ts:74"}, "properties": {"repobilityId": "eba2982c0d5ff695", "scanner": "scanner-primary", "fingerprint": "75c81508d2a2b615", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-12f85bb3a5f3fb30", "level": "none", "message": {"text": "Commented-code block (5 lines) in public/sw.js:171"}, "properties": {"repobilityId": "661da31b5f2e1b88", "scanner": "scanner-primary", "fingerprint": "12f85bb3a5f3fb30", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8e047ab7af03962f", "level": "note", "message": {"text": "7 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "5a0455f6498c27ad", "scanner": "scanner-primary", "fingerprint": "8e047ab7af03962f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}]}]}