{"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-7e921d24b50fb464", "name": "Stray `console.log` in TS/JS \u2014 app/api/webhooks/stripe/route.ts:352", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/webhooks/stripe/route.ts:352"}, "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-d7997c046f891d2c", "name": "`truncate` class without `title=` for hover reveal \u2014 app/hub/page.tsx:312", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/page.tsx:312"}, "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-0ac0c032a7d84964", "name": "`truncate` class without `title=` for hover reveal \u2014 app/hub/_ui/MiniBar.tsx:36", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/_ui/MiniBar.tsx:36"}, "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-3202b8dd7ffa7e1d", "name": "`truncate` class without `title=` for hover reveal \u2014 app/hub/requests/page.tsx:180", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/requests/page.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-36b6c85540b5040d", "name": "`truncate` class without `title=` for hover reveal \u2014 app/hub/admin/page.tsx:542", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/admin/page.tsx:542"}, "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-92eba80c72efd435", "name": "`truncate` class without `title=` for hover reveal \u2014 app/hub/bookings/EventTypesPanel.tsx:270", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/bookings/EventTypesPanel.tsx:270"}, "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-ff4923061e3b5fb7", "name": "`truncate` class without `title=` for hover reveal \u2014 app/hub/bookings/page.tsx:210", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/bookings/page.tsx:210"}, "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-d0a91e0e8eb16f70", "name": "`truncate` class without `title=` for hover reveal \u2014 app/hub/commissions/page.tsx:421", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/commissions/page.tsx:421"}, "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-3f1387a8df44aa8c", "name": "`truncate` class without `title=` for hover reveal \u2014 app/hub/leads/page.tsx:137", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/leads/page.tsx:137"}, "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-c966fb5e4dba9cd1", "name": "`truncate` class without `title=` for hover reveal \u2014 app/hub/leads/[leadId]/page.tsx:506", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/leads/[leadId]/page.tsx:506"}, "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-4f604e7500fd07b3", "name": "`truncate` class without `title=` for hover reveal \u2014 app/hub/contacts/page.tsx:121", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/contacts/page.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-1bbbe6258f755c72", "name": "`truncate` class without `title=` for hover reveal \u2014 app/hub/reports/page.tsx:759", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/reports/page.tsx:759"}, "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-73d8c967a47c5431", "name": "`truncate` class without `title=` for hover reveal \u2014 app/hub/pool/page.tsx:236", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/pool/page.tsx:236"}, "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-0ca5a9de3b9a79bd", "name": "`truncate` class without `title=` for hover reveal \u2014 app/hub/deals/page.tsx:317", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/deals/page.tsx:317"}, "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-138b036273ad74ec", "name": "`truncate` class without `title=` for hover reveal \u2014 app/hub/financials/page.tsx:710", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/financials/page.tsx:710"}, "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-4e0625019795a522", "name": "`truncate` class without `title=` for hover reveal \u2014 app/hub/financials/_charts.tsx:50", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/financials/_charts.tsx:50"}, "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-3d292e32b260a381", "name": "`truncate` class without `title=` for hover reveal \u2014 app/hub/financials/expenses/page.tsx:218", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/financials/expenses/page.tsx:218"}, "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-ad15807d19b7dc99", "name": "`truncate` class without `title=` for hover reveal \u2014 app/hub/accounts/page.tsx:261", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/accounts/page.tsx:261"}, "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-e8844e1ee25288ee", "name": "`truncate` class without `title=` for hover reveal \u2014 app/hub/accounts/[accountId]/page.tsx:470", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/accounts/[accountId]/page.tsx:470"}, "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-8e45ec61ed3cf350", "name": "`truncate` class without `title=` for hover reveal \u2014 app/hub/tasks/MyTasks.tsx:78", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/tasks/MyTasks.tsx:78"}, "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-51f10d0dcc4152f1", "name": "`truncate` class without `title=` for hover reveal \u2014 app/hub/tasks/WorkInbox.tsx:89", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/tasks/WorkInbox.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-7f685da08a4dd2a2", "name": "`truncate` class without `title=` for hover reveal \u2014 app/hub/tasks/ContextDrawer.tsx:276", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/tasks/ContextDrawer.tsx:276"}, "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-09a8689779cadf32", "name": "`truncate` class without `title=` for hover reveal \u2014 app/hub/overview/page.tsx:337", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/overview/page.tsx:337"}, "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-c7230e043caf5928", "name": "`truncate` class without `title=` for hover reveal \u2014 app/hub/board/TaskDetail.tsx:506", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/board/TaskDetail.tsx:506"}, "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-cacc268ce0914f3d", "name": "`truncate` class without `title=` for hover reveal \u2014 app/hub/board/DeliveryBoard.tsx:102", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/board/DeliveryBoard.tsx:102"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-73b815f7ed579bcc", "name": "`truncate` class without `title=` for hover reveal \u2014 app/hub/work/page.tsx:65", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/work/page.tsx:65"}, "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-ded39ce646340a19", "name": "`truncate` class without `title=` for hover reveal \u2014 app/hub/inbox/InboxClient.tsx:161", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/inbox/InboxClient.tsx:161"}, "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-7c5e4dcc338f037d", "name": "`truncate` class without `title=` for hover reveal \u2014 app/hub/invoices/page.tsx:232", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/invoices/page.tsx:232"}, "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-87b12f558d347873", "name": "`truncate` class without `title=` for hover reveal \u2014 app/hub/blog/page.tsx:68", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/blog/page.tsx:68"}, "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-6433596d74fdfe0e", "name": "`truncate` class without `title=` for hover reveal \u2014 app/hub/documents/page.tsx:157", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/documents/page.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-1cb5c34635a4c670", "name": "`truncate` class without `title=` for hover reveal \u2014 app/hub/documents/[id]/DocumentEditor.tsx:322", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/documents/[id]/DocumentEditor.tsx:322"}, "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-ef410cb49a5da8a3", "name": "`truncate` class without `title=` for hover reveal \u2014 app/partners/page.tsx:392", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/partners/page.tsx:392"}, "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-6736010dafbb6457", "name": "`truncate` class without `title=` for hover reveal \u2014 app/partners/commissions/page.tsx:300", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/partners/commissions/page.tsx:300"}, "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-610bcfae983d3e75", "name": "`truncate` class without `title=` for hover reveal \u2014 app/partners/leads/page.tsx:390", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/partners/leads/page.tsx:390"}, "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-0cf64816d05077ce", "name": "`truncate` class without `title=` for hover reveal \u2014 app/partners/deals/page.tsx:230", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/partners/deals/page.tsx:230"}, "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-021a5bb7b833c47a", "name": "`truncate` class without `title=` for hover reveal \u2014 app/workspace/page.tsx:308", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/workspace/page.tsx:308"}, "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-da7eaf7c78b94f38", "name": "`truncate` class without `title=` for hover reveal \u2014 app/workspace/requests/QueueSortable.tsx:95", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/workspace/requests/QueueSortable.tsx:95"}, "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-1b38031518b2a5e1", "name": "`truncate` class without `title=` for hover reveal \u2014 app/workspace/requests/RequestDetail.tsx:218", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/workspace/requests/RequestDetail.tsx:218"}, "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-23fb0da0754fa22c", "name": "`truncate` class without `title=` for hover reveal \u2014 app/workspace/requests/SubmitRequest.tsx:198", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/workspace/requests/SubmitRequest.tsx:198"}, "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-bbe2391733d38a41", "name": "`truncate` class without `title=` for hover reveal \u2014 app/workspace/requests/RequestsBoard.tsx:308", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/workspace/requests/RequestsBoard.tsx:308"}, "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-148f6ae4d5996e98", "name": "`truncate` class without `title=` for hover reveal \u2014 app/workspace/brand-hub/page.tsx:308", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/workspace/brand-hub/page.tsx:308"}, "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-1b2870f05b866866", "name": "`truncate` class without `title=` for hover reveal \u2014 app/workspace/files/page.tsx:207", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/workspace/files/page.tsx:207"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-af8f38d0a2090e59", "name": "`truncate` class without `title=` for hover reveal \u2014 app/workspace/engagements/[engagementId]/page.tsx:225", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/workspace/engagements/[engagementId]/page.tsx:225"}, "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-4928e62460f984c6", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/blog/markdown.tsx:7", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/blog/markdown.tsx:7"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-18ab71f08d92ad58", "name": "`truncate` class without `title=` for hover reveal \u2014 components/PortalLayoutShell.tsx:225", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/PortalLayoutShell.tsx:225"}, "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-9e320d68538046c5", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 components/seo/JsonLd.tsx:9", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/seo/JsonLd.tsx:9"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bff3cf6476dddebc", "name": "`truncate` class without `title=` for hover reveal \u2014 components/portal/CommandPalette.tsx:419", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/portal/CommandPalette.tsx:419"}, "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-752b6e34cc6efb8e", "name": "Insecure pattern 'dangerous_innerhtml' in components/seo/JsonLd.tsx:9", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in components/seo/JsonLd.tsx:9"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1ea1c4b861cc8cb1", "name": "Possible secret in e2e/helpers.ts", "shortDescription": {"text": "Possible secret in e2e/helpers.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-c73f56281deb675b", "name": "Possible secret in e2e/seed.mjs", "shortDescription": {"text": "Possible secret in e2e/seed.mjs"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-4a385a312cab71f2", "name": "Very large file: app/api/webhooks/stripe/route.ts (1867 lines)", "shortDescription": {"text": "Very large file: app/api/webhooks/stripe/route.ts (1867 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-9f855d342988c614", "name": "Very large file: lib/database.types.ts (3353 lines)", "shortDescription": {"text": "Very large file: lib/database.types.ts (3353 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-e8cb93218ef57c73", "name": "Very large file: lib/landing/solution-finder.ts (1664 lines)", "shortDescription": {"text": "Very large file: lib/landing/solution-finder.ts (1664 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "1 test file(s) for 309 source file(s) (ratio 0.00). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-faccb9061e9b52a0", "name": "No README detected", "shortDescription": {"text": "No README detected"}, "fullDescription": {"text": "No README file was found. Generated repos without README context are hard to operate, validate, or safely hand off."}, "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 10 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 189 placeholder/mock markers across 52 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, operator-readme. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e30b8d04f27b1237", "name": "Commented-code block (8 lines) in app/api/checkout/route.ts:72", "shortDescription": {"text": "Commented-code block (8 lines) in app/api/checkout/route.ts:72"}, "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-1b360c9352389434", "name": "Commented-code block (6 lines) in app/api/commissions/statement/[partnerId]/route.ts:19", "shortDescription": {"text": "Commented-code block (6 lines) in app/api/commissions/statement/[partnerId]/route.ts:19"}, "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-2047f355e18e2889", "name": "Commented-code block (8 lines) in app/api/leads/route.ts:209", "shortDescription": {"text": "Commented-code block (8 lines) in app/api/leads/route.ts:209"}, "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-9f1d465dac194d0e", "name": "Commented-code block (6 lines) in app/api/webhooks/stripe/route.ts:41", "shortDescription": {"text": "Commented-code block (6 lines) in app/api/webhooks/stripe/route.ts:41"}, "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-7fc82929e6e0d1f4", "name": "Commented-code block (7 lines) in app/auth/reset/page.tsx:54", "shortDescription": {"text": "Commented-code block (7 lines) in app/auth/reset/page.tsx:54"}, "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-3fe3177f66ce20ed", "name": "Commented-code block (5 lines) in app/hub/accounts/actions.ts:185", "shortDescription": {"text": "Commented-code block (5 lines) in app/hub/accounts/actions.ts:185"}, "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-96110c3bae15ed78", "name": "Commented-code block (6 lines) in app/partners/actions.ts:162", "shortDescription": {"text": "Commented-code block (6 lines) in app/partners/actions.ts:162"}, "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-1e988add15ae5a02", "name": "Commented-code block (7 lines) in app/partners/onboarding/page.tsx:21", "shortDescription": {"text": "Commented-code block (7 lines) in app/partners/onboarding/page.tsx:21"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c891697d6266c458", "name": "Commented-code block (8 lines) in app/workspace/WorkspaceDashboardShell.tsx:42", "shortDescription": {"text": "Commented-code block (8 lines) in app/workspace/WorkspaceDashboardShell.tsx:42"}, "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-a1e3ffc4ea0eed9e", "name": "Commented-code block (5 lines) in components/OnboardingWizard.tsx:197", "shortDescription": {"text": "Commented-code block (5 lines) in components/OnboardingWizard.tsx:197"}, "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-6c2b11b49722401b", "name": "Legacy-named symbol `vz_geo_v1` in components/geo/CurrencyProvider.tsx:37", "shortDescription": {"text": "Legacy-named symbol `vz_geo_v1` in components/geo/CurrencyProvider.tsx:37"}, "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-e381c871bbf9af73", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/geo/CurrencyProvider.tsx:67", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/geo/CurrencyProvider.tsx:67"}, "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-8933e7979e41228a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/services/LaunchExperience.tsx:433", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/services/LaunchExperience.tsx:433"}, "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-c2bb97ac2019badc", "name": "Commented-code block (5 lines) in components/services/ExtendExperience.tsx:582", "shortDescription": {"text": "Commented-code block (5 lines) in components/services/ExtendExperience.tsx:582"}, "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-066ede3d3e9e125c", "name": "Commented-code block (6 lines) in components/services/GrowExperience.tsx:338", "shortDescription": {"text": "Commented-code block (6 lines) in components/services/GrowExperience.tsx:338"}, "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-cd5ea7ac4f9050cc", "name": "Commented-code block (5 lines) in lib/seo/config.ts:9", "shortDescription": {"text": "Commented-code block (5 lines) in lib/seo/config.ts:9"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-eb939e3190e028ea", "name": "Commented-code block (5 lines) in lib/pipeline/stage-actions.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in lib/pipeline/stage-actions.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-54bd954d8570382c", "name": "Commented-code block (5 lines) in e2e/client-portal.spec.ts:407", "shortDescription": {"text": "Commented-code block (5 lines) in e2e/client-portal.spec.ts:407"}, "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-e2ecd5645fd7b6a5", "name": "Commented-code block (5 lines) in e2e/auth-access.spec.ts:184", "shortDescription": {"text": "Commented-code block (5 lines) in e2e/auth-access.spec.ts:184"}, "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-b334d875f2339fa1", "name": "5 env vars used in code but missing from .env.example", "shortDescription": {"text": "5 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `E2E_BASE_URL`, `NEXT_PUBLIC_SITE_URL`, `NODE_ENV`, `SUPABASE_ACCESS_TOKEN`, `SUPABASE_PROJECT_REF`. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/23907"}, "properties": {"repository": "admin-vazgro/Vazgroagency", "repoUrl": "https://github.com/admin-vazgro/Vazgroagency", "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-7e921d24b50fb464", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/webhooks/stripe/route.ts:352"}, "properties": {"repobilityId": "820f2a9402f92ee7", "scanner": "scanner-primary", "fingerprint": "7e921d24b50fb464", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d7997c046f891d2c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/page.tsx:312"}, "properties": {"repobilityId": "73333ec52226c5b4", "scanner": "scanner-primary", "fingerprint": "d7997c046f891d2c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0ac0c032a7d84964", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/_ui/MiniBar.tsx:36"}, "properties": {"repobilityId": "383214f4b19ad765", "scanner": "scanner-primary", "fingerprint": "0ac0c032a7d84964", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3202b8dd7ffa7e1d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/requests/page.tsx:180"}, "properties": {"repobilityId": "28c7288791f6578b", "scanner": "scanner-primary", "fingerprint": "3202b8dd7ffa7e1d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-36b6c85540b5040d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/admin/page.tsx:542"}, "properties": {"repobilityId": "07aa1b0f3e94e5ea", "scanner": "scanner-primary", "fingerprint": "36b6c85540b5040d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-92eba80c72efd435", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/bookings/EventTypesPanel.tsx:270"}, "properties": {"repobilityId": "dc946c0c399e593c", "scanner": "scanner-primary", "fingerprint": "92eba80c72efd435", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ff4923061e3b5fb7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/bookings/page.tsx:210"}, "properties": {"repobilityId": "400f0b0cd2c5518a", "scanner": "scanner-primary", "fingerprint": "ff4923061e3b5fb7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d0a91e0e8eb16f70", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/commissions/page.tsx:421"}, "properties": {"repobilityId": "6a707f9ab496717f", "scanner": "scanner-primary", "fingerprint": "d0a91e0e8eb16f70", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3f1387a8df44aa8c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/leads/page.tsx:137"}, "properties": {"repobilityId": "aaed4eb2b1c485f1", "scanner": "scanner-primary", "fingerprint": "3f1387a8df44aa8c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c966fb5e4dba9cd1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/leads/[leadId]/page.tsx:506"}, "properties": {"repobilityId": "2ed6ba668e7debdb", "scanner": "scanner-primary", "fingerprint": "c966fb5e4dba9cd1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4f604e7500fd07b3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/contacts/page.tsx:121"}, "properties": {"repobilityId": "5c20e2f463a365b4", "scanner": "scanner-primary", "fingerprint": "4f604e7500fd07b3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1bbbe6258f755c72", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/reports/page.tsx:759"}, "properties": {"repobilityId": "aa19b86b113fccbb", "scanner": "scanner-primary", "fingerprint": "1bbbe6258f755c72", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-73d8c967a47c5431", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/pool/page.tsx:236"}, "properties": {"repobilityId": "212aacf0f42ed34e", "scanner": "scanner-primary", "fingerprint": "73d8c967a47c5431", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0ca5a9de3b9a79bd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/deals/page.tsx:317"}, "properties": {"repobilityId": "142ab32eb84769e8", "scanner": "scanner-primary", "fingerprint": "0ca5a9de3b9a79bd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-138b036273ad74ec", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/financials/page.tsx:710"}, "properties": {"repobilityId": "a49515e14ce1d740", "scanner": "scanner-primary", "fingerprint": "138b036273ad74ec", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4e0625019795a522", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/financials/_charts.tsx:50"}, "properties": {"repobilityId": "c7462684dae74c78", "scanner": "scanner-primary", "fingerprint": "4e0625019795a522", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3d292e32b260a381", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/financials/expenses/page.tsx:218"}, "properties": {"repobilityId": "f3f7ade653033e84", "scanner": "scanner-primary", "fingerprint": "3d292e32b260a381", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ad15807d19b7dc99", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/accounts/page.tsx:261"}, "properties": {"repobilityId": "ab9097ae3f4bb53e", "scanner": "scanner-primary", "fingerprint": "ad15807d19b7dc99", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e8844e1ee25288ee", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/accounts/[accountId]/page.tsx:470"}, "properties": {"repobilityId": "9dd6b1210be232e6", "scanner": "scanner-primary", "fingerprint": "e8844e1ee25288ee", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8e45ec61ed3cf350", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/tasks/MyTasks.tsx:78"}, "properties": {"repobilityId": "edfb8d0789f238be", "scanner": "scanner-primary", "fingerprint": "8e45ec61ed3cf350", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-51f10d0dcc4152f1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/tasks/WorkInbox.tsx:89"}, "properties": {"repobilityId": "579806d8c3dc2153", "scanner": "scanner-primary", "fingerprint": "51f10d0dcc4152f1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7f685da08a4dd2a2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/tasks/ContextDrawer.tsx:276"}, "properties": {"repobilityId": "e3a3047862d98369", "scanner": "scanner-primary", "fingerprint": "7f685da08a4dd2a2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-09a8689779cadf32", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/overview/page.tsx:337"}, "properties": {"repobilityId": "9dd759c01ef7e00e", "scanner": "scanner-primary", "fingerprint": "09a8689779cadf32", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c7230e043caf5928", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/board/TaskDetail.tsx:506"}, "properties": {"repobilityId": "75aeafd413ec6ae4", "scanner": "scanner-primary", "fingerprint": "c7230e043caf5928", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cacc268ce0914f3d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/board/DeliveryBoard.tsx:102"}, "properties": {"repobilityId": "b6fbc28318cdc472", "scanner": "scanner-primary", "fingerprint": "cacc268ce0914f3d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-73b815f7ed579bcc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/work/page.tsx:65"}, "properties": {"repobilityId": "234816de9f604115", "scanner": "scanner-primary", "fingerprint": "73b815f7ed579bcc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ded39ce646340a19", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/inbox/InboxClient.tsx:161"}, "properties": {"repobilityId": "8f2f9e4ef84deb4d", "scanner": "scanner-primary", "fingerprint": "ded39ce646340a19", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7c5e4dcc338f037d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/invoices/page.tsx:232"}, "properties": {"repobilityId": "8e3a2652144eb0f1", "scanner": "scanner-primary", "fingerprint": "7c5e4dcc338f037d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-87b12f558d347873", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/blog/page.tsx:68"}, "properties": {"repobilityId": "8728b6cde7a426b0", "scanner": "scanner-primary", "fingerprint": "87b12f558d347873", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6433596d74fdfe0e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/documents/page.tsx:157"}, "properties": {"repobilityId": "296680d059ff1b91", "scanner": "scanner-primary", "fingerprint": "6433596d74fdfe0e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1cb5c34635a4c670", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/hub/documents/[id]/DocumentEditor.tsx:322"}, "properties": {"repobilityId": "a9c476610964148a", "scanner": "scanner-primary", "fingerprint": "1cb5c34635a4c670", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ef410cb49a5da8a3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/partners/page.tsx:392"}, "properties": {"repobilityId": "96dd752e581c6db6", "scanner": "scanner-primary", "fingerprint": "ef410cb49a5da8a3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6736010dafbb6457", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/partners/commissions/page.tsx:300"}, "properties": {"repobilityId": "05c3ef91c6df0775", "scanner": "scanner-primary", "fingerprint": "6736010dafbb6457", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-610bcfae983d3e75", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/partners/leads/page.tsx:390"}, "properties": {"repobilityId": "1d9268b2b51c0804", "scanner": "scanner-primary", "fingerprint": "610bcfae983d3e75", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0cf64816d05077ce", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/partners/deals/page.tsx:230"}, "properties": {"repobilityId": "8d20251cfbae6077", "scanner": "scanner-primary", "fingerprint": "0cf64816d05077ce", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-021a5bb7b833c47a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/workspace/page.tsx:308"}, "properties": {"repobilityId": "10806b26dba5ca4a", "scanner": "scanner-primary", "fingerprint": "021a5bb7b833c47a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-da7eaf7c78b94f38", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/workspace/requests/QueueSortable.tsx:95"}, "properties": {"repobilityId": "26566e2d1ff71d5a", "scanner": "scanner-primary", "fingerprint": "da7eaf7c78b94f38", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1b38031518b2a5e1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/workspace/requests/RequestDetail.tsx:218"}, "properties": {"repobilityId": "7a0e4aa019047170", "scanner": "scanner-primary", "fingerprint": "1b38031518b2a5e1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-23fb0da0754fa22c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/workspace/requests/SubmitRequest.tsx:198"}, "properties": {"repobilityId": "dd0d09a5b4af6f85", "scanner": "scanner-primary", "fingerprint": "23fb0da0754fa22c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bbe2391733d38a41", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/workspace/requests/RequestsBoard.tsx:308"}, "properties": {"repobilityId": "ff244c07f2b0093d", "scanner": "scanner-primary", "fingerprint": "bbe2391733d38a41", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-148f6ae4d5996e98", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/workspace/brand-hub/page.tsx:308"}, "properties": {"repobilityId": "798c9010c4f76bbe", "scanner": "scanner-primary", "fingerprint": "148f6ae4d5996e98", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1b2870f05b866866", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/workspace/files/page.tsx:207"}, "properties": {"repobilityId": "7c5bc52ecd2d86f9", "scanner": "scanner-primary", "fingerprint": "1b2870f05b866866", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-af8f38d0a2090e59", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/workspace/engagements/[engagementId]/page.tsx:225"}, "properties": {"repobilityId": "9ebea4688b1a159c", "scanner": "scanner-primary", "fingerprint": "af8f38d0a2090e59", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4928e62460f984c6", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/blog/markdown.tsx:7"}, "properties": {"repobilityId": "7c2b11776f0f41ca", "scanner": "scanner-primary", "fingerprint": "4928e62460f984c6", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-18ab71f08d92ad58", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/PortalLayoutShell.tsx:225"}, "properties": {"repobilityId": "5133282997ee6672", "scanner": "scanner-primary", "fingerprint": "18ab71f08d92ad58", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9e320d68538046c5", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/seo/JsonLd.tsx:9"}, "properties": {"repobilityId": "5a214a5e3e2f96be", "scanner": "scanner-primary", "fingerprint": "9e320d68538046c5", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-bff3cf6476dddebc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/portal/CommandPalette.tsx:419"}, "properties": {"repobilityId": "fff974109f03cbe6", "scanner": "scanner-primary", "fingerprint": "bff3cf6476dddebc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-752b6e34cc6efb8e", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in components/seo/JsonLd.tsx:9"}, "properties": {"repobilityId": "b4ef54f9c6ffde91", "scanner": "scanner-primary", "fingerprint": "752b6e34cc6efb8e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "components/seo/JsonLd.tsx"}, "region": {"startLine": 9}}}]}, {"ruleId": "scanner-1ea1c4b861cc8cb1", "level": "error", "message": {"text": "Possible secret in e2e/helpers.ts"}, "properties": {"repobilityId": "e4132fb39d77c656", "scanner": "scanner-primary", "fingerprint": "1ea1c4b861cc8cb1", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "e2e/helpers.ts"}, "region": {"startLine": 3}}}]}, {"ruleId": "scanner-c73f56281deb675b", "level": "error", "message": {"text": "Possible secret in e2e/seed.mjs"}, "properties": {"repobilityId": "47807e6eda6a601e", "scanner": "scanner-primary", "fingerprint": "c73f56281deb675b", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "e2e/seed.mjs"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-4a385a312cab71f2", "level": "note", "message": {"text": "Very large file: app/api/webhooks/stripe/route.ts (1867 lines)"}, "properties": {"repobilityId": "c68cd6a33262f7ae", "scanner": "scanner-primary", "fingerprint": "4a385a312cab71f2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9f855d342988c614", "level": "note", "message": {"text": "Very large file: lib/database.types.ts (3353 lines)"}, "properties": {"repobilityId": "593f2a10b28b0583", "scanner": "scanner-primary", "fingerprint": "9f855d342988c614", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e8cb93218ef57c73", "level": "note", "message": {"text": "Very large file: lib/landing/solution-finder.ts (1664 lines)"}, "properties": {"repobilityId": "cc0d4617ec3e6abe", "scanner": "scanner-primary", "fingerprint": "e8cb93218ef57c73", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "16dc05c094525d44", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-faccb9061e9b52a0", "level": "note", "message": {"text": "No README detected"}, "properties": {"repobilityId": "a3e09bdd7ce3b7ed", "scanner": "scanner-primary", "fingerprint": "faccb9061e9b52a0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["docs", "readme", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "22162dd1397188bf", "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": "5399a07dfcb7ed91", "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": "6806d096b39fc7f7", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "95bd2fd03a4125ee", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-e30b8d04f27b1237", "level": "none", "message": {"text": "Commented-code block (8 lines) in app/api/checkout/route.ts:72"}, "properties": {"repobilityId": "20ca2ce1a9f35453", "scanner": "scanner-primary", "fingerprint": "e30b8d04f27b1237", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1b360c9352389434", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/api/commissions/statement/[partnerId]/route.ts:19"}, "properties": {"repobilityId": "03ec08d2d260efee", "scanner": "scanner-primary", "fingerprint": "1b360c9352389434", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2047f355e18e2889", "level": "none", "message": {"text": "Commented-code block (8 lines) in app/api/leads/route.ts:209"}, "properties": {"repobilityId": "bbefa2c4b0feabd2", "scanner": "scanner-primary", "fingerprint": "2047f355e18e2889", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9f1d465dac194d0e", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/api/webhooks/stripe/route.ts:41"}, "properties": {"repobilityId": "7091be171c89628c", "scanner": "scanner-primary", "fingerprint": "9f1d465dac194d0e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7fc82929e6e0d1f4", "level": "none", "message": {"text": "Commented-code block (7 lines) in app/auth/reset/page.tsx:54"}, "properties": {"repobilityId": "13be5cdc64513462", "scanner": "scanner-primary", "fingerprint": "7fc82929e6e0d1f4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3fe3177f66ce20ed", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/hub/accounts/actions.ts:185"}, "properties": {"repobilityId": "2efe0aae063eb6d4", "scanner": "scanner-primary", "fingerprint": "3fe3177f66ce20ed", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-96110c3bae15ed78", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/partners/actions.ts:162"}, "properties": {"repobilityId": "6f41d7ad78779cb9", "scanner": "scanner-primary", "fingerprint": "96110c3bae15ed78", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1e988add15ae5a02", "level": "none", "message": {"text": "Commented-code block (7 lines) in app/partners/onboarding/page.tsx:21"}, "properties": {"repobilityId": "42f7fbf89506d460", "scanner": "scanner-primary", "fingerprint": "1e988add15ae5a02", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c891697d6266c458", "level": "none", "message": {"text": "Commented-code block (8 lines) in app/workspace/WorkspaceDashboardShell.tsx:42"}, "properties": {"repobilityId": "993c14d4a1ccf0d9", "scanner": "scanner-primary", "fingerprint": "c891697d6266c458", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a1e3ffc4ea0eed9e", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/OnboardingWizard.tsx:197"}, "properties": {"repobilityId": "2da74be1bfeed777", "scanner": "scanner-primary", "fingerprint": "a1e3ffc4ea0eed9e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6c2b11b49722401b", "level": "note", "message": {"text": "Legacy-named symbol `vz_geo_v1` in components/geo/CurrencyProvider.tsx:37"}, "properties": {"repobilityId": "337c535da4dd88c6", "scanner": "scanner-primary", "fingerprint": "6c2b11b49722401b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-e381c871bbf9af73", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/geo/CurrencyProvider.tsx:67"}, "properties": {"repobilityId": "2b6224e371545d54", "scanner": "scanner-primary", "fingerprint": "e381c871bbf9af73", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8933e7979e41228a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/services/LaunchExperience.tsx:433"}, "properties": {"repobilityId": "ffac2838d80902cc", "scanner": "scanner-primary", "fingerprint": "8933e7979e41228a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c2bb97ac2019badc", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/services/ExtendExperience.tsx:582"}, "properties": {"repobilityId": "e28c4607c9f1f13c", "scanner": "scanner-primary", "fingerprint": "c2bb97ac2019badc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-066ede3d3e9e125c", "level": "none", "message": {"text": "Commented-code block (6 lines) in components/services/GrowExperience.tsx:338"}, "properties": {"repobilityId": "31e22773f30f1839", "scanner": "scanner-primary", "fingerprint": "066ede3d3e9e125c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cd5ea7ac4f9050cc", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/seo/config.ts:9"}, "properties": {"repobilityId": "014f674d49ddf2e0", "scanner": "scanner-primary", "fingerprint": "cd5ea7ac4f9050cc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-eb939e3190e028ea", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/pipeline/stage-actions.ts:5"}, "properties": {"repobilityId": "7d0eb4e4898d1878", "scanner": "scanner-primary", "fingerprint": "eb939e3190e028ea", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-54bd954d8570382c", "level": "none", "message": {"text": "Commented-code block (5 lines) in e2e/client-portal.spec.ts:407"}, "properties": {"repobilityId": "087adc39c0e833bd", "scanner": "scanner-primary", "fingerprint": "54bd954d8570382c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e2ecd5645fd7b6a5", "level": "none", "message": {"text": "Commented-code block (5 lines) in e2e/auth-access.spec.ts:184"}, "properties": {"repobilityId": "97173a1080e46767", "scanner": "scanner-primary", "fingerprint": "e2ecd5645fd7b6a5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b334d875f2339fa1", "level": "note", "message": {"text": "5 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "faa38682016f5d53", "scanner": "scanner-primary", "fingerprint": "b334d875f2339fa1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}]}]}