{"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-2bafe9bb7b359c46", "name": "Stray `console.log` in TS/JS \u2014 scripts/resubscribe-pages.ts:31", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/resubscribe-pages.ts:31"}, "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-bc2d72af48231824", "name": "Stray `console.log` in TS/JS \u2014 scripts/rag-worker.ts:79", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/rag-worker.ts:79"}, "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-b7fd60eeccdea768", "name": "Stray `console.log` in TS/JS \u2014 scripts/backfill-messenger-names.ts:37", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-messenger-names.ts:37"}, "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-1bd18053f57efbfc", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-hf-model.ts:15", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-hf-model.ts:15"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7aefc37bc84b259b", "name": "Stray `console.log` in TS/JS \u2014 scripts/rag/backfill-payment-methods.ts:45", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/rag/backfill-payment-methods.ts:45"}, "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-627740305ffd841b", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/embed-jobs/route.ts:109", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/embed-jobs/route.ts:109"}, "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-16cd20ff289e3774", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/webhooks/facebook/_postback.ts:156", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/webhooks/facebook/_postback.ts:156"}, "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-b574ca716bbcb509", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/webhooks/facebook/route.ts:280", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/webhooks/facebook/route.ts:280"}, "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-4885aa0a11525f44", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/chatbot/test/route.ts:31", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/chatbot/test/route.ts:31"}, "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-eb482a192c6a736f", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/messenger/process/route.ts:632", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/messenger/process/route.ts:632"}, "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-0d8448c1d4b120ac", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/a/[slug]/_kinds/sales/Renderer.tsx:375", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/a/[slug]/_kinds/sales/Renderer.tsx:375"}, "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-9e6c687f695bf885", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/a/[slug]/_kinds/sales/SalesCheckoutModal.tsx:459", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/a/[slug]/_kinds/sales/SalesCheckoutModal.tsx:459"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-19ccc6dfd03fb00a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/a/[slug]/_kinds/realestate/Renderer.tsx:249", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/a/[slug]/_kinds/realestate/Renderer.tsx:249"}, "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-b98bc0b656d72493", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/media/_components/MediaManager.client.tsx:2", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/media/_components/MediaManager.client.tsx:209"}, "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-142b0bb153c4b7ad", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/_components/charts/UsageBarList.tsx:31", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/_components/charts/UsageBarList.tsx:31"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-808a008dc65d2e22", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/leads/_components/StageColumn.tsx:234", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/leads/_components/StageColumn.tsx:234"}, "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-a60e8ecb71924469", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/leads/_components/OrdersPanel.tsx:106", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/leads/_components/OrdersPanel.tsx:106"}, "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-698c210ec5264b7e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/leads/_components/LeadCard.tsx:129", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/leads/_components/LeadCard.tsx:129"}, "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-0824fd7db6a5d11e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/leads/_components/ConversationPanel.tsx:293", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/leads/_components/ConversationPanel.tsx:293"}, "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-0a5791ef9738262d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/leads/_components/SubmissionsPanel.tsx:119", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/leads/_components/SubmissionsPanel.tsx:119"}, "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-ec4e8712f7623514", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/leads/_components/LeadDrawer.tsx:180", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/leads/_components/LeadDrawer.tsx:180"}, "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-77e0348a56dc15b4", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/leads/_components/CartsPanel.tsx:112", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/leads/_components/CartsPanel.tsx:112"}, "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-a5e337d0046c2250", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/leads/_components/LeadsTable.client.tsx:116", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/leads/_components/LeadsTable.client.tsx:116"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-96fc7f8c2d01a793", "name": "Stray `console.log` in TS/JS \u2014 src/app/(app)/dashboard/settings/facebook/actions.ts:24", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/(app)/dashboard/settings/facebook/actions.ts:24"}, "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-a70d79da2a448f1b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/settings/facebook/_components/connected-vie", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/settings/facebook/_components/connected-view.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-c03988db94aca52b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/settings/facebook/_components/page-picker.t", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/settings/facebook/_components/page-picker.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-1d3a3f444a29ddf1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/settings/facebook/_components/capi-recent-e", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/settings/facebook/_components/capi-recent-events.tsx:38"}, "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-bcce10bac5a6c09d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/settings/facebook/_components/capi-page-for", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/settings/facebook/_components/capi-page-form.tsx:57"}, "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-c84c8a77c9743740", "name": "React Flow <Controls> without dark theming \u2014 src/app/(app)/dashboard/workflows/[id]/WorkflowEditor.tsx:704", "shortDescription": {"text": "React Flow <Controls> without dark theming \u2014 src/app/(app)/dashboard/workflows/[id]/WorkflowEditor.tsx:704"}, "fullDescription": {"text": "`<Controls>` ships with white buttons. Override `.react-flow__controls` and `.react-flow__controls-button` in your stylesheet or pass a styled wrapper.\n\nWhy: P1 in CHECKLIST.md \u2014 vendor defaults bleed light through.\nRule id: fq.controls.no-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1018dfa1210526b5", "name": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 src/app/(app)/dashboard/workflows/[id]/Workf", "shortDescription": {"text": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 src/app/(app)/dashboard/workflows/[id]/WorkflowEditor.tsx:306"}, "fullDescription": {"text": "React Flow edge labels render with a white rectangle behind the text by default, which scatters bright boxes across a dark canvas. Either drop the label, or override `.react-flow__edge-textbg` and `.react-flow__edge-text` in your stylesheet.\n\nWhy: P-H in CHECKLIST.md \u2014 vendor edge labels bleed white through a dark canvas.\nRule id: fq.edge-label.no-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-887237e6a34ea46f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/knowledge/_components/MediaPickerPopover.ts", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/knowledge/_components/MediaPickerPopover.tsx:104"}, "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-b99cf0aa3529a4e4", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/knowledge/_components/DocumentEditor.client", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/knowledge/_components/DocumentEditor.client.tsx:579"}, "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-4a6f3e2c51cc978e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/knowledge/_components/TagManager.tsx:146", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/knowledge/_components/TagManager.tsx:146"}, "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-f14f93cb96d32ad3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/knowledge/_components/CategoryManager.tsx:1", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/knowledge/_components/CategoryManager.tsx:156"}, "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-de315485b4d8644f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/knowledge/_components/DocumentList.tsx:56", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/knowledge/_components/DocumentList.tsx:56"}, "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-9ee3b131a5250585", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/knowledge/faqs/_components/FaqList.tsx:121", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/knowledge/faqs/_components/FaqList.tsx:121"}, "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-dfa8ee958326b3e5", "name": "Stray `console.log` in TS/JS \u2014 src/app/(app)/dashboard/knowledge/actions/documents.ts:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/(app)/dashboard/knowledge/actions/documents.ts:20"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-36ca2fbbbd1b6c6b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/action-pages/[id]/submissions/SalesSubmissi", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/action-pages/[id]/submissions/SalesSubmissionsView.tsx:157"}, "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-3d2c659e96fecc3c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/action-pages/[id]/submissions/PropertySubmi", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/action-pages/[id]/submissions/PropertySubmissionsView.tsx:99"}, "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-20762d324f446a3b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/action-pages/[id]/submissions/page.tsx:428", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/action-pages/[id]/submissions/page.tsx:428"}, "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-76cc5959502daa12", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/action-pages/[id]/submissions/CatalogOrders", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/action-pages/[id]/submissions/CatalogOrdersView.tsx:609"}, "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-e84d03a61b4219cb", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/action-pages/_kinds/sales/Editor.tsx:1362", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/action-pages/_kinds/sales/Editor.tsx:1362"}, "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-9640364bd82bae27", "name": "\"active\" state uses light bg in a dark theme \u2014 src/app/(app)/dashboard/action-pages/_kinds/sales/Editor.tsx:1704", "shortDescription": {"text": "\"active\" state uses light bg in a dark theme \u2014 src/app/(app)/dashboard/action-pages/_kinds/sales/Editor.tsx:1704"}, "fullDescription": {"text": "A ternary like `active ? 'bg-white' : '...'` (or bg-gray-100/200) on a dark theme produces jarring white pills. Use a dark-emphasized active state instead \u2014 border + ring or slightly brighter dark bg. Example: `active ? 'bg-gray-800 border-gray-500 ring-1 ring-blue-500/30' : '\u2026'`.\n\nWhy: P-E in CHECKLIST.md \u2014 light bg in a dark theme is a class of regression.\nRule id: fq.active-light-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4a164be33ccebbd2", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/action-pages/_kinds/qualification/Editor.ts", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/action-pages/_kinds/qualification/Editor.tsx:252"}, "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-78f38e1cb8b0eded", "name": "Icon-only button without accessible name \u2014 src/app/(app)/dashboard/action-pages/_kinds/qualification/OutcomeCard.tsx:55", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/app/(app)/dashboard/action-pages/_kinds/qualification/OutcomeCard.tsx:55"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2f961d97a8bdf070", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/action-pages/_kinds/realestate/Editor.tsx:8", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/action-pages/_kinds/realestate/Editor.tsx:850"}, "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-789407b85d51e725", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/action-pages/_kinds/realestate/RealestateSh", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/action-pages/_kinds/realestate/RealestateShell.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-aedc182b1f90a76f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/action-pages/_kinds/catalog/Editor.tsx:1315", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/action-pages/_kinds/catalog/Editor.tsx:1315"}, "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-ade07b7347d1b5c6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/action-pages/_kinds/catalog/CatalogShell.ts", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/action-pages/_kinds/catalog/CatalogShell.tsx:105"}, "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-b4e5f40fc54ca86f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/action-pages/_components/ActionPagePreview.", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/action-pages/_components/ActionPagePreview.tsx:89"}, "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-fc3406fc52c96379", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/reminders/_components/RemindersClient.tsx:3", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/reminders/_components/RemindersClient.tsx:338"}, "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-43fccb66f98ba76d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/business/page.tsx:71", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/business/page.tsx:71"}, "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-2f190d66b31101e8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/business/_components/ProductList.tsx:72", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/business/_components/ProductList.tsx:72"}, "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-d671190dcdd68df4", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/business/_components/ui.tsx:112", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/business/_components/ui.tsx:112"}, "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-e96e0ae289c4bb3f", "name": "Stray `console.log` in TS/JS \u2014 src/lib/rag/process-now.ts:134", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/rag/process-now.ts: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-16633ad15ebb47ea", "name": "Stray `console.log` in TS/JS \u2014 src/lib/rag/retriever.ts:69", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/rag/retriever.ts:69"}, "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-c14eee21bf1c5862", "name": "Stray `console.log` in TS/JS \u2014 src/lib/rag/embed-now.ts:93", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/rag/embed-now.ts:93"}, "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-22ced65a95a8e11e", "name": "Stray `console.log` in TS/JS \u2014 src/lib/billing/config-check.ts:62", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/billing/config-check.ts:62"}, "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-12188a24fad18150", "name": "Stray `console.log` in TS/JS \u2014 src/lib/media/selector.ts:68", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/media/selector.ts:68"}, "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-272a6d494838e62d", "name": "Stray `console.log` in TS/JS \u2014 src/lib/facebook/messenger.ts:484", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/facebook/messenger.ts:484"}, "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-c8a0418bbeeeb321", "name": "Stray `console.log` in TS/JS \u2014 src/lib/chatbot/deep-reclassify.ts:199", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/chatbot/deep-reclassify.ts:199"}, "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-c2b6ee3b98956aa2", "name": "Stray `console.log` in TS/JS \u2014 src/lib/chatbot/classify.ts:442", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/chatbot/classify.ts:442"}, "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-01c467e2caf6530c", "name": "Stray `console.log` in TS/JS \u2014 src/lib/chatbot/answer.ts:205", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/chatbot/answer.ts:205"}, "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-23a554af654b0086", "name": "Very large file: src/app/api/messenger/process/route.ts (2293 lines)", "shortDescription": {"text": "Very large file: src/app/api/messenger/process/route.ts (2293 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-b77abe38b1a835de", "name": "Very large file: src/app/a/[slug]/_kinds/catalog/Renderer.tsx (2114 lines)", "shortDescription": {"text": "Very large file: src/app/a/[slug]/_kinds/catalog/Renderer.tsx (2114 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-1f65eb8978afe7c5", "name": "Very large file: src/app/(app)/dashboard/workflows/[id]/WorkflowEditor.tsx (1238 lines)", "shortDescription": {"text": "Very large file: src/app/(app)/dashboard/workflows/[id]/WorkflowEditor.tsx (1238 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-fe89dc492c8cfbb1", "name": "Very large file: src/app/(app)/dashboard/action-pages/_kinds/sales/Editor.tsx (1945 lines)", "shortDescription": {"text": "Very large file: src/app/(app)/dashboard/action-pages/_kinds/sales/Editor.tsx (1945 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-bb6391095b760090", "name": "Very large file: src/app/(app)/dashboard/action-pages/_kinds/realestate/Editor.tsx (2888 lines)", "shortDescription": {"text": "Very large file: src/app/(app)/dashboard/action-pages/_kinds/realestate/Editor.tsx (2888 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-1d6c78093dab99e6", "name": "Very large file: src/app/(app)/dashboard/action-pages/_kinds/catalog/Editor.tsx (1647 lines)", "shortDescription": {"text": "Very large file: src/app/(app)/dashboard/action-pages/_kinds/catalog/Editor.tsx (1647 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-84f89459f70bc220", "name": "Very large file: src/app/(app)/dashboard/action-pages/_components/SalesStudioShell.tsx (2897 lines)", "shortDescription": {"text": "Very large file: src/app/(app)/dashboard/action-pages/_components/SalesStudioShell.tsx (2897 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-96319f27cb75f740", "name": "Very large file: src/app/(app)/dashboard/action-pages/_components/BookingStudioShell.tsx (1609 lines)", "shortDescription": {"text": "Very large file: src/app/(app)/dashboard/action-pages/_components/BookingStudioShell.tsx (1609 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-3bd7351a03f2c404", "name": "Very large file: src/app/(app)/dashboard/action-pages/_components/FormStudioShell.tsx (2045 lines)", "shortDescription": {"text": "Very large file: src/app/(app)/dashboard/action-pages/_components/FormStudioShell.tsx (2045 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-bced7d735ef17b2b", "name": "Very large file: src/lib/chatbot/classify.ts (1159 lines)", "shortDescription": {"text": "Very large file: src/lib/chatbot/classify.ts (1159 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea3b5e389d8c9c0f", "name": "Low test-to-source ratio", "shortDescription": {"text": "Low test-to-source ratio"}, "fullDescription": {"text": "152 tests / 624 src (ratio 0.24)."}, "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 55 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 430 placeholder/mock markers across 95 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-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-f14491341b3edc78", "name": "Commented-code block (5 lines) in src/sentry.server.config.ts:8", "shortDescription": {"text": "Commented-code block (5 lines) in src/sentry.server.config.ts:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a1edb40da5cd4a35", "name": "Commented-code block (5 lines) in src/app/api/superadmin/users/[id]/adjust/route.ts:10", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/superadmin/users/[id]/adjust/route.ts:10"}, "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-48d655e3b3edcd9c", "name": "Commented-code block (5 lines) in src/app/api/agent/preview/route.ts:129", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/agent/preview/route.ts:129"}, "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-b24838f3c64b34cb", "name": "Commented-code block (5 lines) in src/app/api/webhooks/facebook/route.ts:13", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/webhooks/facebook/route.ts:13"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2310252c9cb80acf", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/webhooks/facebook/route.ts:174", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/webhooks/facebook/route.ts:174"}, "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-e5bd1fe523d294f8", "name": "Commented-code block (5 lines) in src/app/api/carts/route.ts:12", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/carts/route.ts:12"}, "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-fe5003ec588f2e01", "name": "Commented-code block (5 lines) in src/app/api/carts/[id]/route.ts:7", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/carts/[id]/route.ts:7"}, "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-774bfca8e41b5ff4", "name": "Commented-code block (6 lines) in src/app/api/carts/[id]/convert/route.ts:7", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/carts/[id]/convert/route.ts:7"}, "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-e11c232c471f4c14", "name": "Commented-code block (6 lines) in src/app/api/messenger/process/route.ts:80", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/messenger/process/route.ts:80"}, "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-f1772e6a26b91684", "name": "Commented-code block (5 lines) in src/app/api/action-pages/submit/route.ts:1259", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/action-pages/submit/route.ts:1259"}, "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-6dbbdac40fae9f03", "name": "Commented-code block (5 lines) in src/app/university/_components/CatalogClient.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/university/_components/CatalogClient.tsx: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-480d6be0e151d3d0", "name": "Commented-code block (5 lines) in src/app/university/_components/CourseCard.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/university/_components/CourseCard.tsx: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-f196ccd562a6eb7e", "name": "Commented-code block (7 lines) in src/app/university/[courseSlug]/[lessonSlug]/_components/LessonPlayer.tsx:3", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/university/[courseSlug]/[lessonSlug]/_components/LessonPlayer.tsx: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-9d1980934f1be27b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/a/[slug]/_kinds/catalog/Renderer.tsx:103", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/a/[slug]/_kinds/catalog/Renderer.tsx:103"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-07b9aa3b43bfe4ce", "name": "Commented-code block (5 lines) in src/app/onboarding/_components/GenerationGate.tsx:59", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/onboarding/_components/GenerationGate.tsx:59"}, "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-66442377467a5a51", "name": "Commented-code block (5 lines) in src/app/(app)/dashboard/templates/actions.ts:22", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/(app)/dashboard/templates/actions.ts: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-c4755b002b15411e", "name": "Legacy-named symbol `ws_stage_rules_tip_dismissed_v1` in src/app/(app)/dashboard/leads/_components/StageRulesTip.tsx:4", "shortDescription": {"text": "Legacy-named symbol `ws_stage_rules_tip_dismissed_v1` in src/app/(app)/dashboard/leads/_components/StageRulesTip.tsx:4"}, "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-59847f7df238fa1f", "name": "Commented-code block (5 lines) in src/app/(app)/dashboard/leads/actions/leads.ts:21", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/(app)/dashboard/leads/actions/leads.ts:21"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ce9be3a376b266ec", "name": "Commented-code block (5 lines) in src/app/(app)/dashboard/university/actions.ts:29", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/(app)/dashboard/university/actions.ts:29"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-04be93db5d362a03", "name": "Commented-code block (5 lines) in src/app/(app)/dashboard/workflows/[id]/WorkflowEditor.tsx:128", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/(app)/dashboard/workflows/[id]/WorkflowEditor.tsx:128"}, "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-d4256e796679bda6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/dashboard/workflows/[id]/WorkflowEditor.tsx:587", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/dashboard/workflows/[id]/WorkflowEditor.tsx:587"}, "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-2ae11f9c6b2fc69c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/dashboard/workflows/_components/WorkflowsList.tsx:70", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/dashboard/workflows/_components/WorkflowsList.tsx:70"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6d2bd13d87c44c5b", "name": "Commented-code block (5 lines) in src/app/(app)/dashboard/knowledge/_components/DocumentEditor.client.tsx:158", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/(app)/dashboard/knowledge/_components/DocumentEditor.client.tsx:158"}, "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-720132d3a0935d63", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/dashboard/chatbot/_components/AutoFollowupForm.tsx:150", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/dashboard/chatbot/_components/AutoFollowupForm.tsx:150"}, "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-7aeb7494df0a0e5f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/dashboard/chatbot/_components/MediaPickerModal.tsx:50", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/dashboard/chatbot/_components/MediaPickerModal.tsx:50"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-565e7b0c72d029fa", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/dashboard/business/_components/ProductImageUpload.tsx:25", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/dashboard/business/_components/ProductImageUpload.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-c7d578af96ddf993", "name": "Commented-code block (5 lines) in src/app/(auth)/actions.ts:104", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/(auth)/actions.ts:104"}, "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-984bf7237b8212c6", "name": "Commented-code block (5 lines) in src/lib/rag/llm.test.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/rag/llm.test.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-294fabad56b2487a", "name": "Commented-code block (17 lines) in src/lib/rag/config.ts:71", "shortDescription": {"text": "Commented-code block (17 lines) in src/lib/rag/config.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-4fb1e7468bd01639", "name": "Commented-code block (7 lines) in src/lib/rag/retriever.ts:53", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/rag/retriever.ts:53"}, "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-8213b587b76f0969", "name": "Commented-code block (5 lines) in src/lib/rag/prompt-builder.ts:158", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/rag/prompt-builder.ts:158"}, "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-aa86d79e37db835f", "name": "Commented-code block (5 lines) in src/lib/rag/factory.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/rag/factory.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-f99cbafc8fec3da3", "name": "Commented-code block (5 lines) in src/lib/messenger-templates/render.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/messenger-templates/render.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9973b1abf384a76f", "name": "Commented-code block (5 lines) in src/lib/university/data.ts:66", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/university/data.ts:66"}, "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-f5b4c5bd58c42d15", "name": "Commented-code block (5 lines) in src/lib/university/access.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/university/access.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-aa7ec0f001e8f6ac", "name": "Commented-code block (5 lines) in src/lib/university/embed.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/university/embed.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-36e4493bab579596", "name": "Commented-code block (5 lines) in src/lib/university/playback.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/university/playback.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-652d53ded5416cc3", "name": "Commented-code block (5 lines) in src/lib/facebook/messenger.ts:16", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/facebook/messenger.ts: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-ac9f80c507a0901c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/facebook/comments.ts:29", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/facebook/comments.ts:29"}, "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-ab2a90e0f8421672", "name": "Commented-code block (6 lines) in src/lib/facebook/messenger-templates.ts:8", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/facebook/messenger-templates.ts:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-313199ca35123b17", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/facebook/messenger-templates.ts:167", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/facebook/messenger-templates.ts:167"}, "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-eab88f148b946403", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/facebook/oauth.ts:41", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/facebook/oauth.ts:41"}, "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-973deefa9cf25e43", "name": "Commented-code block (7 lines) in src/lib/chatbot/deep-reclassify.ts:442", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/chatbot/deep-reclassify.ts:442"}, "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-63ade1377b4c64c4", "name": "Commented-code block (6 lines) in src/lib/chatbot/classify.ts:212", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/chatbot/classify.ts: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-4174c4bc756e0eba", "name": "Commented-code block (7 lines) in src/lib/chatbot/config.ts:77", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/chatbot/config.ts:77"}, "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-405b21579ed793c6", "name": "Commented-code block (6 lines) in src/lib/chatbot/answer.ts:139", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/chatbot/answer.ts:139"}, "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-294c2c345ffe9acb", "name": "Commented-code block (5 lines) in src/lib/chatbot/deep-reclassify.test.ts:97", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/chatbot/deep-reclassify.test.ts:97"}, "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-1e41e0f2b45950ec", "name": "Commented-code block (6 lines) in src/lib/chatbot/personality/adopt.ts:311", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/chatbot/personality/adopt.ts:311"}, "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-8c9518db7894c362", "name": "Commented-code block (7 lines) in src/lib/messenger/outbound.ts:22", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/messenger/outbound.ts: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-f6ab0823194602de", "name": "Commented-code block (6 lines) in src/lib/messenger/campaignSend.ts:249", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/messenger/campaignSend.ts:249"}, "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-dde2350848d6d5d3", "name": "Commented-code block (5 lines) in src/lib/followups/settings.ts:98", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/followups/settings.ts:98"}, "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-06eaa7c8db0e832c", "name": "Commented-code block (9 lines) in src/lib/followups/generateMessage.ts:3", "shortDescription": {"text": "Commented-code block (9 lines) in src/lib/followups/generateMessage.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}}]}}, "automationDetails": {"id": "repobility/25045"}, "properties": {"repository": "codemedavid/TheWhatStage-v3", "repoUrl": "https://github.com/codemedavid/TheWhatStage-v3", "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-2bafe9bb7b359c46", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/resubscribe-pages.ts:31"}, "properties": {"repobilityId": "5ba1add0c58792f1", "scanner": "scanner-primary", "fingerprint": "2bafe9bb7b359c46", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bc2d72af48231824", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/rag-worker.ts:79"}, "properties": {"repobilityId": "042a99754d733713", "scanner": "scanner-primary", "fingerprint": "bc2d72af48231824", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b7fd60eeccdea768", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-messenger-names.ts:37"}, "properties": {"repobilityId": "d6b75e0ee75eb426", "scanner": "scanner-primary", "fingerprint": "b7fd60eeccdea768", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1bd18053f57efbfc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-hf-model.ts:15"}, "properties": {"repobilityId": "0217ea3d437fd539", "scanner": "scanner-primary", "fingerprint": "1bd18053f57efbfc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7aefc37bc84b259b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/rag/backfill-payment-methods.ts:45"}, "properties": {"repobilityId": "0bf9b329d106b58f", "scanner": "scanner-primary", "fingerprint": "7aefc37bc84b259b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-627740305ffd841b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/embed-jobs/route.ts:109"}, "properties": {"repobilityId": "4b4a0a4cf1002633", "scanner": "scanner-primary", "fingerprint": "627740305ffd841b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-16cd20ff289e3774", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/webhooks/facebook/_postback.ts:156"}, "properties": {"repobilityId": "97d5c85b1390e676", "scanner": "scanner-primary", "fingerprint": "16cd20ff289e3774", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b574ca716bbcb509", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/webhooks/facebook/route.ts:280"}, "properties": {"repobilityId": "a5a7d99daa31b485", "scanner": "scanner-primary", "fingerprint": "b574ca716bbcb509", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4885aa0a11525f44", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/chatbot/test/route.ts:31"}, "properties": {"repobilityId": "25d41c2521c838c2", "scanner": "scanner-primary", "fingerprint": "4885aa0a11525f44", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-eb482a192c6a736f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/messenger/process/route.ts:632"}, "properties": {"repobilityId": "78a6b449e40d98ee", "scanner": "scanner-primary", "fingerprint": "eb482a192c6a736f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0d8448c1d4b120ac", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/a/[slug]/_kinds/sales/Renderer.tsx:375"}, "properties": {"repobilityId": "313f84afd093c51b", "scanner": "scanner-primary", "fingerprint": "0d8448c1d4b120ac", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9e6c687f695bf885", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/a/[slug]/_kinds/sales/SalesCheckoutModal.tsx:459"}, "properties": {"repobilityId": "37a33da12e0ccfde", "scanner": "scanner-primary", "fingerprint": "9e6c687f695bf885", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-19ccc6dfd03fb00a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/a/[slug]/_kinds/realestate/Renderer.tsx:249"}, "properties": {"repobilityId": "cafce540af348f00", "scanner": "scanner-primary", "fingerprint": "19ccc6dfd03fb00a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b98bc0b656d72493", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/media/_components/MediaManager.client.tsx:209"}, "properties": {"repobilityId": "d1807cf5873eed20", "scanner": "scanner-primary", "fingerprint": "b98bc0b656d72493", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-142b0bb153c4b7ad", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/_components/charts/UsageBarList.tsx:31"}, "properties": {"repobilityId": "534a0f77d0589fcb", "scanner": "scanner-primary", "fingerprint": "142b0bb153c4b7ad", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-808a008dc65d2e22", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/leads/_components/StageColumn.tsx:234"}, "properties": {"repobilityId": "452b514054bcfd42", "scanner": "scanner-primary", "fingerprint": "808a008dc65d2e22", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a60e8ecb71924469", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/leads/_components/OrdersPanel.tsx:106"}, "properties": {"repobilityId": "a20e5fe6a3e8ec2d", "scanner": "scanner-primary", "fingerprint": "a60e8ecb71924469", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-698c210ec5264b7e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/leads/_components/LeadCard.tsx:129"}, "properties": {"repobilityId": "0d7c93107588980c", "scanner": "scanner-primary", "fingerprint": "698c210ec5264b7e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0824fd7db6a5d11e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/leads/_components/ConversationPanel.tsx:293"}, "properties": {"repobilityId": "347298d81fc8e724", "scanner": "scanner-primary", "fingerprint": "0824fd7db6a5d11e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0a5791ef9738262d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/leads/_components/SubmissionsPanel.tsx:119"}, "properties": {"repobilityId": "0d3883079305a67e", "scanner": "scanner-primary", "fingerprint": "0a5791ef9738262d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ec4e8712f7623514", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/leads/_components/LeadDrawer.tsx:180"}, "properties": {"repobilityId": "7ec4e525c54d34a1", "scanner": "scanner-primary", "fingerprint": "ec4e8712f7623514", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-77e0348a56dc15b4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/leads/_components/CartsPanel.tsx:112"}, "properties": {"repobilityId": "73a015ad0c4166b6", "scanner": "scanner-primary", "fingerprint": "77e0348a56dc15b4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a5e337d0046c2250", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/leads/_components/LeadsTable.client.tsx:116"}, "properties": {"repobilityId": "286cb52bb25c30e8", "scanner": "scanner-primary", "fingerprint": "a5e337d0046c2250", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-96fc7f8c2d01a793", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/(app)/dashboard/settings/facebook/actions.ts:24"}, "properties": {"repobilityId": "36d2a125b1af6eef", "scanner": "scanner-primary", "fingerprint": "96fc7f8c2d01a793", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a70d79da2a448f1b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/settings/facebook/_components/connected-view.tsx:53"}, "properties": {"repobilityId": "6e459f06d034fb2e", "scanner": "scanner-primary", "fingerprint": "a70d79da2a448f1b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c03988db94aca52b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/settings/facebook/_components/page-picker.tsx:74"}, "properties": {"repobilityId": "7aba619b823248d7", "scanner": "scanner-primary", "fingerprint": "c03988db94aca52b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1d3a3f444a29ddf1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/settings/facebook/_components/capi-recent-events.tsx:38"}, "properties": {"repobilityId": "9e3ea23319201204", "scanner": "scanner-primary", "fingerprint": "1d3a3f444a29ddf1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bcce10bac5a6c09d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/settings/facebook/_components/capi-page-form.tsx:57"}, "properties": {"repobilityId": "62a4f7823ced1754", "scanner": "scanner-primary", "fingerprint": "bcce10bac5a6c09d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c84c8a77c9743740", "level": "note", "message": {"text": "React Flow <Controls> without dark theming \u2014 src/app/(app)/dashboard/workflows/[id]/WorkflowEditor.tsx:704"}, "properties": {"repobilityId": "14cbe73a2587c5f3", "scanner": "scanner-primary", "fingerprint": "c84c8a77c9743740", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.controls.no-bg"]}}, {"ruleId": "scanner-1018dfa1210526b5", "level": "note", "message": {"text": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 src/app/(app)/dashboard/workflows/[id]/WorkflowEditor.tsx:306"}, "properties": {"repobilityId": "b82ee89dd7007629", "scanner": "scanner-primary", "fingerprint": "1018dfa1210526b5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.edge-label.no-bg"]}}, {"ruleId": "scanner-887237e6a34ea46f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/knowledge/_components/MediaPickerPopover.tsx:104"}, "properties": {"repobilityId": "7563006ac5ea8519", "scanner": "scanner-primary", "fingerprint": "887237e6a34ea46f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b99cf0aa3529a4e4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/knowledge/_components/DocumentEditor.client.tsx:579"}, "properties": {"repobilityId": "a5399d23778e6aa0", "scanner": "scanner-primary", "fingerprint": "b99cf0aa3529a4e4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4a6f3e2c51cc978e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/knowledge/_components/TagManager.tsx:146"}, "properties": {"repobilityId": "92102fa3bec41e58", "scanner": "scanner-primary", "fingerprint": "4a6f3e2c51cc978e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f14f93cb96d32ad3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/knowledge/_components/CategoryManager.tsx:156"}, "properties": {"repobilityId": "f5fea4c065101697", "scanner": "scanner-primary", "fingerprint": "f14f93cb96d32ad3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-de315485b4d8644f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/knowledge/_components/DocumentList.tsx:56"}, "properties": {"repobilityId": "40ffa37722fc851e", "scanner": "scanner-primary", "fingerprint": "de315485b4d8644f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9ee3b131a5250585", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/knowledge/faqs/_components/FaqList.tsx:121"}, "properties": {"repobilityId": "b9c595d8a739f101", "scanner": "scanner-primary", "fingerprint": "9ee3b131a5250585", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dfa8ee958326b3e5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/(app)/dashboard/knowledge/actions/documents.ts:20"}, "properties": {"repobilityId": "d6758a46857405ae", "scanner": "scanner-primary", "fingerprint": "dfa8ee958326b3e5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-36ca2fbbbd1b6c6b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/action-pages/[id]/submissions/SalesSubmissionsView.tsx:157"}, "properties": {"repobilityId": "8df0ef60aca34b2c", "scanner": "scanner-primary", "fingerprint": "36ca2fbbbd1b6c6b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3d2c659e96fecc3c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/action-pages/[id]/submissions/PropertySubmissionsView.tsx:99"}, "properties": {"repobilityId": "c1563c916c0ddad4", "scanner": "scanner-primary", "fingerprint": "3d2c659e96fecc3c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-20762d324f446a3b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/action-pages/[id]/submissions/page.tsx:428"}, "properties": {"repobilityId": "8b3d0238d9b01bc9", "scanner": "scanner-primary", "fingerprint": "20762d324f446a3b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-76cc5959502daa12", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/action-pages/[id]/submissions/CatalogOrdersView.tsx:609"}, "properties": {"repobilityId": "1946121140627374", "scanner": "scanner-primary", "fingerprint": "76cc5959502daa12", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e84d03a61b4219cb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/action-pages/_kinds/sales/Editor.tsx:1362"}, "properties": {"repobilityId": "3121e75479565a56", "scanner": "scanner-primary", "fingerprint": "e84d03a61b4219cb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9640364bd82bae27", "level": "note", "message": {"text": "\"active\" state uses light bg in a dark theme \u2014 src/app/(app)/dashboard/action-pages/_kinds/sales/Editor.tsx:1704"}, "properties": {"repobilityId": "b75d4dcae0f3276d", "scanner": "scanner-primary", "fingerprint": "9640364bd82bae27", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.active-light-bg"]}}, {"ruleId": "scanner-4a164be33ccebbd2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/action-pages/_kinds/qualification/Editor.tsx:252"}, "properties": {"repobilityId": "94c10cd4b88c1b80", "scanner": "scanner-primary", "fingerprint": "4a164be33ccebbd2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-78f38e1cb8b0eded", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/app/(app)/dashboard/action-pages/_kinds/qualification/OutcomeCard.tsx:55"}, "properties": {"repobilityId": "5ebf590738239e9a", "scanner": "scanner-primary", "fingerprint": "78f38e1cb8b0eded", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-2f961d97a8bdf070", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/action-pages/_kinds/realestate/Editor.tsx:850"}, "properties": {"repobilityId": "2f6eb2fd8a103641", "scanner": "scanner-primary", "fingerprint": "2f961d97a8bdf070", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-789407b85d51e725", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/action-pages/_kinds/realestate/RealestateShell.tsx:101"}, "properties": {"repobilityId": "7dcc76a9fba78b75", "scanner": "scanner-primary", "fingerprint": "789407b85d51e725", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-aedc182b1f90a76f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/action-pages/_kinds/catalog/Editor.tsx:1315"}, "properties": {"repobilityId": "c3a10c881a2b4ef2", "scanner": "scanner-primary", "fingerprint": "aedc182b1f90a76f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ade07b7347d1b5c6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/action-pages/_kinds/catalog/CatalogShell.tsx:105"}, "properties": {"repobilityId": "05bcbeb7573ded4d", "scanner": "scanner-primary", "fingerprint": "ade07b7347d1b5c6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b4e5f40fc54ca86f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/action-pages/_components/ActionPagePreview.tsx:89"}, "properties": {"repobilityId": "c6ad19abb33df223", "scanner": "scanner-primary", "fingerprint": "b4e5f40fc54ca86f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fc3406fc52c96379", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/reminders/_components/RemindersClient.tsx:338"}, "properties": {"repobilityId": "481ce9b30c40c473", "scanner": "scanner-primary", "fingerprint": "fc3406fc52c96379", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-43fccb66f98ba76d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/business/page.tsx:71"}, "properties": {"repobilityId": "41474186f3458af9", "scanner": "scanner-primary", "fingerprint": "43fccb66f98ba76d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2f190d66b31101e8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/business/_components/ProductList.tsx:72"}, "properties": {"repobilityId": "4a1442b161b9be44", "scanner": "scanner-primary", "fingerprint": "2f190d66b31101e8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d671190dcdd68df4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/dashboard/business/_components/ui.tsx:112"}, "properties": {"repobilityId": "841b13757dabac44", "scanner": "scanner-primary", "fingerprint": "d671190dcdd68df4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e96e0ae289c4bb3f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/rag/process-now.ts:134"}, "properties": {"repobilityId": "e872684b977ecc05", "scanner": "scanner-primary", "fingerprint": "e96e0ae289c4bb3f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-16633ad15ebb47ea", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/rag/retriever.ts:69"}, "properties": {"repobilityId": "a1382947acfb62a1", "scanner": "scanner-primary", "fingerprint": "16633ad15ebb47ea", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c14eee21bf1c5862", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/rag/embed-now.ts:93"}, "properties": {"repobilityId": "66087ec479a88402", "scanner": "scanner-primary", "fingerprint": "c14eee21bf1c5862", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-22ced65a95a8e11e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/billing/config-check.ts:62"}, "properties": {"repobilityId": "a2e6c26f127ed6c3", "scanner": "scanner-primary", "fingerprint": "22ced65a95a8e11e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-12188a24fad18150", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/media/selector.ts:68"}, "properties": {"repobilityId": "43a3f3ad60c2377b", "scanner": "scanner-primary", "fingerprint": "12188a24fad18150", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-272a6d494838e62d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/facebook/messenger.ts:484"}, "properties": {"repobilityId": "b0131baa030ff061", "scanner": "scanner-primary", "fingerprint": "272a6d494838e62d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c8a0418bbeeeb321", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/chatbot/deep-reclassify.ts:199"}, "properties": {"repobilityId": "e629d9c188ca1f8e", "scanner": "scanner-primary", "fingerprint": "c8a0418bbeeeb321", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c2b6ee3b98956aa2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/chatbot/classify.ts:442"}, "properties": {"repobilityId": "bf36cc42c2999809", "scanner": "scanner-primary", "fingerprint": "c2b6ee3b98956aa2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-01c467e2caf6530c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/chatbot/answer.ts:205"}, "properties": {"repobilityId": "8f62ad05d18fd757", "scanner": "scanner-primary", "fingerprint": "01c467e2caf6530c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-23a554af654b0086", "level": "note", "message": {"text": "Very large file: src/app/api/messenger/process/route.ts (2293 lines)"}, "properties": {"repobilityId": "943ec2450b464583", "scanner": "scanner-primary", "fingerprint": "23a554af654b0086", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b77abe38b1a835de", "level": "note", "message": {"text": "Very large file: src/app/a/[slug]/_kinds/catalog/Renderer.tsx (2114 lines)"}, "properties": {"repobilityId": "abb0585411ead047", "scanner": "scanner-primary", "fingerprint": "b77abe38b1a835de", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1f65eb8978afe7c5", "level": "note", "message": {"text": "Very large file: src/app/(app)/dashboard/workflows/[id]/WorkflowEditor.tsx (1238 lines)"}, "properties": {"repobilityId": "4c2278ae7dfb682c", "scanner": "scanner-primary", "fingerprint": "1f65eb8978afe7c5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-fe89dc492c8cfbb1", "level": "note", "message": {"text": "Very large file: src/app/(app)/dashboard/action-pages/_kinds/sales/Editor.tsx (1945 lines)"}, "properties": {"repobilityId": "5c9dd6e3a79afb15", "scanner": "scanner-primary", "fingerprint": "fe89dc492c8cfbb1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-bb6391095b760090", "level": "note", "message": {"text": "Very large file: src/app/(app)/dashboard/action-pages/_kinds/realestate/Editor.tsx (2888 lines)"}, "properties": {"repobilityId": "44fe4ee4ff6fd9bc", "scanner": "scanner-primary", "fingerprint": "bb6391095b760090", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1d6c78093dab99e6", "level": "note", "message": {"text": "Very large file: src/app/(app)/dashboard/action-pages/_kinds/catalog/Editor.tsx (1647 lines)"}, "properties": {"repobilityId": "2b7671e18ddcfe2e", "scanner": "scanner-primary", "fingerprint": "1d6c78093dab99e6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-84f89459f70bc220", "level": "note", "message": {"text": "Very large file: src/app/(app)/dashboard/action-pages/_components/SalesStudioShell.tsx (2897 lines)"}, "properties": {"repobilityId": "7252e3568191f40b", "scanner": "scanner-primary", "fingerprint": "84f89459f70bc220", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-96319f27cb75f740", "level": "note", "message": {"text": "Very large file: src/app/(app)/dashboard/action-pages/_components/BookingStudioShell.tsx (1609 lines)"}, "properties": {"repobilityId": "4bb63eb30c6f6b1b", "scanner": "scanner-primary", "fingerprint": "96319f27cb75f740", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3bd7351a03f2c404", "level": "note", "message": {"text": "Very large file: src/app/(app)/dashboard/action-pages/_components/FormStudioShell.tsx (2045 lines)"}, "properties": {"repobilityId": "44dec5854038c62d", "scanner": "scanner-primary", "fingerprint": "3bd7351a03f2c404", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-bced7d735ef17b2b", "level": "note", "message": {"text": "Very large file: src/lib/chatbot/classify.ts (1159 lines)"}, "properties": {"repobilityId": "1e77c9311f357d2d", "scanner": "scanner-primary", "fingerprint": "bced7d735ef17b2b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ea3b5e389d8c9c0f", "level": "note", "message": {"text": "Low test-to-source ratio"}, "properties": {"repobilityId": "ef7b2552cc00a375", "scanner": "scanner-primary", "fingerprint": "ea3b5e389d8c9c0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["tests"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "420a019ec1975375", "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": "2241af7d88613bb5", "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": "9281bcf4977ff49b", "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": "2973e371b4f45f62", "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": "18e3eab41ef96460", "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": "58d096d7c2dc06ed", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-e725d2ab884fbd49", "level": "note", "message": {"text": "Multiple root agent instruction files without precedence"}, "properties": {"repobilityId": "1953db6c89508d22", "scanner": "scanner-primary", "fingerprint": "e725d2ab884fbd49", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["agent-instructions", "governance"]}}, {"ruleId": "scanner-f14491341b3edc78", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/sentry.server.config.ts:8"}, "properties": {"repobilityId": "6de9003083e65874", "scanner": "scanner-primary", "fingerprint": "f14491341b3edc78", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a1edb40da5cd4a35", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/superadmin/users/[id]/adjust/route.ts:10"}, "properties": {"repobilityId": "035eef2aa9fea0df", "scanner": "scanner-primary", "fingerprint": "a1edb40da5cd4a35", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-48d655e3b3edcd9c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/agent/preview/route.ts:129"}, "properties": {"repobilityId": "a3f74feb5597e6fa", "scanner": "scanner-primary", "fingerprint": "48d655e3b3edcd9c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b24838f3c64b34cb", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/webhooks/facebook/route.ts:13"}, "properties": {"repobilityId": "71d364b40b530382", "scanner": "scanner-primary", "fingerprint": "b24838f3c64b34cb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2310252c9cb80acf", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/webhooks/facebook/route.ts:174"}, "properties": {"repobilityId": "7850470589ca124a", "scanner": "scanner-primary", "fingerprint": "2310252c9cb80acf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e5bd1fe523d294f8", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/carts/route.ts:12"}, "properties": {"repobilityId": "532edf6f1e00429f", "scanner": "scanner-primary", "fingerprint": "e5bd1fe523d294f8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fe5003ec588f2e01", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/carts/[id]/route.ts:7"}, "properties": {"repobilityId": "85a0c5a4b013b00c", "scanner": "scanner-primary", "fingerprint": "fe5003ec588f2e01", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-774bfca8e41b5ff4", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/carts/[id]/convert/route.ts:7"}, "properties": {"repobilityId": "43fe4c3445244572", "scanner": "scanner-primary", "fingerprint": "774bfca8e41b5ff4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e11c232c471f4c14", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/messenger/process/route.ts:80"}, "properties": {"repobilityId": "b81db45938581294", "scanner": "scanner-primary", "fingerprint": "e11c232c471f4c14", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f1772e6a26b91684", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/action-pages/submit/route.ts:1259"}, "properties": {"repobilityId": "50993e0dcea27ed4", "scanner": "scanner-primary", "fingerprint": "f1772e6a26b91684", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6dbbdac40fae9f03", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/university/_components/CatalogClient.tsx:3"}, "properties": {"repobilityId": "40ac237325ab8c8a", "scanner": "scanner-primary", "fingerprint": "6dbbdac40fae9f03", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-480d6be0e151d3d0", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/university/_components/CourseCard.tsx:3"}, "properties": {"repobilityId": "664abb7c754113b2", "scanner": "scanner-primary", "fingerprint": "480d6be0e151d3d0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f196ccd562a6eb7e", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/university/[courseSlug]/[lessonSlug]/_components/LessonPlayer.tsx:3"}, "properties": {"repobilityId": "c3f2a3192a513ef7", "scanner": "scanner-primary", "fingerprint": "f196ccd562a6eb7e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9d1980934f1be27b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/a/[slug]/_kinds/catalog/Renderer.tsx:103"}, "properties": {"repobilityId": "fc10e35f6320ed01", "scanner": "scanner-primary", "fingerprint": "9d1980934f1be27b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-07b9aa3b43bfe4ce", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/onboarding/_components/GenerationGate.tsx:59"}, "properties": {"repobilityId": "fdea265ed87f2346", "scanner": "scanner-primary", "fingerprint": "07b9aa3b43bfe4ce", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-66442377467a5a51", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/(app)/dashboard/templates/actions.ts:22"}, "properties": {"repobilityId": "d698d274fad0e7bd", "scanner": "scanner-primary", "fingerprint": "66442377467a5a51", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c4755b002b15411e", "level": "note", "message": {"text": "Legacy-named symbol `ws_stage_rules_tip_dismissed_v1` in src/app/(app)/dashboard/leads/_components/StageRulesTip.tsx:4"}, "properties": {"repobilityId": "fceaf2cf93a2d510", "scanner": "scanner-primary", "fingerprint": "c4755b002b15411e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-59847f7df238fa1f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/(app)/dashboard/leads/actions/leads.ts:21"}, "properties": {"repobilityId": "ae200b0161086797", "scanner": "scanner-primary", "fingerprint": "59847f7df238fa1f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ce9be3a376b266ec", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/(app)/dashboard/university/actions.ts:29"}, "properties": {"repobilityId": "68ff8bd0d6313024", "scanner": "scanner-primary", "fingerprint": "ce9be3a376b266ec", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-04be93db5d362a03", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/(app)/dashboard/workflows/[id]/WorkflowEditor.tsx:128"}, "properties": {"repobilityId": "e9654ecb506761df", "scanner": "scanner-primary", "fingerprint": "04be93db5d362a03", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d4256e796679bda6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/dashboard/workflows/[id]/WorkflowEditor.tsx:587"}, "properties": {"repobilityId": "e39d47dcff767943", "scanner": "scanner-primary", "fingerprint": "d4256e796679bda6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2ae11f9c6b2fc69c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/dashboard/workflows/_components/WorkflowsList.tsx:70"}, "properties": {"repobilityId": "a53e97c73c1c6491", "scanner": "scanner-primary", "fingerprint": "2ae11f9c6b2fc69c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6d2bd13d87c44c5b", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/(app)/dashboard/knowledge/_components/DocumentEditor.client.tsx:158"}, "properties": {"repobilityId": "f9a968da877726ce", "scanner": "scanner-primary", "fingerprint": "6d2bd13d87c44c5b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-720132d3a0935d63", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/dashboard/chatbot/_components/AutoFollowupForm.tsx:150"}, "properties": {"repobilityId": "9123e95db4e1abf3", "scanner": "scanner-primary", "fingerprint": "720132d3a0935d63", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7aeb7494df0a0e5f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/dashboard/chatbot/_components/MediaPickerModal.tsx:50"}, "properties": {"repobilityId": "67377df1d4eeeb7c", "scanner": "scanner-primary", "fingerprint": "7aeb7494df0a0e5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-565e7b0c72d029fa", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(app)/dashboard/business/_components/ProductImageUpload.tsx:25"}, "properties": {"repobilityId": "967f9ff110c47af7", "scanner": "scanner-primary", "fingerprint": "565e7b0c72d029fa", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c7d578af96ddf993", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/(auth)/actions.ts:104"}, "properties": {"repobilityId": "de7418aec4d9e874", "scanner": "scanner-primary", "fingerprint": "c7d578af96ddf993", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-984bf7237b8212c6", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/rag/llm.test.ts:3"}, "properties": {"repobilityId": "aa1846e7869916dd", "scanner": "scanner-primary", "fingerprint": "984bf7237b8212c6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-294fabad56b2487a", "level": "none", "message": {"text": "Commented-code block (17 lines) in src/lib/rag/config.ts:71"}, "properties": {"repobilityId": "48c16424f6ed085a", "scanner": "scanner-primary", "fingerprint": "294fabad56b2487a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4fb1e7468bd01639", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/rag/retriever.ts:53"}, "properties": {"repobilityId": "63d7c8b077bcef54", "scanner": "scanner-primary", "fingerprint": "4fb1e7468bd01639", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8213b587b76f0969", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/rag/prompt-builder.ts:158"}, "properties": {"repobilityId": "8f9b620b2a75f40a", "scanner": "scanner-primary", "fingerprint": "8213b587b76f0969", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-aa86d79e37db835f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/rag/factory.ts:5"}, "properties": {"repobilityId": "2e3e5c24d77f69f9", "scanner": "scanner-primary", "fingerprint": "aa86d79e37db835f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f99cbafc8fec3da3", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/messenger-templates/render.ts:4"}, "properties": {"repobilityId": "b6a5a3cf986eb52f", "scanner": "scanner-primary", "fingerprint": "f99cbafc8fec3da3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9973b1abf384a76f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/university/data.ts:66"}, "properties": {"repobilityId": "5ee1c75de0cbdf29", "scanner": "scanner-primary", "fingerprint": "9973b1abf384a76f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f5b4c5bd58c42d15", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/university/access.ts:4"}, "properties": {"repobilityId": "c726a3223f684445", "scanner": "scanner-primary", "fingerprint": "f5b4c5bd58c42d15", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-aa7ec0f001e8f6ac", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/university/embed.ts:3"}, "properties": {"repobilityId": "b700e845c7ff9e87", "scanner": "scanner-primary", "fingerprint": "aa7ec0f001e8f6ac", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-36e4493bab579596", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/university/playback.ts:3"}, "properties": {"repobilityId": "8b9bf89b4097c2fe", "scanner": "scanner-primary", "fingerprint": "36e4493bab579596", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-652d53ded5416cc3", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/facebook/messenger.ts:16"}, "properties": {"repobilityId": "eb00ca1e61a6277e", "scanner": "scanner-primary", "fingerprint": "652d53ded5416cc3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ac9f80c507a0901c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/facebook/comments.ts:29"}, "properties": {"repobilityId": "e4a503d6e328539a", "scanner": "scanner-primary", "fingerprint": "ac9f80c507a0901c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ab2a90e0f8421672", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/facebook/messenger-templates.ts:8"}, "properties": {"repobilityId": "75ab9eb5e1e3fe7a", "scanner": "scanner-primary", "fingerprint": "ab2a90e0f8421672", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-313199ca35123b17", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/facebook/messenger-templates.ts:167"}, "properties": {"repobilityId": "53675ce3d66e27f6", "scanner": "scanner-primary", "fingerprint": "313199ca35123b17", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-eab88f148b946403", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/facebook/oauth.ts:41"}, "properties": {"repobilityId": "f4eba3b55e734572", "scanner": "scanner-primary", "fingerprint": "eab88f148b946403", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-973deefa9cf25e43", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/chatbot/deep-reclassify.ts:442"}, "properties": {"repobilityId": "c2c9c54530e52bc4", "scanner": "scanner-primary", "fingerprint": "973deefa9cf25e43", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-63ade1377b4c64c4", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/chatbot/classify.ts:212"}, "properties": {"repobilityId": "5b82d14dfdbce312", "scanner": "scanner-primary", "fingerprint": "63ade1377b4c64c4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4174c4bc756e0eba", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/chatbot/config.ts:77"}, "properties": {"repobilityId": "b2a5c18159a4baa2", "scanner": "scanner-primary", "fingerprint": "4174c4bc756e0eba", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-405b21579ed793c6", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/chatbot/answer.ts:139"}, "properties": {"repobilityId": "e2940cc1a018133f", "scanner": "scanner-primary", "fingerprint": "405b21579ed793c6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-294c2c345ffe9acb", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/chatbot/deep-reclassify.test.ts:97"}, "properties": {"repobilityId": "1ddbf6e5543416a4", "scanner": "scanner-primary", "fingerprint": "294c2c345ffe9acb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1e41e0f2b45950ec", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/chatbot/personality/adopt.ts:311"}, "properties": {"repobilityId": "d99589f95ef9f6f7", "scanner": "scanner-primary", "fingerprint": "1e41e0f2b45950ec", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8c9518db7894c362", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/messenger/outbound.ts:22"}, "properties": {"repobilityId": "0883dca8005317af", "scanner": "scanner-primary", "fingerprint": "8c9518db7894c362", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f6ab0823194602de", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/messenger/campaignSend.ts:249"}, "properties": {"repobilityId": "e5fe30ebad73d08b", "scanner": "scanner-primary", "fingerprint": "f6ab0823194602de", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dde2350848d6d5d3", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/followups/settings.ts:98"}, "properties": {"repobilityId": "ce65d1ab532e7f1f", "scanner": "scanner-primary", "fingerprint": "dde2350848d6d5d3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-06eaa7c8db0e832c", "level": "none", "message": {"text": "Commented-code block (9 lines) in src/lib/followups/generateMessage.ts:3"}, "properties": {"repobilityId": "8f5d0d4d7a6c48fa", "scanner": "scanner-primary", "fingerprint": "06eaa7c8db0e832c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}]}]}