{"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-edef82ba8d6ce249", "name": "Stray `console.log` in TS/JS \u2014 app/src/instrumentation.ts:45", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/src/instrumentation.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-2c6d822d1bf0f373", "name": "TODO/FIXME marker in shipping code \u2014 app/src/integrations/bamboohr/bamboohrConnector.ts:8", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 app/src/integrations/bamboohr/bamboohrConnector.ts:8"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ee18e0b03e9d8767", "name": "TODO/FIXME marker in shipping code \u2014 app/src/integrations/salesforce/salesforceConnector.ts:9", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 app/src/integrations/salesforce/salesforceConnector.ts:9"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e2c9cdebdf44ab80", "name": "TODO/FIXME marker in shipping code \u2014 app/src/integrations/quickbooks/quickbooksConnector.ts:7", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 app/src/integrations/quickbooks/quickbooksConnector.ts:7"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-76e0efe370e7c9b1", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/layout/CommandBar.tsx:583", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/layout/CommandBar.tsx:583"}, "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-6c9977abb09ff913", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/layout/TrailDrawer.tsx:162", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/layout/TrailDrawer.tsx:162"}, "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-0ce30668e009b1b8", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/layout/TopBar.tsx:210", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/layout/TopBar.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-e7e5d8c1e902be04", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/layout/WorkflowImpactPanel.tsx:206", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/layout/WorkflowImpactPanel.tsx:206"}, "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-de56664b33a49fe6", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/layout/Sidebar.tsx:408", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/layout/Sidebar.tsx:408"}, "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-d348f94505d0479f", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/layout/AlertCenter.tsx:157", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/layout/AlertCenter.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-044087850c97679e", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/view-trail/ViewTrailPanel.tsx:506", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/view-trail/ViewTrailPanel.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-e3855348d96d608d", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/ui/ShowingStrip.tsx:34", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/ui/ShowingStrip.tsx:34"}, "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-72418690e8738a21", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/ui/KpiTile.tsx:47", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/ui/KpiTile.tsx:47"}, "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-2f5a684bbd529744", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/agent/StateTimeline.tsx:133", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/agent/StateTimeline.tsx:133"}, "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-b2083b03bf9e3b15", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/agent/DynamicView.tsx:249", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/agent/DynamicView.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-d1f115a063128ed3", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/src/components/agent/DynamicView.tsx:479", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/src/components/agent/DynamicView.tsx:479"}, "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-257dc51104fe974a", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/agent/AgentResponseCard.tsx:86", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/agent/AgentResponseCard.tsx:86"}, "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-5dc9f18f68835728", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/finance/DeadlineTimeline.tsx:119", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/finance/DeadlineTimeline.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-dca430523ebd94fa", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/finance/ScenarioPanel.tsx:204", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/finance/ScenarioPanel.tsx:204"}, "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-3916c2190a56efdd", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/finance/JournalEntryDrawer.tsx:228", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/finance/JournalEntryDrawer.tsx:228"}, "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-db930f31a1557bdf", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/home/HomeView.tsx:426", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/home/HomeView.tsx:426"}, "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-8f41895825df29f8", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/hr/EmployeeProfileDrawer.tsx:52", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/hr/EmployeeProfileDrawer.tsx:52"}, "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-9a21e1b397b0b511", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/hr/CandidateDrawer.tsx:50", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/hr/CandidateDrawer.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-4514b2d10787bf32", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/hr/TalentManagement.tsx:46", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/hr/TalentManagement.tsx:46"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2ed593f92f5212d8", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/hr/WorkforceEngagement.tsx:64", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/hr/WorkforceEngagement.tsx:64"}, "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-55cf00c6f03f33ad", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/hr/ComplianceRisk.tsx:129", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/hr/ComplianceRisk.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-8c6bfbcf600f01ff", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/hr/CompensationOperations.tsx:124", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/hr/CompensationOperations.tsx:124"}, "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-589818fb57a12dbd", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/hr/OrgChart.tsx:58", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/hr/OrgChart.tsx:58"}, "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-83962b4ec43bf99c", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/hr/WorkforceOverview.tsx:177", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/hr/WorkforceOverview.tsx:177"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-56a569586ae63a2e", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/sales/FilterSelect.tsx:30", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/sales/FilterSelect.tsx:30"}, "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-9489e553c3835526", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/canvas/ModuleLanding.tsx:206", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/canvas/ModuleLanding.tsx:206"}, "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-c276f1367ef26caa", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/canvas/PinnedPage.tsx:149", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/canvas/PinnedPage.tsx:149"}, "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-dabc8b79118f3d66", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/canvas/SubmodulePreview/SubmodulePreviewTile.tsx", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/canvas/SubmodulePreview/SubmodulePreviewTile.tsx:169"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9401345cdc9d3f8b", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/src/app/layout.tsx:99", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/src/app/layout.tsx:99"}, "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-fda318f90e7b920f", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/finance/financial-analysis/page.tsx:365", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/finance/financial-analysis/page.tsx:365"}, "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-9a851bdce635db93", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/finance/trial-balance/page.tsx:858", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/finance/trial-balance/page.tsx:858"}, "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-1d50b312a0ec620d", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/finance/journal-entries/page.tsx:801", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/finance/journal-entries/page.tsx:801"}, "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-07a177d494a5bcc8", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/finance/tax-reports/page.tsx:1388", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/finance/tax-reports/page.tsx:1388"}, "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-6fe40d0a137265e8", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/finance/ledger-accounts/page.tsx:400", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/finance/ledger-accounts/page.tsx:400"}, "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-dfde13ff8f3cc1bc", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/finance/reconciliation/page.tsx:515", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/finance/reconciliation/page.tsx:515"}, "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-ad999a3d85ddf0ab", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/finance/overview/page.tsx:241", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/finance/overview/page.tsx:241"}, "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-c97aaa96b8439eba", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/hr/departments/page.tsx:181", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/hr/departments/page.tsx:181"}, "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-7a482cefd39db057", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/hr/payroll/page.tsx:689", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/hr/payroll/page.tsx:689"}, "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-2ee5e061efd1cf62", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/hr/onboarding/page.tsx:126", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/hr/onboarding/page.tsx:126"}, "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-3bc64c90098ce377", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/hr/expenses/page.tsx:303", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/hr/expenses/page.tsx:303"}, "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-8b35f51c1b4e4e63", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/hr/time-off/page.tsx:211", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/hr/time-off/page.tsx:211"}, "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-e20c9870564f39b1", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/hr/people/page.tsx:221", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/hr/people/page.tsx:221"}, "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-e4d3bf7bbb140c60", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/hr/hiring/page.tsx:190", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/hr/hiring/page.tsx:190"}, "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-d0075f85f58891dd", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/after-sales/overview/page.tsx:157", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/after-sales/overview/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-d712f4d8829f85fe", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/sales/insights/page.tsx:274", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/sales/insights/page.tsx:274"}, "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-3228e5467faf114b", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/sales/accounts/page.tsx:139", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/sales/accounts/page.tsx:139"}, "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-f2a8f347f9cc5e15", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/sales/forecast/page.tsx:168", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/sales/forecast/page.tsx:168"}, "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-888322681005fe09", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/sales/opportunities/page.tsx:95", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/sales/opportunities/page.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-4f640d405cbf26bb", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/sales/pipeline/page.tsx:152", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/sales/pipeline/page.tsx:152"}, "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-6304249e5bbd4313", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/sales/contacts/page.tsx:103", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/sales/contacts/page.tsx:103"}, "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-32563a89b1b21f1e", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/sales/contracts/page.tsx:88", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/sales/contracts/page.tsx:88"}, "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-7b659f6c0dfbaf2d", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/sales/overview/page.tsx:142", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/sales/overview/page.tsx:142"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b966fef7fae92e94", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/sales/quotes/page.tsx:88", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/sales/quotes/page.tsx:88"}, "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-84d5f715d53baceb", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/sales/invoices/page.tsx:137", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/sales/invoices/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-be8e29fea89f8ef5", "name": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/documents/page.tsx:142", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/documents/page.tsx:142"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2590868fa8f68880", "name": "Custom React Flow node registered without explicit width/height \u2014 app/src/lib/agent/contextRouter.ts:306", "shortDescription": {"text": "Custom React Flow node registered without explicit width/height \u2014 app/src/lib/agent/contextRouter.ts:306"}, "fullDescription": {"text": "When you register a custom node type via `nodeTypes`, the RFNode object you build must include `width` and `height` props. Without them, MiniMap renders ZERO mini-nodes for that type and `fitView` underestimates the bounds (cuts off lane labels, etc.). Add `width: \u2026, height: \u2026` to the node object. See P-I.\n\nWhy: P-I in CHECKLIST.md \u2014 RF MiniMap + fitView need explicit dims on custom nodes.\nRule id: fq.rfnode.no-dims"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-383709e31a5468d3", "name": "Stray `console.log` in TS/JS \u2014 app/src/lib/agent/trace.ts:74", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/src/lib/agent/trace.ts:74"}, "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-2464b2c39cef401e", "name": "Custom React Flow node registered without explicit width/height \u2014 app/src/lib/agent/orchestrator.ts:344", "shortDescription": {"text": "Custom React Flow node registered without explicit width/height \u2014 app/src/lib/agent/orchestrator.ts:344"}, "fullDescription": {"text": "When you register a custom node type via `nodeTypes`, the RFNode object you build must include `width` and `height` props. Without them, MiniMap renders ZERO mini-nodes for that type and `fitView` underestimates the bounds (cuts off lane labels, etc.). Add `width: \u2026, height: \u2026` to the node object. See P-I.\n\nWhy: P-I in CHECKLIST.md \u2014 RF MiniMap + fitView need explicit dims on custom nodes.\nRule id: fq.rfnode.no-dims"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e08e0a3fc3a27b58", "name": "Custom React Flow node registered without explicit width/height \u2014 app/src/lib/agent/deterministic.ts:116", "shortDescription": {"text": "Custom React Flow node registered without explicit width/height \u2014 app/src/lib/agent/deterministic.ts:116"}, "fullDescription": {"text": "When you register a custom node type via `nodeTypes`, the RFNode object you build must include `width` and `height` props. Without them, MiniMap renders ZERO mini-nodes for that type and `fitView` underestimates the bounds (cuts off lane labels, etc.). Add `width: \u2026, height: \u2026` to the node object. See P-I.\n\nWhy: P-I in CHECKLIST.md \u2014 RF MiniMap + fitView need explicit dims on custom nodes.\nRule id: fq.rfnode.no-dims"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b39f15ba2180fad5", "name": "Custom React Flow node registered without explicit width/height \u2014 app/src/lib/agent/demoFallback.ts:159", "shortDescription": {"text": "Custom React Flow node registered without explicit width/height \u2014 app/src/lib/agent/demoFallback.ts:159"}, "fullDescription": {"text": "When you register a custom node type via `nodeTypes`, the RFNode object you build must include `width` and `height` props. Without them, MiniMap renders ZERO mini-nodes for that type and `fitView` underestimates the bounds (cuts off lane labels, etc.). Add `width: \u2026, height: \u2026` to the node object. See P-I.\n\nWhy: P-I in CHECKLIST.md \u2014 RF MiniMap + fitView need explicit dims on custom nodes.\nRule id: fq.rfnode.no-dims"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-babea572affaeeec", "name": "Stray `console.log` in TS/JS \u2014 app/src/lib/agent/mcp/clients.ts:334", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/src/lib/agent/mcp/clients.ts:334"}, "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-4bbdf82414bf3f0f", "name": "Insecure pattern 'dangerous_innerhtml' in app/src/components/agent/DynamicView.tsx:479", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/src/components/agent/DynamicView.tsx:479"}, "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-7df73ef6df4f75fa", "name": "Insecure pattern 'dangerous_innerhtml' in app/src/app/layout.tsx:99", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/src/app/layout.tsx:99"}, "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-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-98db90d2a69411e4", "name": "Very large file: app/src/components/home/HomeView.tsx (1458 lines)", "shortDescription": {"text": "Very large file: app/src/components/home/HomeView.tsx (1458 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-ed3813a7adedfc39", "name": "Very large file: app/src/components/canvas/cards/index.tsx (1540 lines)", "shortDescription": {"text": "Very large file: app/src/components/canvas/cards/index.tsx (1540 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-b6312a49c327df44", "name": "Very large file: app/src/app/finance/financial-statements/page.tsx (1678 lines)", "shortDescription": {"text": "Very large file: app/src/app/finance/financial-statements/page.tsx (1678 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-a56a4a6a8e2d4fcb", "name": "Very large file: app/src/app/finance/financial-analysis/page.tsx (1320 lines)", "shortDescription": {"text": "Very large file: app/src/app/finance/financial-analysis/page.tsx (1320 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f74e0a9580d468b4", "name": "Very large file: app/src/app/finance/trial-balance/page.tsx (1543 lines)", "shortDescription": {"text": "Very large file: app/src/app/finance/trial-balance/page.tsx (1543 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-a7afd39b89e123fa", "name": "Very large file: app/src/app/finance/tax-reports/page.tsx (1555 lines)", "shortDescription": {"text": "Very large file: app/src/app/finance/tax-reports/page.tsx (1555 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-c87a303fdade6632", "name": "Very large file: app/src/lib/agent/orchestrator.ts (1292 lines)", "shortDescription": {"text": "Very large file: app/src/lib/agent/orchestrator.ts (1292 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-7adf71e1bd9af2ea", "name": "Very large file: app/src/lib/metrics/catalog.ts (1067 lines)", "shortDescription": {"text": "Very large file: app/src/lib/metrics/catalog.ts (1067 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-ef2d03669f82270e", "name": "Very large file: app/src/lib/metrics/registry.ts (1415 lines)", "shortDescription": {"text": "Very large file: app/src/lib/metrics/registry.ts (1415 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-d823239a1c2a090b", "name": "Very large file: app/src/lib/canvas/orchestrator.ts (2200 lines)", "shortDescription": {"text": "Very large file: app/src/lib/canvas/orchestrator.ts (2200 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": "26 test file(s) for 268 source file(s) (ratio 0.10). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 7 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 127 placeholder/mock markers across 56 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-27a97f0fb36c442b", "name": "Commented-code block (5 lines) in app/next.config.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in app/next.config.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-f826c02560cbebcb", "name": "Commented-code block (5 lines) in app/src/integrations/bamboohr/bamboohrConnector.ts:8", "shortDescription": {"text": "Commented-code block (5 lines) in app/src/integrations/bamboohr/bamboohrConnector.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-00330e089eeecb9b", "name": "Commented-code block (5 lines) in app/src/integrations/salesforce/salesforceConnector.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in app/src/integrations/salesforce/salesforceConnector.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-293c311e2d8b7b3e", "name": "Commented-code block (5 lines) in app/src/integrations/quickbooks/quickbooksConnector.ts:7", "shortDescription": {"text": "Commented-code block (5 lines) in app/src/integrations/quickbooks/quickbooksConnector.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-c6e81eb158f4f09b", "name": "Commented-code block (5 lines) in app/src/types/canvas.ts:317", "shortDescription": {"text": "Commented-code block (5 lines) in app/src/types/canvas.ts:317"}, "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-f51333c33a8bce62", "name": "Commented-code block (5 lines) in app/src/components/layout/CommandBar.tsx:173", "shortDescription": {"text": "Commented-code block (5 lines) in app/src/components/layout/CommandBar.tsx:173"}, "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-106387caf37df7f4", "name": "Commented-code block (8 lines) in app/src/components/layout/AppShell.tsx:20", "shortDescription": {"text": "Commented-code block (8 lines) in app/src/components/layout/AppShell.tsx:20"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c4e090d536676efc", "name": "Commented-code block (9 lines) in app/src/components/layout/Sidebar.tsx:264", "shortDescription": {"text": "Commented-code block (9 lines) in app/src/components/layout/Sidebar.tsx:264"}, "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-6934f55e9dfffe22", "name": "Commented-code block (6 lines) in app/src/components/finance/ScopeBar.tsx:43", "shortDescription": {"text": "Commented-code block (6 lines) in app/src/components/finance/ScopeBar.tsx:43"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b90106a4739fb068", "name": "Commented-code block (5 lines) in app/src/components/home/HomeView.tsx:206", "shortDescription": {"text": "Commented-code block (5 lines) in app/src/components/home/HomeView.tsx:206"}, "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-a639c8ac2678ccca", "name": "Commented-code block (6 lines) in app/src/components/canvas/CanvasShell.tsx:52", "shortDescription": {"text": "Commented-code block (6 lines) in app/src/components/canvas/CanvasShell.tsx:52"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-91e80e133c8bb8ee", "name": "Commented-code block (6 lines) in app/src/components/canvas/connectors/SourceDrawer.tsx:6", "shortDescription": {"text": "Commented-code block (6 lines) in app/src/components/canvas/connectors/SourceDrawer.tsx:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0b629a882fcb9713", "name": "Commented-code block (5 lines) in app/src/components/canvas/cards/index.tsx:69", "shortDescription": {"text": "Commented-code block (5 lines) in app/src/components/canvas/cards/index.tsx:69"}, "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-b53263dad58679f1", "name": "Commented-code block (5 lines) in app/src/app/legal/page.tsx:50", "shortDescription": {"text": "Commented-code block (5 lines) in app/src/app/legal/page.tsx:50"}, "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-a415a5f4a771e64f", "name": "Legacy-named symbol `hasOld` in app/src/app/finance/supporting-schedules/page.tsx:27", "shortDescription": {"text": "Legacy-named symbol `hasOld` in app/src/app/finance/supporting-schedules/page.tsx:27"}, "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-3035b8bf148af792", "name": "Commented-code block (6 lines) in app/src/app/finance/financial-statements/page.tsx:408", "shortDescription": {"text": "Commented-code block (6 lines) in app/src/app/finance/financial-statements/page.tsx:408"}, "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-d58a8b644564c4df", "name": "Commented-code block (5 lines) in app/src/app/finance/trial-balance/page.tsx:311", "shortDescription": {"text": "Commented-code block (5 lines) in app/src/app/finance/trial-balance/page.tsx: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-ce6c868f64fff124", "name": "Commented-code block (5 lines) in app/src/app/finance/journal-entries/page.tsx:314", "shortDescription": {"text": "Commented-code block (5 lines) in app/src/app/finance/journal-entries/page.tsx:314"}, "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-f2223221c22b4da9", "name": "Commented-code block (6 lines) in app/src/app/finance/tax-reports/page.tsx:279", "shortDescription": {"text": "Commented-code block (6 lines) in app/src/app/finance/tax-reports/page.tsx:279"}, "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-a5500519d3bc319e", "name": "Commented-code block (5 lines) in app/src/lib/useAIPrompt.ts:152", "shortDescription": {"text": "Commented-code block (5 lines) in app/src/lib/useAIPrompt.ts:152"}, "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-fa004e7f0b955a4e", "name": "Commented-code block (5 lines) in app/src/lib/useKeyboardShortcuts.ts:84", "shortDescription": {"text": "Commented-code block (5 lines) in app/src/lib/useKeyboardShortcuts.ts:84"}, "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-f89891981b27c0d9", "name": "Commented-code block (6 lines) in app/src/lib/agent/semantic.ts:42", "shortDescription": {"text": "Commented-code block (6 lines) in app/src/lib/agent/semantic.ts: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-176d5dd0faf74b3b", "name": "Commented-code block (5 lines) in app/src/lib/agent/router.ts:245", "shortDescription": {"text": "Commented-code block (5 lines) in app/src/lib/agent/router.ts:245"}, "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-48ccb9cbc16b166f", "name": "Commented-code block (5 lines) in app/src/lib/agent/tools/hr.ts:290", "shortDescription": {"text": "Commented-code block (5 lines) in app/src/lib/agent/tools/hr.ts:290"}, "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-c8130e87b88b298f", "name": "Legacy-named symbol `find_records_by_query_v2` in app/src/lib/agent/llm/systemPrompt.ts:84", "shortDescription": {"text": "Legacy-named symbol `find_records_by_query_v2` in app/src/lib/agent/llm/systemPrompt.ts:84"}, "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-e0ad78a3bd248539", "name": "Commented-code block (7 lines) in app/src/lib/agent/llm/handler.ts:71", "shortDescription": {"text": "Commented-code block (7 lines) in app/src/lib/agent/llm/handler.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-f785c16722035e20", "name": "Commented-code block (6 lines) in app/src/lib/metrics/catalog.ts:728", "shortDescription": {"text": "Commented-code block (6 lines) in app/src/lib/metrics/catalog.ts:728"}, "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-d99c4b20bc65b331", "name": "Commented-code block (7 lines) in app/src/lib/canvas/classify.ts:182", "shortDescription": {"text": "Commented-code block (7 lines) in app/src/lib/canvas/classify.ts:182"}, "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-989b3473dc423ffa", "name": "Commented-code block (5 lines) in app/src/lib/canvas/orchestrator.test.ts:182", "shortDescription": {"text": "Commented-code block (5 lines) in app/src/lib/canvas/orchestrator.test.ts:182"}, "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-df788e5a5f3bc190", "name": "Commented-code block (6 lines) in app/src/lib/canvas/orchestrator.ts:508", "shortDescription": {"text": "Commented-code block (6 lines) in app/src/lib/canvas/orchestrator.ts:508"}, "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-3d960f0c390fdd22", "name": "Commented-code block (5 lines) in app/src/store/useAlertStore.ts:116", "shortDescription": {"text": "Commented-code block (5 lines) in app/src/store/useAlertStore.ts:116"}, "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-7c8b918e1fee9558", "name": "20 env vars used in code but missing from .env.example", "shortDescription": {"text": "20 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ANTHROPIC_MODEL`, `ANTHROPIC_VALIDATOR_MODEL`, `BASE_URL`, `BUKI_MCP_CONFIG`, `BUKI_MCP_TEST_TOKEN`, `BUKI_MCP_ZAPIER_URL`, `BUKI_QBO_API_BASE`, `BUKI_QBO_REALM_ID` + 12 more. 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/22361"}, "properties": {"repository": "vivekschandrasekar-beep/Buki", "repoUrl": "https://github.com/vivekschandrasekar-beep/Buki", "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-edef82ba8d6ce249", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/src/instrumentation.ts:45"}, "properties": {"repobilityId": "b430f78349cb49f5", "scanner": "scanner-primary", "fingerprint": "edef82ba8d6ce249", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2c6d822d1bf0f373", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 app/src/integrations/bamboohr/bamboohrConnector.ts:8"}, "properties": {"repobilityId": "2afef51f39b0cc40", "scanner": "scanner-primary", "fingerprint": "2c6d822d1bf0f373", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-ee18e0b03e9d8767", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 app/src/integrations/salesforce/salesforceConnector.ts:9"}, "properties": {"repobilityId": "9595b1f2cf6db8ac", "scanner": "scanner-primary", "fingerprint": "ee18e0b03e9d8767", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-e2c9cdebdf44ab80", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 app/src/integrations/quickbooks/quickbooksConnector.ts:7"}, "properties": {"repobilityId": "3f7bd90a49b5592a", "scanner": "scanner-primary", "fingerprint": "e2c9cdebdf44ab80", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-76e0efe370e7c9b1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/layout/CommandBar.tsx:583"}, "properties": {"repobilityId": "2c735efeed107163", "scanner": "scanner-primary", "fingerprint": "76e0efe370e7c9b1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6c9977abb09ff913", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/layout/TrailDrawer.tsx:162"}, "properties": {"repobilityId": "3983fb469ec4cab6", "scanner": "scanner-primary", "fingerprint": "6c9977abb09ff913", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0ce30668e009b1b8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/layout/TopBar.tsx:210"}, "properties": {"repobilityId": "736cee3e272a60a9", "scanner": "scanner-primary", "fingerprint": "0ce30668e009b1b8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e7e5d8c1e902be04", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/layout/WorkflowImpactPanel.tsx:206"}, "properties": {"repobilityId": "fab4ccb88c710130", "scanner": "scanner-primary", "fingerprint": "e7e5d8c1e902be04", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-de56664b33a49fe6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/layout/Sidebar.tsx:408"}, "properties": {"repobilityId": "fbec8b5723d2c934", "scanner": "scanner-primary", "fingerprint": "de56664b33a49fe6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d348f94505d0479f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/layout/AlertCenter.tsx:157"}, "properties": {"repobilityId": "cce9a1eb1aa8761c", "scanner": "scanner-primary", "fingerprint": "d348f94505d0479f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-044087850c97679e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/view-trail/ViewTrailPanel.tsx:506"}, "properties": {"repobilityId": "cd07a2561e22e86e", "scanner": "scanner-primary", "fingerprint": "044087850c97679e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e3855348d96d608d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/ui/ShowingStrip.tsx:34"}, "properties": {"repobilityId": "a8d71472ae0631f3", "scanner": "scanner-primary", "fingerprint": "e3855348d96d608d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-72418690e8738a21", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/ui/KpiTile.tsx:47"}, "properties": {"repobilityId": "f93b975620063bb2", "scanner": "scanner-primary", "fingerprint": "72418690e8738a21", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2f5a684bbd529744", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/agent/StateTimeline.tsx:133"}, "properties": {"repobilityId": "86a0e626f480bb26", "scanner": "scanner-primary", "fingerprint": "2f5a684bbd529744", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b2083b03bf9e3b15", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/agent/DynamicView.tsx:249"}, "properties": {"repobilityId": "c31c92cc024b9175", "scanner": "scanner-primary", "fingerprint": "b2083b03bf9e3b15", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d1f115a063128ed3", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/src/components/agent/DynamicView.tsx:479"}, "properties": {"repobilityId": "7d6eb29ef2ac0d37", "scanner": "scanner-primary", "fingerprint": "d1f115a063128ed3", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-257dc51104fe974a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/agent/AgentResponseCard.tsx:86"}, "properties": {"repobilityId": "35c3314addcbba93", "scanner": "scanner-primary", "fingerprint": "257dc51104fe974a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5dc9f18f68835728", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/finance/DeadlineTimeline.tsx:119"}, "properties": {"repobilityId": "8d5e97ca4e0bfca5", "scanner": "scanner-primary", "fingerprint": "5dc9f18f68835728", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dca430523ebd94fa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/finance/ScenarioPanel.tsx:204"}, "properties": {"repobilityId": "9c4b04fc1363a46a", "scanner": "scanner-primary", "fingerprint": "dca430523ebd94fa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3916c2190a56efdd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/finance/JournalEntryDrawer.tsx:228"}, "properties": {"repobilityId": "4c24a1436681a617", "scanner": "scanner-primary", "fingerprint": "3916c2190a56efdd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-db930f31a1557bdf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/home/HomeView.tsx:426"}, "properties": {"repobilityId": "6c2a3826c69a5435", "scanner": "scanner-primary", "fingerprint": "db930f31a1557bdf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8f41895825df29f8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/hr/EmployeeProfileDrawer.tsx:52"}, "properties": {"repobilityId": "4cb092f6c93f2d5c", "scanner": "scanner-primary", "fingerprint": "8f41895825df29f8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9a21e1b397b0b511", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/hr/CandidateDrawer.tsx:50"}, "properties": {"repobilityId": "209854871b39b5a9", "scanner": "scanner-primary", "fingerprint": "9a21e1b397b0b511", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4514b2d10787bf32", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/hr/TalentManagement.tsx:46"}, "properties": {"repobilityId": "22d835166c122583", "scanner": "scanner-primary", "fingerprint": "4514b2d10787bf32", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2ed593f92f5212d8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/hr/WorkforceEngagement.tsx:64"}, "properties": {"repobilityId": "c1a4a43093e33bd3", "scanner": "scanner-primary", "fingerprint": "2ed593f92f5212d8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-55cf00c6f03f33ad", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/hr/ComplianceRisk.tsx:129"}, "properties": {"repobilityId": "f69f0b3b038108e4", "scanner": "scanner-primary", "fingerprint": "55cf00c6f03f33ad", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8c6bfbcf600f01ff", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/hr/CompensationOperations.tsx:124"}, "properties": {"repobilityId": "a2334ee943ada48f", "scanner": "scanner-primary", "fingerprint": "8c6bfbcf600f01ff", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-589818fb57a12dbd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/hr/OrgChart.tsx:58"}, "properties": {"repobilityId": "bd4ccb07a03ca6a2", "scanner": "scanner-primary", "fingerprint": "589818fb57a12dbd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-83962b4ec43bf99c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/hr/WorkforceOverview.tsx:177"}, "properties": {"repobilityId": "b0e4e35b20d675cf", "scanner": "scanner-primary", "fingerprint": "83962b4ec43bf99c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-56a569586ae63a2e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/sales/FilterSelect.tsx:30"}, "properties": {"repobilityId": "93ff880af0c0de88", "scanner": "scanner-primary", "fingerprint": "56a569586ae63a2e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9489e553c3835526", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/canvas/ModuleLanding.tsx:206"}, "properties": {"repobilityId": "05fa46421863ba48", "scanner": "scanner-primary", "fingerprint": "9489e553c3835526", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c276f1367ef26caa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/canvas/PinnedPage.tsx:149"}, "properties": {"repobilityId": "c3fde23f3d73b00b", "scanner": "scanner-primary", "fingerprint": "c276f1367ef26caa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dabc8b79118f3d66", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/components/canvas/SubmodulePreview/SubmodulePreviewTile.tsx:169"}, "properties": {"repobilityId": "5b78e74570f14a21", "scanner": "scanner-primary", "fingerprint": "dabc8b79118f3d66", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9401345cdc9d3f8b", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/src/app/layout.tsx:99"}, "properties": {"repobilityId": "937c5a8dea5c63be", "scanner": "scanner-primary", "fingerprint": "9401345cdc9d3f8b", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-fda318f90e7b920f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/finance/financial-analysis/page.tsx:365"}, "properties": {"repobilityId": "907da2cb53646069", "scanner": "scanner-primary", "fingerprint": "fda318f90e7b920f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9a851bdce635db93", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/finance/trial-balance/page.tsx:858"}, "properties": {"repobilityId": "1eae21075a028d2b", "scanner": "scanner-primary", "fingerprint": "9a851bdce635db93", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1d50b312a0ec620d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/finance/journal-entries/page.tsx:801"}, "properties": {"repobilityId": "39c74de518d3f7f8", "scanner": "scanner-primary", "fingerprint": "1d50b312a0ec620d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-07a177d494a5bcc8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/finance/tax-reports/page.tsx:1388"}, "properties": {"repobilityId": "3272c86020dcfcac", "scanner": "scanner-primary", "fingerprint": "07a177d494a5bcc8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6fe40d0a137265e8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/finance/ledger-accounts/page.tsx:400"}, "properties": {"repobilityId": "0a037b5ec6da497a", "scanner": "scanner-primary", "fingerprint": "6fe40d0a137265e8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dfde13ff8f3cc1bc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/finance/reconciliation/page.tsx:515"}, "properties": {"repobilityId": "a42d730d7cf4bf95", "scanner": "scanner-primary", "fingerprint": "dfde13ff8f3cc1bc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ad999a3d85ddf0ab", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/finance/overview/page.tsx:241"}, "properties": {"repobilityId": "aeda566218f43229", "scanner": "scanner-primary", "fingerprint": "ad999a3d85ddf0ab", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c97aaa96b8439eba", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/hr/departments/page.tsx:181"}, "properties": {"repobilityId": "be4d71d8448a2aee", "scanner": "scanner-primary", "fingerprint": "c97aaa96b8439eba", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7a482cefd39db057", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/hr/payroll/page.tsx:689"}, "properties": {"repobilityId": "41d954e051318e55", "scanner": "scanner-primary", "fingerprint": "7a482cefd39db057", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2ee5e061efd1cf62", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/hr/onboarding/page.tsx:126"}, "properties": {"repobilityId": "b503747c8f19a1e4", "scanner": "scanner-primary", "fingerprint": "2ee5e061efd1cf62", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3bc64c90098ce377", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/hr/expenses/page.tsx:303"}, "properties": {"repobilityId": "53fd20a4dfb81e08", "scanner": "scanner-primary", "fingerprint": "3bc64c90098ce377", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8b35f51c1b4e4e63", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/hr/time-off/page.tsx:211"}, "properties": {"repobilityId": "8d42d4cb984c90a2", "scanner": "scanner-primary", "fingerprint": "8b35f51c1b4e4e63", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e20c9870564f39b1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/hr/people/page.tsx:221"}, "properties": {"repobilityId": "7b5c5e31edaa5c6d", "scanner": "scanner-primary", "fingerprint": "e20c9870564f39b1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e4d3bf7bbb140c60", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/hr/hiring/page.tsx:190"}, "properties": {"repobilityId": "35101fce79095d52", "scanner": "scanner-primary", "fingerprint": "e4d3bf7bbb140c60", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d0075f85f58891dd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/after-sales/overview/page.tsx:157"}, "properties": {"repobilityId": "3050e2f5fe314d0f", "scanner": "scanner-primary", "fingerprint": "d0075f85f58891dd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d712f4d8829f85fe", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/sales/insights/page.tsx:274"}, "properties": {"repobilityId": "8975343e8efae095", "scanner": "scanner-primary", "fingerprint": "d712f4d8829f85fe", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3228e5467faf114b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/sales/accounts/page.tsx:139"}, "properties": {"repobilityId": "e86ed5841fd040c2", "scanner": "scanner-primary", "fingerprint": "3228e5467faf114b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f2a8f347f9cc5e15", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/sales/forecast/page.tsx:168"}, "properties": {"repobilityId": "8c7cad82820fea10", "scanner": "scanner-primary", "fingerprint": "f2a8f347f9cc5e15", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-888322681005fe09", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/sales/opportunities/page.tsx:95"}, "properties": {"repobilityId": "e65e899608aaaea6", "scanner": "scanner-primary", "fingerprint": "888322681005fe09", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4f640d405cbf26bb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/sales/pipeline/page.tsx:152"}, "properties": {"repobilityId": "4c3ad128010d688c", "scanner": "scanner-primary", "fingerprint": "4f640d405cbf26bb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6304249e5bbd4313", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/sales/contacts/page.tsx:103"}, "properties": {"repobilityId": "c507c8c6108c409b", "scanner": "scanner-primary", "fingerprint": "6304249e5bbd4313", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-32563a89b1b21f1e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/sales/contracts/page.tsx:88"}, "properties": {"repobilityId": "45f8292cffc04d74", "scanner": "scanner-primary", "fingerprint": "32563a89b1b21f1e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7b659f6c0dfbaf2d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/sales/overview/page.tsx:142"}, "properties": {"repobilityId": "d8e6a1a4c2eec89e", "scanner": "scanner-primary", "fingerprint": "7b659f6c0dfbaf2d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b966fef7fae92e94", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/sales/quotes/page.tsx:88"}, "properties": {"repobilityId": "c8932f3bb0a548df", "scanner": "scanner-primary", "fingerprint": "b966fef7fae92e94", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-84d5f715d53baceb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/sales/invoices/page.tsx:137"}, "properties": {"repobilityId": "b3c44572b7a41fb9", "scanner": "scanner-primary", "fingerprint": "84d5f715d53baceb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-be8e29fea89f8ef5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/src/app/documents/page.tsx:142"}, "properties": {"repobilityId": "f8259b79406b32c7", "scanner": "scanner-primary", "fingerprint": "be8e29fea89f8ef5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2590868fa8f68880", "level": "warning", "message": {"text": "Custom React Flow node registered without explicit width/height \u2014 app/src/lib/agent/contextRouter.ts:306"}, "properties": {"repobilityId": "a4cb635ca4a53a80", "scanner": "scanner-primary", "fingerprint": "2590868fa8f68880", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.rfnode.no-dims"]}}, {"ruleId": "scanner-383709e31a5468d3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/src/lib/agent/trace.ts:74"}, "properties": {"repobilityId": "fb452274d524ba5d", "scanner": "scanner-primary", "fingerprint": "383709e31a5468d3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2464b2c39cef401e", "level": "warning", "message": {"text": "Custom React Flow node registered without explicit width/height \u2014 app/src/lib/agent/orchestrator.ts:344"}, "properties": {"repobilityId": "1671b36664bc5ab9", "scanner": "scanner-primary", "fingerprint": "2464b2c39cef401e", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.rfnode.no-dims"]}}, {"ruleId": "scanner-e08e0a3fc3a27b58", "level": "warning", "message": {"text": "Custom React Flow node registered without explicit width/height \u2014 app/src/lib/agent/deterministic.ts:116"}, "properties": {"repobilityId": "d75268250a68793d", "scanner": "scanner-primary", "fingerprint": "e08e0a3fc3a27b58", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.rfnode.no-dims"]}}, {"ruleId": "scanner-b39f15ba2180fad5", "level": "warning", "message": {"text": "Custom React Flow node registered without explicit width/height \u2014 app/src/lib/agent/demoFallback.ts:159"}, "properties": {"repobilityId": "f09d0f79ea84e10e", "scanner": "scanner-primary", "fingerprint": "b39f15ba2180fad5", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.rfnode.no-dims"]}}, {"ruleId": "scanner-babea572affaeeec", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/src/lib/agent/mcp/clients.ts:334"}, "properties": {"repobilityId": "07200ba5a2f7a9cd", "scanner": "scanner-primary", "fingerprint": "babea572affaeeec", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4bbdf82414bf3f0f", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/src/components/agent/DynamicView.tsx:479"}, "properties": {"repobilityId": "e679da262bca5cd8", "scanner": "scanner-primary", "fingerprint": "4bbdf82414bf3f0f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/src/components/agent/DynamicView.tsx"}, "region": {"startLine": 479}}}]}, {"ruleId": "scanner-7df73ef6df4f75fa", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/src/app/layout.tsx:99"}, "properties": {"repobilityId": "53bab1f943e0d7ab", "scanner": "scanner-primary", "fingerprint": "7df73ef6df4f75fa", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/src/app/layout.tsx"}, "region": {"startLine": 99}}}]}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-98db90d2a69411e4", "level": "note", "message": {"text": "Very large file: app/src/components/home/HomeView.tsx (1458 lines)"}, "properties": {"repobilityId": "ac1cccbe86b3f616", "scanner": "scanner-primary", "fingerprint": "98db90d2a69411e4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ed3813a7adedfc39", "level": "note", "message": {"text": "Very large file: app/src/components/canvas/cards/index.tsx (1540 lines)"}, "properties": {"repobilityId": "fece2ded794efc5d", "scanner": "scanner-primary", "fingerprint": "ed3813a7adedfc39", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b6312a49c327df44", "level": "note", "message": {"text": "Very large file: app/src/app/finance/financial-statements/page.tsx (1678 lines)"}, "properties": {"repobilityId": "2e735c17f6b3d71f", "scanner": "scanner-primary", "fingerprint": "b6312a49c327df44", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a56a4a6a8e2d4fcb", "level": "note", "message": {"text": "Very large file: app/src/app/finance/financial-analysis/page.tsx (1320 lines)"}, "properties": {"repobilityId": "81e411cb7f74701e", "scanner": "scanner-primary", "fingerprint": "a56a4a6a8e2d4fcb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f74e0a9580d468b4", "level": "note", "message": {"text": "Very large file: app/src/app/finance/trial-balance/page.tsx (1543 lines)"}, "properties": {"repobilityId": "6dd46667333f698c", "scanner": "scanner-primary", "fingerprint": "f74e0a9580d468b4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a7afd39b89e123fa", "level": "note", "message": {"text": "Very large file: app/src/app/finance/tax-reports/page.tsx (1555 lines)"}, "properties": {"repobilityId": "e444c3a0535419f4", "scanner": "scanner-primary", "fingerprint": "a7afd39b89e123fa", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c87a303fdade6632", "level": "note", "message": {"text": "Very large file: app/src/lib/agent/orchestrator.ts (1292 lines)"}, "properties": {"repobilityId": "670b44d5a45cffd5", "scanner": "scanner-primary", "fingerprint": "c87a303fdade6632", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-7adf71e1bd9af2ea", "level": "note", "message": {"text": "Very large file: app/src/lib/metrics/catalog.ts (1067 lines)"}, "properties": {"repobilityId": "15d0280fd15521e2", "scanner": "scanner-primary", "fingerprint": "7adf71e1bd9af2ea", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ef2d03669f82270e", "level": "note", "message": {"text": "Very large file: app/src/lib/metrics/registry.ts (1415 lines)"}, "properties": {"repobilityId": "375acacd591a92fe", "scanner": "scanner-primary", "fingerprint": "ef2d03669f82270e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d823239a1c2a090b", "level": "note", "message": {"text": "Very large file: app/src/lib/canvas/orchestrator.ts (2200 lines)"}, "properties": {"repobilityId": "ee0593e149533a8d", "scanner": "scanner-primary", "fingerprint": "d823239a1c2a090b", "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": "26cb53843921a1a6", "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": "b3ea5b398cced7c7", "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": "aa913150b06ec6ed", "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": "a20d47684c945683", "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": "9a244f6ea0f9ca57", "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": "538cc0df124b5c7e", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "121f33959321aac2", "scanner": "scanner-primary", "fingerprint": "ea8f3013f588db25", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-8424db9c75e04ba4", "level": "none", "message": {"text": "Very short observed git history"}, "properties": {"repobilityId": "0366514afc25544c", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-27a97f0fb36c442b", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/next.config.ts:5"}, "properties": {"repobilityId": "1f698a99b73ab408", "scanner": "scanner-primary", "fingerprint": "27a97f0fb36c442b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f826c02560cbebcb", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/src/integrations/bamboohr/bamboohrConnector.ts:8"}, "properties": {"repobilityId": "f9edc367a1971200", "scanner": "scanner-primary", "fingerprint": "f826c02560cbebcb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-00330e089eeecb9b", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/src/integrations/salesforce/salesforceConnector.ts:3"}, "properties": {"repobilityId": "322fef0daa35158e", "scanner": "scanner-primary", "fingerprint": "00330e089eeecb9b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-293c311e2d8b7b3e", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/src/integrations/quickbooks/quickbooksConnector.ts:7"}, "properties": {"repobilityId": "b8457fcd824caf4a", "scanner": "scanner-primary", "fingerprint": "293c311e2d8b7b3e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c6e81eb158f4f09b", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/src/types/canvas.ts:317"}, "properties": {"repobilityId": "259f7695b87040ef", "scanner": "scanner-primary", "fingerprint": "c6e81eb158f4f09b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f51333c33a8bce62", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/src/components/layout/CommandBar.tsx:173"}, "properties": {"repobilityId": "fb96c25396c55444", "scanner": "scanner-primary", "fingerprint": "f51333c33a8bce62", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-106387caf37df7f4", "level": "none", "message": {"text": "Commented-code block (8 lines) in app/src/components/layout/AppShell.tsx:20"}, "properties": {"repobilityId": "0c3523ac690848b0", "scanner": "scanner-primary", "fingerprint": "106387caf37df7f4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c4e090d536676efc", "level": "none", "message": {"text": "Commented-code block (9 lines) in app/src/components/layout/Sidebar.tsx:264"}, "properties": {"repobilityId": "5739154f0a908bc9", "scanner": "scanner-primary", "fingerprint": "c4e090d536676efc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6934f55e9dfffe22", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/src/components/finance/ScopeBar.tsx:43"}, "properties": {"repobilityId": "e3f6d1e7f4f12ac1", "scanner": "scanner-primary", "fingerprint": "6934f55e9dfffe22", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b90106a4739fb068", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/src/components/home/HomeView.tsx:206"}, "properties": {"repobilityId": "aa79b33b948fb82e", "scanner": "scanner-primary", "fingerprint": "b90106a4739fb068", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a639c8ac2678ccca", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/src/components/canvas/CanvasShell.tsx:52"}, "properties": {"repobilityId": "676088928dbc861f", "scanner": "scanner-primary", "fingerprint": "a639c8ac2678ccca", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-91e80e133c8bb8ee", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/src/components/canvas/connectors/SourceDrawer.tsx:6"}, "properties": {"repobilityId": "5b7105114c35382f", "scanner": "scanner-primary", "fingerprint": "91e80e133c8bb8ee", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0b629a882fcb9713", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/src/components/canvas/cards/index.tsx:69"}, "properties": {"repobilityId": "8f1c21cce9e6d943", "scanner": "scanner-primary", "fingerprint": "0b629a882fcb9713", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b53263dad58679f1", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/src/app/legal/page.tsx:50"}, "properties": {"repobilityId": "0326a76394b62d98", "scanner": "scanner-primary", "fingerprint": "b53263dad58679f1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a415a5f4a771e64f", "level": "note", "message": {"text": "Legacy-named symbol `hasOld` in app/src/app/finance/supporting-schedules/page.tsx:27"}, "properties": {"repobilityId": "4fa289325db0957e", "scanner": "scanner-primary", "fingerprint": "a415a5f4a771e64f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-3035b8bf148af792", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/src/app/finance/financial-statements/page.tsx:408"}, "properties": {"repobilityId": "b2b9dc66efa73209", "scanner": "scanner-primary", "fingerprint": "3035b8bf148af792", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d58a8b644564c4df", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/src/app/finance/trial-balance/page.tsx:311"}, "properties": {"repobilityId": "a358e7430d6a52a0", "scanner": "scanner-primary", "fingerprint": "d58a8b644564c4df", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ce6c868f64fff124", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/src/app/finance/journal-entries/page.tsx:314"}, "properties": {"repobilityId": "b3deb0af72ae95f3", "scanner": "scanner-primary", "fingerprint": "ce6c868f64fff124", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f2223221c22b4da9", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/src/app/finance/tax-reports/page.tsx:279"}, "properties": {"repobilityId": "d6a00e3f7c19fe82", "scanner": "scanner-primary", "fingerprint": "f2223221c22b4da9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a5500519d3bc319e", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/src/lib/useAIPrompt.ts:152"}, "properties": {"repobilityId": "586e8640ee9597ab", "scanner": "scanner-primary", "fingerprint": "a5500519d3bc319e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fa004e7f0b955a4e", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/src/lib/useKeyboardShortcuts.ts:84"}, "properties": {"repobilityId": "67d00d288314f403", "scanner": "scanner-primary", "fingerprint": "fa004e7f0b955a4e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f89891981b27c0d9", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/src/lib/agent/semantic.ts:42"}, "properties": {"repobilityId": "90168f978a52e0b7", "scanner": "scanner-primary", "fingerprint": "f89891981b27c0d9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-176d5dd0faf74b3b", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/src/lib/agent/router.ts:245"}, "properties": {"repobilityId": "0a3e0a5261d5550d", "scanner": "scanner-primary", "fingerprint": "176d5dd0faf74b3b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-48ccb9cbc16b166f", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/src/lib/agent/tools/hr.ts:290"}, "properties": {"repobilityId": "42cd86e7e31a566f", "scanner": "scanner-primary", "fingerprint": "48ccb9cbc16b166f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c8130e87b88b298f", "level": "note", "message": {"text": "Legacy-named symbol `find_records_by_query_v2` in app/src/lib/agent/llm/systemPrompt.ts:84"}, "properties": {"repobilityId": "63fbcf1eb2146520", "scanner": "scanner-primary", "fingerprint": "c8130e87b88b298f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-e0ad78a3bd248539", "level": "none", "message": {"text": "Commented-code block (7 lines) in app/src/lib/agent/llm/handler.ts:71"}, "properties": {"repobilityId": "b9e99926a39c9b0e", "scanner": "scanner-primary", "fingerprint": "e0ad78a3bd248539", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f785c16722035e20", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/src/lib/metrics/catalog.ts:728"}, "properties": {"repobilityId": "c31ea0c29ab3bc2f", "scanner": "scanner-primary", "fingerprint": "f785c16722035e20", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d99c4b20bc65b331", "level": "none", "message": {"text": "Commented-code block (7 lines) in app/src/lib/canvas/classify.ts:182"}, "properties": {"repobilityId": "1a28756d29ffb3b9", "scanner": "scanner-primary", "fingerprint": "d99c4b20bc65b331", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-989b3473dc423ffa", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/src/lib/canvas/orchestrator.test.ts:182"}, "properties": {"repobilityId": "6e5ba2f0ea744c87", "scanner": "scanner-primary", "fingerprint": "989b3473dc423ffa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-df788e5a5f3bc190", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/src/lib/canvas/orchestrator.ts:508"}, "properties": {"repobilityId": "c50cea00a365873e", "scanner": "scanner-primary", "fingerprint": "df788e5a5f3bc190", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3d960f0c390fdd22", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/src/store/useAlertStore.ts:116"}, "properties": {"repobilityId": "55f9cd3c8aa72fa3", "scanner": "scanner-primary", "fingerprint": "3d960f0c390fdd22", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7c8b918e1fee9558", "level": "note", "message": {"text": "20 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "bd1f6d44917e8105", "scanner": "scanner-primary", "fingerprint": "7c8b918e1fee9558", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}]}]}