{"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-664e500b03030fc3", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 .claude/workflows/audit-prod.workflow.js:199", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 .claude/workflows/audit-prod.workflow.js:199"}, "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-27a75cb8f3d0e726", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/shared/breakdown-bar.tsx:18", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/shared/breakdown-bar.tsx:18"}, "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-afa4366690395157", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/shared/page-header.tsx:39", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/shared/page-header.tsx:39"}, "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-377ebd4ea869aed1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/command-palette.tsx:177", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/command-palette.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-6d53b6283ebb211b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/mayorista-tab.tsx:540", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/mayorista-tab.tsx:540"}, "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-c9ae1c14281babc9", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/admin-shell.tsx:309", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/admin-shell.tsx:309"}, "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-e7a5614119b3d2c1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/order-sheet.tsx:165", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/order-sheet.tsx:165"}, "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-b847d0a47ecdb886", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing/theater-action-done.tsx:20", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing/theater-action-done.tsx:20"}, "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-cb2a6305db397cf8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing/kit-chat-preview.tsx:126", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing/kit-chat-preview.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-b429d6f70a187d6d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing/kit-showcase.tsx:139", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing/kit-showcase.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-635e68eb529c2715", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing/escape-tutorial/escape-tutorial-phone.tsx:27", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing/escape-tutorial/escape-tutorial-phone.tsx:270"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-89befb31fb657084", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/public/catalog-header.tsx:92", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/public/catalog-header.tsx:92"}, "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-3cc67ebd27c7f444", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/public/shipping-selector.tsx:77", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/public/shipping-selector.tsx:77"}, "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-a134545cddba2f5b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/public/product-detail-drawer.tsx:80", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/public/product-detail-drawer.tsx:80"}, "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-49a930947861498c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/public/order-confirmation.tsx:173", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/public/order-confirmation.tsx:173"}, "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-41492aa0547397f0", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/public/json-ld.tsx:14", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/public/json-ld.tsx:14"}, "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-551af02bd8848d89", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/superadmin/stores-table.tsx:123", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/superadmin/stores-table.tsx:123"}, "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-90f7af13a9234d54", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/superadmin/coupons-panel.tsx:301", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/superadmin/coupons-panel.tsx:301"}, "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-4e53265c28cf072f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/superadmin/superadmin-shell.tsx:105", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/superadmin/superadmin-shell.tsx:105"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3bee4e7d6f6d8849", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/superadmin/webhooks-table.tsx:142", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/superadmin/webhooks-table.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-6c7e568badaae6bb", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/superadmin/store-detail-panel.tsx:413", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/superadmin/store-detail-panel.tsx:413"}, "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-ec352de347f52a6b", "name": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 src/app/(admin)/admin/chat-view.tsx:268", "shortDescription": {"text": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 src/app/(admin)/admin/chat-view.tsx:268"}, "fullDescription": {"text": "React Flow edge labels render with a white rectangle behind the text by default, which scatters bright boxes across a dark canvas. Either drop the label, or override `.react-flow__edge-textbg` and `.react-flow__edge-text` in your stylesheet.\n\nWhy: P-H in CHECKLIST.md \u2014 vendor edge labels bleed white through a dark canvas.\nRule id: fq.edge-label.no-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d5e2d72387a137e5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/settings/team/page.tsx:236", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/settings/team/page.tsx:236"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b677311c5efa9791", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/orders/_components/orders-client.tsx:317", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/orders/_components/orders-client.tsx:317"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cb7bc444f3052556", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/ventas/page.tsx:245", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/ventas/page.tsx:245"}, "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-bb3137a6f9e4f1c5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/components/session-history-sheet.tsx:285", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/components/session-history-sheet.tsx:285"}, "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-8f7d033ae1b36b71", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/components/chat-message.tsx:370", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/components/chat-message.tsx:370"}, "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-bc69dcb8dbb1b099", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/customers/_components/customers-client.tsx:18", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/customers/_components/customers-client.tsx:187"}, "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-ad01b71f7c2d25d3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/stock/stock-view.tsx:363", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/stock/stock-view.tsx:363"}, "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-8523469c9d88c2c1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/finance/metrics-view.tsx:473", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/finance/metrics-view.tsx:473"}, "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-a39760d551534e50", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/savings/savings-view.tsx:414", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/savings/savings-view.tsx:414"}, "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-0818abe90052bf66", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/banners/page.tsx:118", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/banners/page.tsx:118"}, "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-25f9b3db91f56027", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/categories/page.tsx:113", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/categories/page.tsx:113"}, "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-bbefca0f4a1cfefa", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/sections/page.tsx:88", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/sections/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-72f55c59bad91fbf", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/kit-settings/kit-automations.tsx:125", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/kit-settings/kit-automations.tsx:125"}, "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-8e02f7f321ee2d58", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/expenses/expenses-view.tsx:488", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/expenses/expenses-view.tsx:488"}, "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-0b19c6995a117a15", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/shipping/page.tsx:499", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/shipping/page.tsx:499"}, "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-1ba523c48a78b68e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/products/[id]/variants/page.tsx:68", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/products/[id]/variants/page.tsx:68"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-148c45c8902699d2", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/products/_components/products-client.tsx:312", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/products/_components/products-client.tsx:312"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0a2fe8b2892e003e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(centrodedatos)/centrodedatos/page.tsx:335", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(centrodedatos)/centrodedatos/page.tsx:335"}, "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-fda7125626ec2706", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(centrodedatos)/centrodedatos/ia/page.tsx:228", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(centrodedatos)/centrodedatos/ia/page.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-d8d972521c79f602", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(centrodedatos)/centrodedatos/revenue/page.tsx:57", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(centrodedatos)/centrodedatos/revenue/page.tsx:57"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e316fd766ee14bd8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/onboarding/building/building-client.tsx:139", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/onboarding/building/building-client.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-e17acf45fdab0c19", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/onboarding/done/done-client.tsx:62", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/onboarding/done/done-client.tsx:62"}, "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-88a384ca6816a1ba", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/onboarding/setup/page.tsx:173", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/onboarding/setup/page.tsx:173"}, "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-88b3ec568280c9c4", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(public)/[slug]/tracking/[orderId]/page.tsx:240", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(public)/[slug]/tracking/[orderId]/page.tsx:240"}, "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-64c3a9a098c0cbae", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(public)/[slug]/_components/created-panel.tsx:133", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(public)/[slug]/_components/created-panel.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-3fa7329bea5dcc32", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(superadmin)/superadmin/page.tsx:257", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(superadmin)/superadmin/page.tsx:257"}, "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-898166310484e6a7", "name": "Stray `console.log` in TS/JS \u2014 src/lib/ai/evals/report.ts:133", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/ai/evals/report.ts:133"}, "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-5ec65239e8ee3496", "name": "Stray `console.log` in TS/JS \u2014 src/lib/ai/evals/benchmark.eval.ts:87", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/ai/evals/benchmark.eval.ts:87"}, "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-b2e61643729c1bbe", "name": "Insecure pattern 'node_child_process' in scripts/gen-supabase-types.mjs:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/gen-supabase-types.mjs:1"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c345c30c265ea6b2", "name": "Insecure pattern 'dangerous_innerhtml' in .claude/workflows/audit-prod.workflow.js:199", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in .claude/workflows/audit-prod.workflow.js:199"}, "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-a8434a1cd8e2bae1", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/public/json-ld.tsx:14", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/public/json-ld.tsx:14"}, "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-f6218ce724215988", "name": "Insecure pattern 'local_storage_auth_token' in src/app/(admin)/admin/chat-view.tsx:387", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in src/app/(admin)/admin/chat-view.tsx:387"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0e1884302edadd34", "name": "Very large file: src/components/admin/product-sheet.tsx (1821 lines)", "shortDescription": {"text": "Very large file: src/components/admin/product-sheet.tsx (1821 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-b365dc7d761fd2b5", "name": "Very large file: src/app/api/ai/chat/route.ts (2021 lines)", "shortDescription": {"text": "Very large file: src/app/api/ai/chat/route.ts (2021 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-f8c2c13b5881cd43", "name": "Very large file: src/app/(admin)/admin/chat-view.tsx (1248 lines)", "shortDescription": {"text": "Very large file: src/app/(admin)/admin/chat-view.tsx (1248 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-de55fca0d51e9bd6", "name": "Very large file: src/app/(admin)/admin/ventas/page.tsx (1413 lines)", "shortDescription": {"text": "Very large file: src/app/(admin)/admin/ventas/page.tsx (1413 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-ea8846343df33ba0", "name": "Very large file: src/lib/types/database.ts (1788 lines)", "shortDescription": {"text": "Very large file: src/lib/types/database.ts (1788 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": "40 test file(s) for 611 source file(s) (ratio 0.07). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9e154caabf0aa34c", "name": "56 TODO/FIXME markers", "shortDescription": {"text": "56 TODO/FIXME markers"}, "fullDescription": {"text": "High count of TODO/FIXME/HACK markers \u2014 track them as issues so they're not forgotten."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 161 placeholder/mock markers across 59 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-9d79c4077342a7d0", "name": "Runtime service client appears to use placeholder configuration", "shortDescription": {"text": "Runtime service client appears to use placeholder configuration"}, "fullDescription": {"text": "A runtime source file appears to wire Supabase/Firebase/AI/payment-style clients to placeholder URLs, keys, or fallback values. In the Fable corpus this often means the UI/API shape is present while the backend service is not actually configured."}, "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-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. 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-17d866d91a7c451e", "name": "Agent instruction/config may expose a secret: CLAUDE.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: CLAUDE.md"}, "fullDescription": {"text": "Agent-facing files are routinely pasted into LLM/tool contexts. Move literal tokens, keys, and passwords into a secret manager or document them as placeholders only."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-cb04d3636215126e", "name": "Commented-code block (5 lines) in scripts/loadtest/chat-smoke.js:12", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/loadtest/chat-smoke.js:12"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f1138532e9d9d17f", "name": "Commented-code block (5 lines) in src/middleware.ts:304", "shortDescription": {"text": "Commented-code block (5 lines) in src/middleware.ts:304"}, "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-186fa5f9fbd78408", "name": "Commented-code block (6 lines) in src/app/providers.tsx:71", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/providers.tsx: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-4899b515769e8f18", "name": "Commented-code block (5 lines) in src/app/api/ai/chat/route.ts:128", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/ai/chat/route.ts:128"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-82ff79cb27dfb13a", "name": "Commented-code block (5 lines) in src/app/api/webhooks/mercadopago/route.ts:215", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/webhooks/mercadopago/route.ts:215"}, "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-e54db6d99c246b4f", "name": "Commented-code block (5 lines) in src/app/(admin)/admin/chat-view.tsx:358", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/(admin)/admin/chat-view.tsx:358"}, "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-05b610c2f4816758", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/admin/chat-view.tsx:395", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/admin/chat-view.tsx:395"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6e7167686839c84c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/onboarding/setup/page.tsx:285", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/onboarding/setup/page.tsx:285"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4d1daf1bf13a429f", "name": "Commented-code block (5 lines) in src/lib/cache.ts:31", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/cache.ts:31"}, "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-affe13c87f8da911", "name": "Commented-code block (5 lines) in src/lib/ratelimit.ts:57", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/ratelimit.ts:57"}, "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-f67412fd6947253a", "name": "Commented-code block (6 lines) in src/lib/ai/tool-catalog.ts:153", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/ai/tool-catalog.ts:153"}, "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-ddd2653120c549b2", "name": "Commented-code block (5 lines) in src/lib/ai/undo.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/ai/undo.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-4045a3fc908a9d07", "name": "Commented-code block (5 lines) in src/lib/ai/tool-schema-drift.test.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/ai/tool-schema-drift.test.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-71097e1a7e73c31e", "name": "Commented-code block (6 lines) in src/lib/ai/llm.ts:147", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/ai/llm.ts:147"}, "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-dfc0b32b4ff44faf", "name": "Legacy-named symbol `hoursOld` in src/lib/ai/context-loader.ts:169", "shortDescription": {"text": "Legacy-named symbol `hoursOld` in src/lib/ai/context-loader.ts:169"}, "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-14f897f2b78052b0", "name": "Commented-code block (5 lines) in src/lib/ai/tools/kit.ts:113", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/ai/tools/kit.ts:113"}, "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-52e13e4e6d5299f8", "name": "Commented-code block (5 lines) in src/lib/ai/evals/run.eval.ts:11", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/ai/evals/run.eval.ts:11"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7f8d1e1d3bcf6155", "name": "Commented-code block (6 lines) in src/lib/ai/evals/judge.ts:4", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/ai/evals/judge.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c5c65c959ae7f667", "name": "Commented-code block (6 lines) in src/lib/ai/evals/mock-executor.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/ai/evals/mock-executor.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8468e71a13044db4", "name": "Commented-code block (6 lines) in src/lib/ai/evals/benchmark.eval.ts:10", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/ai/evals/benchmark.eval.ts:10"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-de32e6e989ada8ad", "name": "Commented-code block (5 lines) in src/lib/ai/evals/load-env.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/ai/evals/load-env.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bc98d0dd662af29c", "name": "Legacy-named symbol `cat_old` in src/lib/ai/evals/golden-set.ts:302", "shortDescription": {"text": "Legacy-named symbol `cat_old` in src/lib/ai/evals/golden-set.ts:302"}, "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-397a2075baec2dc7", "name": "Commented-code block (5 lines) in src/lib/ai/evals/golden-set.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/ai/evals/golden-set.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-884d5dd7007ff214", "name": "Commented-code block (5 lines) in src/lib/ai/evals/types.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/ai/evals/types.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1c01bc5900acbd23", "name": "Commented-code block (6 lines) in src/lib/crypto/payment-tokens.ts:7", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/crypto/payment-tokens.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-285333be2241e438", "name": "Legacy-named symbol `hoursOld` in src/lib/tasks/order-status-map.ts:44", "shortDescription": {"text": "Legacy-named symbol `hoursOld` in src/lib/tasks/order-status-map.ts:44"}, "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-fb7b831d9935f0da", "name": "Legacy-named symbol `hoursOld` in src/lib/tasks/evaluators/payments.ts:44", "shortDescription": {"text": "Legacy-named symbol `hoursOld` in src/lib/tasks/evaluators/payments.ts:44"}, "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-47b7ea71166e3e56", "name": "Commented-code block (6 lines) in src/lib/billing/calculator.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/billing/calculator.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-ed50e31285edc7cd", "name": "Commented-code block (5 lines) in src/lib/payments/mercadopago-oauth.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/payments/mercadopago-oauth.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-db850864479877b5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/payments/mercadopago-oauth.ts:53", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/payments/mercadopago-oauth.ts:53"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-19a3a4d1e98d4932", "name": "Commented-code block (5 lines) in src/lib/actions/billing.ts:560", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/actions/billing.ts:560"}, "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-e5110465b9b78605", "name": "Commented-code block (7 lines) in src/lib/actions/helpers.ts:20", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/actions/helpers.ts: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-9e29d13838d28972", "name": "Commented-code block (5 lines) in src/lib/actions/checkout.ts:470", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/actions/checkout.ts:470"}, "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-c843991f0888ae25", "name": "Commented-code block (5 lines) in src/lib/executor/index.ts:178", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/executor/index.ts:178"}, "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-8d8db16e8accb16f", "name": "Commented-code block (8 lines) in src/lib/executor/handlers/variants.ts:697", "shortDescription": {"text": "Commented-code block (8 lines) in src/lib/executor/handlers/variants.ts:697"}, "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-d812808be7ec3cdf", "name": "Commented-code block (6 lines) in src/lib/executor/handlers/ai-features.ts:324", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/executor/handlers/ai-features.ts:324"}, "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-4ab877ddcb314d72", "name": "Commented-code block (5 lines) in src/lib/executor/handlers/products.ts:866", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/executor/handlers/products.ts:866"}, "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-b8b2d93e3d2f7b55", "name": "Commented-code block (5 lines) in src/lib/executor/handlers/orders.ts:201", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/executor/handlers/orders.ts:201"}, "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-5f4d54ad8962b47c", "name": "Commented-code block (6 lines) in src/lib/executor/handlers/price-tiers.ts:148", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/executor/handlers/price-tiers.ts:148"}, "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-52b4022c2a46eaae", "name": "Commented-code block (5 lines) in src/lib/executor/handlers/metrics.ts:175", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/executor/handlers/metrics.ts:175"}, "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-362c7daa265d614b", "name": "Commented-code block (6 lines) in src/lib/executor/handlers/pos-sale.ts:65", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/executor/handlers/pos-sale.ts:65"}, "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-b699f9760ea0c3d4", "name": "Commented-code block (5 lines) in src/lib/checkout/record-order-income.ts:53", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/checkout/record-order-income.ts:53"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-030da566069872e9", "name": "15 env vars used in code but missing from .env.example", "shortDescription": {"text": "15 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `AI_AGENT_API_KEY`, `AI_AGENT_REASONING`, `AI_IMAGE_API_KEY`, `AI_IMAGE_BASE_URL`, `ANALYZE`, `EVAL_LIMIT`, `EVAL_ONLY`, `METRICS_USE_SQL` + 7 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/21232"}, "properties": {"repository": "thomdegorgue/kd", "repoUrl": "https://github.com/thomdegorgue/kd", "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-664e500b03030fc3", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 .claude/workflows/audit-prod.workflow.js:199"}, "properties": {"repobilityId": "53ef738ba69e4888", "scanner": "scanner-primary", "fingerprint": "664e500b03030fc3", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-27a75cb8f3d0e726", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/shared/breakdown-bar.tsx:18"}, "properties": {"repobilityId": "822a3930e687c57a", "scanner": "scanner-primary", "fingerprint": "27a75cb8f3d0e726", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-afa4366690395157", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/shared/page-header.tsx:39"}, "properties": {"repobilityId": "5ac7581be98673d7", "scanner": "scanner-primary", "fingerprint": "afa4366690395157", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-377ebd4ea869aed1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/command-palette.tsx:177"}, "properties": {"repobilityId": "f3c19d194a34ee28", "scanner": "scanner-primary", "fingerprint": "377ebd4ea869aed1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6d53b6283ebb211b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/mayorista-tab.tsx:540"}, "properties": {"repobilityId": "e2ea0b4cb46f2a62", "scanner": "scanner-primary", "fingerprint": "6d53b6283ebb211b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c9ae1c14281babc9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/admin-shell.tsx:309"}, "properties": {"repobilityId": "00c24acca8728ab0", "scanner": "scanner-primary", "fingerprint": "c9ae1c14281babc9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e7a5614119b3d2c1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/order-sheet.tsx:165"}, "properties": {"repobilityId": "7fb00dc32be688fa", "scanner": "scanner-primary", "fingerprint": "e7a5614119b3d2c1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b847d0a47ecdb886", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing/theater-action-done.tsx:20"}, "properties": {"repobilityId": "bdf99f3065f23877", "scanner": "scanner-primary", "fingerprint": "b847d0a47ecdb886", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cb2a6305db397cf8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing/kit-chat-preview.tsx:126"}, "properties": {"repobilityId": "24ecd71ee38c2cf3", "scanner": "scanner-primary", "fingerprint": "cb2a6305db397cf8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b429d6f70a187d6d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing/kit-showcase.tsx:139"}, "properties": {"repobilityId": "6d74ef86583a2087", "scanner": "scanner-primary", "fingerprint": "b429d6f70a187d6d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-635e68eb529c2715", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing/escape-tutorial/escape-tutorial-phone.tsx:270"}, "properties": {"repobilityId": "9efb660f6bcacd07", "scanner": "scanner-primary", "fingerprint": "635e68eb529c2715", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-89befb31fb657084", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/public/catalog-header.tsx:92"}, "properties": {"repobilityId": "33d933bf960f197b", "scanner": "scanner-primary", "fingerprint": "89befb31fb657084", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3cc67ebd27c7f444", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/public/shipping-selector.tsx:77"}, "properties": {"repobilityId": "144a82bc1f3500c6", "scanner": "scanner-primary", "fingerprint": "3cc67ebd27c7f444", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a134545cddba2f5b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/public/product-detail-drawer.tsx:80"}, "properties": {"repobilityId": "fcc521318d80695b", "scanner": "scanner-primary", "fingerprint": "a134545cddba2f5b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-49a930947861498c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/public/order-confirmation.tsx:173"}, "properties": {"repobilityId": "b574caa06d7fc6a1", "scanner": "scanner-primary", "fingerprint": "49a930947861498c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-41492aa0547397f0", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/public/json-ld.tsx:14"}, "properties": {"repobilityId": "3598166e7ce8eb9d", "scanner": "scanner-primary", "fingerprint": "41492aa0547397f0", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-551af02bd8848d89", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/superadmin/stores-table.tsx:123"}, "properties": {"repobilityId": "307d3df0b8eb251d", "scanner": "scanner-primary", "fingerprint": "551af02bd8848d89", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-90f7af13a9234d54", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/superadmin/coupons-panel.tsx:301"}, "properties": {"repobilityId": "1cc43a2e7561ddc7", "scanner": "scanner-primary", "fingerprint": "90f7af13a9234d54", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4e53265c28cf072f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/superadmin/superadmin-shell.tsx:105"}, "properties": {"repobilityId": "bf6b41aca30cf485", "scanner": "scanner-primary", "fingerprint": "4e53265c28cf072f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3bee4e7d6f6d8849", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/superadmin/webhooks-table.tsx:142"}, "properties": {"repobilityId": "6e720de22eabf95e", "scanner": "scanner-primary", "fingerprint": "3bee4e7d6f6d8849", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6c7e568badaae6bb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/superadmin/store-detail-panel.tsx:413"}, "properties": {"repobilityId": "fc5c631db662a203", "scanner": "scanner-primary", "fingerprint": "6c7e568badaae6bb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ec352de347f52a6b", "level": "note", "message": {"text": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 src/app/(admin)/admin/chat-view.tsx:268"}, "properties": {"repobilityId": "0f2dbbeb0ae11251", "scanner": "scanner-primary", "fingerprint": "ec352de347f52a6b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.edge-label.no-bg"]}}, {"ruleId": "scanner-d5e2d72387a137e5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/settings/team/page.tsx:236"}, "properties": {"repobilityId": "5fc2832f9bdbd978", "scanner": "scanner-primary", "fingerprint": "d5e2d72387a137e5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b677311c5efa9791", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/orders/_components/orders-client.tsx:317"}, "properties": {"repobilityId": "11bc35ed94c76ac2", "scanner": "scanner-primary", "fingerprint": "b677311c5efa9791", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cb7bc444f3052556", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/ventas/page.tsx:245"}, "properties": {"repobilityId": "177e0a6f4c689d6d", "scanner": "scanner-primary", "fingerprint": "cb7bc444f3052556", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bb3137a6f9e4f1c5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/components/session-history-sheet.tsx:285"}, "properties": {"repobilityId": "3da349d8dc248374", "scanner": "scanner-primary", "fingerprint": "bb3137a6f9e4f1c5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8f7d033ae1b36b71", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/components/chat-message.tsx:370"}, "properties": {"repobilityId": "674e895c707a212b", "scanner": "scanner-primary", "fingerprint": "8f7d033ae1b36b71", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bc69dcb8dbb1b099", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/customers/_components/customers-client.tsx:187"}, "properties": {"repobilityId": "eaf8584902753af0", "scanner": "scanner-primary", "fingerprint": "bc69dcb8dbb1b099", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ad01b71f7c2d25d3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/stock/stock-view.tsx:363"}, "properties": {"repobilityId": "9d27e729f47008ee", "scanner": "scanner-primary", "fingerprint": "ad01b71f7c2d25d3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8523469c9d88c2c1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/finance/metrics-view.tsx:473"}, "properties": {"repobilityId": "2e262fe8e27f2d2d", "scanner": "scanner-primary", "fingerprint": "8523469c9d88c2c1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a39760d551534e50", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/savings/savings-view.tsx:414"}, "properties": {"repobilityId": "4b605843786b8fd4", "scanner": "scanner-primary", "fingerprint": "a39760d551534e50", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0818abe90052bf66", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/banners/page.tsx:118"}, "properties": {"repobilityId": "2b3d143c6722d22c", "scanner": "scanner-primary", "fingerprint": "0818abe90052bf66", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-25f9b3db91f56027", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/categories/page.tsx:113"}, "properties": {"repobilityId": "100311cb3049a972", "scanner": "scanner-primary", "fingerprint": "25f9b3db91f56027", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bbefca0f4a1cfefa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/sections/page.tsx:88"}, "properties": {"repobilityId": "c6de6559d48949d9", "scanner": "scanner-primary", "fingerprint": "bbefca0f4a1cfefa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-72f55c59bad91fbf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/kit-settings/kit-automations.tsx:125"}, "properties": {"repobilityId": "8cf61441274cc484", "scanner": "scanner-primary", "fingerprint": "72f55c59bad91fbf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8e02f7f321ee2d58", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/expenses/expenses-view.tsx:488"}, "properties": {"repobilityId": "d313dfa19b30340a", "scanner": "scanner-primary", "fingerprint": "8e02f7f321ee2d58", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0b19c6995a117a15", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/shipping/page.tsx:499"}, "properties": {"repobilityId": "5c9f238650d94cd7", "scanner": "scanner-primary", "fingerprint": "0b19c6995a117a15", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1ba523c48a78b68e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/products/[id]/variants/page.tsx:68"}, "properties": {"repobilityId": "14f769e3da482d78", "scanner": "scanner-primary", "fingerprint": "1ba523c48a78b68e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-148c45c8902699d2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/products/_components/products-client.tsx:312"}, "properties": {"repobilityId": "6afd800bce30041f", "scanner": "scanner-primary", "fingerprint": "148c45c8902699d2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0a2fe8b2892e003e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(centrodedatos)/centrodedatos/page.tsx:335"}, "properties": {"repobilityId": "516f9106f5ddc169", "scanner": "scanner-primary", "fingerprint": "0a2fe8b2892e003e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fda7125626ec2706", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(centrodedatos)/centrodedatos/ia/page.tsx:228"}, "properties": {"repobilityId": "f508cca4804b14f0", "scanner": "scanner-primary", "fingerprint": "fda7125626ec2706", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d8d972521c79f602", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(centrodedatos)/centrodedatos/revenue/page.tsx:57"}, "properties": {"repobilityId": "b54dec83cadf0557", "scanner": "scanner-primary", "fingerprint": "d8d972521c79f602", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e316fd766ee14bd8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/onboarding/building/building-client.tsx:139"}, "properties": {"repobilityId": "c3ab56ca8612d339", "scanner": "scanner-primary", "fingerprint": "e316fd766ee14bd8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e17acf45fdab0c19", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/onboarding/done/done-client.tsx:62"}, "properties": {"repobilityId": "eabeeab5b09d34ba", "scanner": "scanner-primary", "fingerprint": "e17acf45fdab0c19", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-88a384ca6816a1ba", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/onboarding/setup/page.tsx:173"}, "properties": {"repobilityId": "7ec05dd09e8d952d", "scanner": "scanner-primary", "fingerprint": "88a384ca6816a1ba", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-88b3ec568280c9c4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(public)/[slug]/tracking/[orderId]/page.tsx:240"}, "properties": {"repobilityId": "54425944b973be75", "scanner": "scanner-primary", "fingerprint": "88b3ec568280c9c4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-64c3a9a098c0cbae", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(public)/[slug]/_components/created-panel.tsx:133"}, "properties": {"repobilityId": "434e793c21f4bb5d", "scanner": "scanner-primary", "fingerprint": "64c3a9a098c0cbae", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3fa7329bea5dcc32", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(superadmin)/superadmin/page.tsx:257"}, "properties": {"repobilityId": "7e8c5297de405ed2", "scanner": "scanner-primary", "fingerprint": "3fa7329bea5dcc32", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-898166310484e6a7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/ai/evals/report.ts:133"}, "properties": {"repobilityId": "ef7b13adf3e8198d", "scanner": "scanner-primary", "fingerprint": "898166310484e6a7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5ec65239e8ee3496", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/ai/evals/benchmark.eval.ts:87"}, "properties": {"repobilityId": "ccbb41ed0553f16a", "scanner": "scanner-primary", "fingerprint": "5ec65239e8ee3496", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b2e61643729c1bbe", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/gen-supabase-types.mjs:1"}, "properties": {"repobilityId": "e18928f500fe7246", "scanner": "scanner-primary", "fingerprint": "b2e61643729c1bbe", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/gen-supabase-types.mjs"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c345c30c265ea6b2", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in .claude/workflows/audit-prod.workflow.js:199"}, "properties": {"repobilityId": "acfed6d8daad3179", "scanner": "scanner-primary", "fingerprint": "c345c30c265ea6b2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/workflows/audit-prod.workflow.js"}, "region": {"startLine": 199}}}]}, {"ruleId": "scanner-a8434a1cd8e2bae1", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/public/json-ld.tsx:14"}, "properties": {"repobilityId": "14612355fbc987aa", "scanner": "scanner-primary", "fingerprint": "a8434a1cd8e2bae1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/public/json-ld.tsx"}, "region": {"startLine": 14}}}]}, {"ruleId": "scanner-f6218ce724215988", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in src/app/(admin)/admin/chat-view.tsx:387"}, "properties": {"repobilityId": "1c34f86722619ec3", "scanner": "scanner-primary", "fingerprint": "f6218ce724215988", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/(admin)/admin/chat-view.tsx"}, "region": {"startLine": 387}}}]}, {"ruleId": "scanner-0e1884302edadd34", "level": "note", "message": {"text": "Very large file: src/components/admin/product-sheet.tsx (1821 lines)"}, "properties": {"repobilityId": "01eb901445e9c6d0", "scanner": "scanner-primary", "fingerprint": "0e1884302edadd34", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b365dc7d761fd2b5", "level": "note", "message": {"text": "Very large file: src/app/api/ai/chat/route.ts (2021 lines)"}, "properties": {"repobilityId": "359df8b1b583b176", "scanner": "scanner-primary", "fingerprint": "b365dc7d761fd2b5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f8c2c13b5881cd43", "level": "note", "message": {"text": "Very large file: src/app/(admin)/admin/chat-view.tsx (1248 lines)"}, "properties": {"repobilityId": "b0631ddee9308a3a", "scanner": "scanner-primary", "fingerprint": "f8c2c13b5881cd43", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-de55fca0d51e9bd6", "level": "note", "message": {"text": "Very large file: src/app/(admin)/admin/ventas/page.tsx (1413 lines)"}, "properties": {"repobilityId": "6d1bcc48b41536af", "scanner": "scanner-primary", "fingerprint": "de55fca0d51e9bd6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ea8846343df33ba0", "level": "note", "message": {"text": "Very large file: src/lib/types/database.ts (1788 lines)"}, "properties": {"repobilityId": "d4ac08126c92fa82", "scanner": "scanner-primary", "fingerprint": "ea8846343df33ba0", "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-9e154caabf0aa34c", "level": "note", "message": {"text": "56 TODO/FIXME markers"}, "properties": {"repobilityId": "4b38c118003e07d2", "scanner": "scanner-primary", "fingerprint": "9e154caabf0aa34c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["maintenance"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "36b70594774eabef", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "a6f811e6ccbf77f3", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-9d79c4077342a7d0", "level": "warning", "message": {"text": "Runtime service client appears to use placeholder configuration"}, "properties": {"repobilityId": "60d39bb15f708583", "scanner": "scanner-primary", "fingerprint": "9d79c4077342a7d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "runtime-config", "service-client", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "79723a279721d7ae", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "6b67a4a8a799433d", "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": "516589c458599b2f", "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": "77311e98579d286a", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-17d866d91a7c451e", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: CLAUDE.md"}, "properties": {"repobilityId": "ccce5984e58a48f0", "scanner": "scanner-primary", "fingerprint": "17d866d91a7c451e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "CLAUDE.md"}, "region": {"startLine": 275}}}]}, {"ruleId": "scanner-cb04d3636215126e", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/loadtest/chat-smoke.js:12"}, "properties": {"repobilityId": "095550af4890b00b", "scanner": "scanner-primary", "fingerprint": "cb04d3636215126e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f1138532e9d9d17f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/middleware.ts:304"}, "properties": {"repobilityId": "9f3c4de69b8c999b", "scanner": "scanner-primary", "fingerprint": "f1138532e9d9d17f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-186fa5f9fbd78408", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/providers.tsx:71"}, "properties": {"repobilityId": "e73d3814911a6532", "scanner": "scanner-primary", "fingerprint": "186fa5f9fbd78408", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4899b515769e8f18", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/ai/chat/route.ts:128"}, "properties": {"repobilityId": "d32fe7b9a91b3f3a", "scanner": "scanner-primary", "fingerprint": "4899b515769e8f18", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-82ff79cb27dfb13a", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/webhooks/mercadopago/route.ts:215"}, "properties": {"repobilityId": "5a6bfdea52edd610", "scanner": "scanner-primary", "fingerprint": "82ff79cb27dfb13a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e54db6d99c246b4f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/(admin)/admin/chat-view.tsx:358"}, "properties": {"repobilityId": "231203f470071685", "scanner": "scanner-primary", "fingerprint": "e54db6d99c246b4f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-05b610c2f4816758", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/admin/chat-view.tsx:395"}, "properties": {"repobilityId": "0a3b279af5bd02c1", "scanner": "scanner-primary", "fingerprint": "05b610c2f4816758", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6e7167686839c84c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/onboarding/setup/page.tsx:285"}, "properties": {"repobilityId": "82b84f60b8158cf2", "scanner": "scanner-primary", "fingerprint": "6e7167686839c84c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4d1daf1bf13a429f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/cache.ts:31"}, "properties": {"repobilityId": "9de60daec6fbdbef", "scanner": "scanner-primary", "fingerprint": "4d1daf1bf13a429f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-affe13c87f8da911", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/ratelimit.ts:57"}, "properties": {"repobilityId": "627e769481926fc0", "scanner": "scanner-primary", "fingerprint": "affe13c87f8da911", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f67412fd6947253a", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/ai/tool-catalog.ts:153"}, "properties": {"repobilityId": "6b62f23bed56f65f", "scanner": "scanner-primary", "fingerprint": "f67412fd6947253a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ddd2653120c549b2", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/ai/undo.ts:3"}, "properties": {"repobilityId": "0e04d6a7484b0a34", "scanner": "scanner-primary", "fingerprint": "ddd2653120c549b2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4045a3fc908a9d07", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/ai/tool-schema-drift.test.ts:3"}, "properties": {"repobilityId": "cc49f86dcba93ee4", "scanner": "scanner-primary", "fingerprint": "4045a3fc908a9d07", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-71097e1a7e73c31e", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/ai/llm.ts:147"}, "properties": {"repobilityId": "fe7a64c21a4dcbb4", "scanner": "scanner-primary", "fingerprint": "71097e1a7e73c31e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dfc0b32b4ff44faf", "level": "note", "message": {"text": "Legacy-named symbol `hoursOld` in src/lib/ai/context-loader.ts:169"}, "properties": {"repobilityId": "f2322cd260ac8610", "scanner": "scanner-primary", "fingerprint": "dfc0b32b4ff44faf", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-14f897f2b78052b0", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/ai/tools/kit.ts:113"}, "properties": {"repobilityId": "eeb401a0a4bf05c6", "scanner": "scanner-primary", "fingerprint": "14f897f2b78052b0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-52e13e4e6d5299f8", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/ai/evals/run.eval.ts:11"}, "properties": {"repobilityId": "a1f8271846341906", "scanner": "scanner-primary", "fingerprint": "52e13e4e6d5299f8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7f8d1e1d3bcf6155", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/ai/evals/judge.ts:4"}, "properties": {"repobilityId": "de0750c4f00fa83d", "scanner": "scanner-primary", "fingerprint": "7f8d1e1d3bcf6155", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c5c65c959ae7f667", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/ai/evals/mock-executor.ts:1"}, "properties": {"repobilityId": "f2afda5957278d2e", "scanner": "scanner-primary", "fingerprint": "c5c65c959ae7f667", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8468e71a13044db4", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/ai/evals/benchmark.eval.ts:10"}, "properties": {"repobilityId": "1478a9d894dcba6c", "scanner": "scanner-primary", "fingerprint": "8468e71a13044db4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-de32e6e989ada8ad", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/ai/evals/load-env.ts:4"}, "properties": {"repobilityId": "2bbfbe7c50b6672f", "scanner": "scanner-primary", "fingerprint": "de32e6e989ada8ad", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bc98d0dd662af29c", "level": "note", "message": {"text": "Legacy-named symbol `cat_old` in src/lib/ai/evals/golden-set.ts:302"}, "properties": {"repobilityId": "fafe225e6b45fd48", "scanner": "scanner-primary", "fingerprint": "bc98d0dd662af29c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-397a2075baec2dc7", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/ai/evals/golden-set.ts:3"}, "properties": {"repobilityId": "2d4ec3c6c1a5175f", "scanner": "scanner-primary", "fingerprint": "397a2075baec2dc7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-884d5dd7007ff214", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/ai/evals/types.ts:4"}, "properties": {"repobilityId": "79104be0888d65a6", "scanner": "scanner-primary", "fingerprint": "884d5dd7007ff214", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1c01bc5900acbd23", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/crypto/payment-tokens.ts:7"}, "properties": {"repobilityId": "b7adf5685ac16c5f", "scanner": "scanner-primary", "fingerprint": "1c01bc5900acbd23", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-285333be2241e438", "level": "note", "message": {"text": "Legacy-named symbol `hoursOld` in src/lib/tasks/order-status-map.ts:44"}, "properties": {"repobilityId": "aa125e63f878ed14", "scanner": "scanner-primary", "fingerprint": "285333be2241e438", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-fb7b831d9935f0da", "level": "note", "message": {"text": "Legacy-named symbol `hoursOld` in src/lib/tasks/evaluators/payments.ts:44"}, "properties": {"repobilityId": "c65c8a270509775b", "scanner": "scanner-primary", "fingerprint": "fb7b831d9935f0da", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-47b7ea71166e3e56", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/billing/calculator.ts:3"}, "properties": {"repobilityId": "aa430f039034bb84", "scanner": "scanner-primary", "fingerprint": "47b7ea71166e3e56", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ed50e31285edc7cd", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/payments/mercadopago-oauth.ts:1"}, "properties": {"repobilityId": "b6e17d94f2504b5b", "scanner": "scanner-primary", "fingerprint": "ed50e31285edc7cd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-db850864479877b5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/payments/mercadopago-oauth.ts:53"}, "properties": {"repobilityId": "2531002b1094f785", "scanner": "scanner-primary", "fingerprint": "db850864479877b5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-19a3a4d1e98d4932", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/actions/billing.ts:560"}, "properties": {"repobilityId": "4c690c90b07a196b", "scanner": "scanner-primary", "fingerprint": "19a3a4d1e98d4932", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e5110465b9b78605", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/actions/helpers.ts:20"}, "properties": {"repobilityId": "d04f6e13aab3e93e", "scanner": "scanner-primary", "fingerprint": "e5110465b9b78605", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9e29d13838d28972", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/actions/checkout.ts:470"}, "properties": {"repobilityId": "069e12ba656712dd", "scanner": "scanner-primary", "fingerprint": "9e29d13838d28972", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c843991f0888ae25", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/executor/index.ts:178"}, "properties": {"repobilityId": "31a6018a01bbb32d", "scanner": "scanner-primary", "fingerprint": "c843991f0888ae25", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8d8db16e8accb16f", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/lib/executor/handlers/variants.ts:697"}, "properties": {"repobilityId": "925726a267c6fd99", "scanner": "scanner-primary", "fingerprint": "8d8db16e8accb16f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d812808be7ec3cdf", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/executor/handlers/ai-features.ts:324"}, "properties": {"repobilityId": "a32dea545ac50132", "scanner": "scanner-primary", "fingerprint": "d812808be7ec3cdf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4ab877ddcb314d72", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/executor/handlers/products.ts:866"}, "properties": {"repobilityId": "5cc54e5eb7ff4d4d", "scanner": "scanner-primary", "fingerprint": "4ab877ddcb314d72", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b8b2d93e3d2f7b55", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/executor/handlers/orders.ts:201"}, "properties": {"repobilityId": "735ca43438ee18c9", "scanner": "scanner-primary", "fingerprint": "b8b2d93e3d2f7b55", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5f4d54ad8962b47c", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/executor/handlers/price-tiers.ts:148"}, "properties": {"repobilityId": "1dd82c113576a2ab", "scanner": "scanner-primary", "fingerprint": "5f4d54ad8962b47c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-52b4022c2a46eaae", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/executor/handlers/metrics.ts:175"}, "properties": {"repobilityId": "14076ade1ae7effe", "scanner": "scanner-primary", "fingerprint": "52b4022c2a46eaae", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-362c7daa265d614b", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/executor/handlers/pos-sale.ts:65"}, "properties": {"repobilityId": "194357834649a820", "scanner": "scanner-primary", "fingerprint": "362c7daa265d614b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b699f9760ea0c3d4", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/checkout/record-order-income.ts:53"}, "properties": {"repobilityId": "639e02f87855e7e0", "scanner": "scanner-primary", "fingerprint": "b699f9760ea0c3d4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-030da566069872e9", "level": "note", "message": {"text": "15 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "0519c1c0e8c1f8e4", "scanner": "scanner-primary", "fingerprint": "030da566069872e9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}]}]}