{"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-06a3d9f0b4dba61e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/partner/page.tsx:152", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/partner/page.tsx:152"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d9f01a9389b46849", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/partner/referrals/page.tsx:121", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/partner/referrals/page.tsx:121"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b00343f335aa1d6d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/partner/link/page.tsx:62", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/partner/link/page.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-c0340c77e351b30c", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/webhooks/fanbasis/route.ts:61", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/webhooks/fanbasis/route.ts:61"}, "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-d9d12e09beda6186", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/page.tsx:176", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/page.tsx:176"}, "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-8314b4e9ae294a4c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/users/page.tsx:224", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/users/page.tsx:224"}, "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-49351488d7d7deb6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/activity/page.tsx:293", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/activity/page.tsx:293"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0e8cbbe07b7dd197", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/tiktok-open/page.tsx:86", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/tiktok-open/page.tsx:86"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a1a6589cee30d8ab", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/dashboard/developer/page.tsx:545", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/dashboard/developer/page.tsx:545"}, "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-049baea67ae7628a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/dashboard/ab-testing/page.tsx:522", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/dashboard/ab-testing/page.tsx:522"}, "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-bf7483df3cfe051e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/dashboard/teams/page.tsx:227", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/dashboard/teams/page.tsx:227"}, "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-e3a2a79e488083e8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/dashboard/collections/page.tsx:434", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/dashboard/collections/page.tsx:434"}, "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-57e5b9412ee81af7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/dashboard/analytics/page.tsx:248", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/dashboard/analytics/page.tsx:248"}, "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-7d6e6735e97cd291", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/dashboard/brain/page.tsx:531", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/dashboard/brain/page.tsx:531"}, "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-5e1d83e77cbcc1a6", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(dashboard)/dashboard/brain/page.tsx:699", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(dashboard)/dashboard/brain/page.tsx:699"}, "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-0a2d83caafa0b4e8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sidebar.tsx:265", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sidebar.tsx:265"}, "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-4fb1334962f4dfce", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/dashboard-links.tsx:99", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/dashboard-links.tsx:99"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b06801db81d5cd4a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/recent-activity.tsx:193", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/recent-activity.tsx:193"}, "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-03a71b4fb5a733fb", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/dashboard/floating-chat.tsx:318", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/dashboard/floating-chat.tsx:318"}, "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-a150c50f4acca040", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/quick-create.tsx:148", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/quick-create.tsx:148"}, "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-9bbcd73d1b0ec70c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/click-chart.tsx:109", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/click-chart.tsx:109"}, "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-c49613d6a146a85a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing/LiveRouter.tsx:122", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing/LiveRouter.tsx:122"}, "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-72ba2cf93c525ea1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing/ProductBento.tsx:76", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing/ProductBento.tsx:76"}, "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-9128a91f1209252b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/partner/partner-sidebar.tsx:112", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/partner/partner-sidebar.tsx:112"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8db6a045fb6e43cf", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/links/link-card.tsx:150", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/links/link-card.tsx:150"}, "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-d7f74f76ec486c18", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/links/rules-dialog.tsx:198", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/links/rules-dialog.tsx:198"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-31eae29dc70a77ea", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/links/bulk-import-dialog.tsx:230", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/links/bulk-import-dialog.tsx:230"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-170c19c358689058", "name": "React Flow <MiniMap> without dark background \u2014 src/components/collections/collections-canvas.tsx:578", "shortDescription": {"text": "React Flow <MiniMap> without dark background \u2014 src/components/collections/collections-canvas.tsx:578"}, "fullDescription": {"text": "A bare <MiniMap> renders with the vendor's white default in dark themes. Wrap the canvas in a class that overrides `.react-flow__minimap` background, or pass an explicit `style`/`maskColor`/`bgColor`.\n\nWhy: P1 in CHECKLIST.md \u2014 vendor defaults bleed light through.\nRule id: fq.minimap.no-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fd07fff220f4a9b8", "name": "React Flow <Controls> without dark theming \u2014 src/components/collections/collections-canvas.tsx:577", "shortDescription": {"text": "React Flow <Controls> without dark theming \u2014 src/components/collections/collections-canvas.tsx:577"}, "fullDescription": {"text": "`<Controls>` ships with white buttons. Override `.react-flow__controls` and `.react-flow__controls-button` in your stylesheet or pass a styled wrapper.\n\nWhy: P1 in CHECKLIST.md \u2014 vendor defaults bleed light through.\nRule id: fq.controls.no-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-56f57a4489f5c6a4", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/collections/collections-canvas.tsx:84", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/collections/collections-canvas.tsx:84"}, "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-42076d08be86e87a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/collections/collections-tree.tsx:290", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/collections/collections-tree.tsx:290"}, "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-1ac96dd6ed2ad5dc", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/collections/add-link-to-collection-dialog.tsx:264", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/collections/add-link-to-collection-dialog.tsx:264"}, "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-7134d19a0167a5c9", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/analytics/clicks-chart.tsx:92", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/analytics/clicks-chart.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-acb53ca93a31c82d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/analytics/top-links.tsx:41", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/analytics/top-links.tsx:41"}, "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-c2243489e0f62c71", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/analytics/referrer-sources.tsx:32", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/analytics/referrer-sources.tsx:32"}, "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-c0741e384d28c003", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/analytics/weekly-report.tsx:99", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/analytics/weekly-report.tsx:99"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e3b1f05afca30b4b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/qr/qr-dialog.tsx:59", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/qr/qr-dialog.tsx:59"}, "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-ee2dec68193fb8c6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/qr/qr-code-card.tsx:71", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/qr/qr-code-card.tsx:71"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e0749a43b41a6396", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/date-picker.tsx:52", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/date-picker.tsx:52"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bffb17e08b36f987", "name": "Insecure pattern 'direct_innerhtml_assignment' in Tappr Landing.html:1205", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in Tappr Landing.html:1205"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fdc72ac1ec6c3b6c", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/(dashboard)/dashboard/brain/page.tsx:699", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/(dashboard)/dashboard/brain/page.tsx:699"}, "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-38098c67a6e29734", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/dashboard/floating-chat.tsx:318", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/dashboard/floating-chat.tsx:318"}, "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-aba77d8448f6621f", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/analytics/weekly-report.tsx:99", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/analytics/weekly-report.tsx:99"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-226ba28f72e80476", "name": "Insecure pattern 'dangerous_innerhtml' in .claude/settings.json:12", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in .claude/settings.json:12"}, "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-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "4 test file(s) for 192 source file(s) (ratio 0.02). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 114 placeholder/mock markers across 38 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-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci, tests. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci, tests. 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-ecb0d2c55ed6875d", "name": "Agent authority lacks a verifier contract: .claude/settings.local.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/settings.local.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-72b693a9aeb4b9f3", "name": "Commented-code block (6 lines) in next.config.ts:4", "shortDescription": {"text": "Commented-code block (6 lines) in next.config.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-468bf235f3e4e2cb", "name": "Commented-code block (5 lines) in src/middleware.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in src/middleware.ts:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f66fc1ef4d618b86", "name": "Commented-code block (5 lines) in src/app/api/billing/checkout/route.ts:42", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/billing/checkout/route.ts:42"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5ae4713850d6cd02", "name": "Commented-code block (6 lines) in src/app/api/billing/activate/route.ts:9", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/billing/activate/route.ts:9"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-551e0ec34b38f158", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/ig/insights/route.ts:74", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/ig/insights/route.ts:74"}, "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-dccd6a5714eb3d4f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/ig/callback/route.ts:70", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/ig/callback/route.ts:70"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2193022c978da9a6", "name": "Commented-code block (10 lines) in src/app/api/admin/grant-plan/route.ts:11", "shortDescription": {"text": "Commented-code block (10 lines) in src/app/api/admin/grant-plan/route.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-b214a923eb41872f", "name": "Commented-code block (7 lines) in src/app/api/admin/partner/activate/route.ts:48", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/api/admin/partner/activate/route.ts:48"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-94c885306b492efc", "name": "Commented-code block (5 lines) in src/app/api/admin/users/route.ts:7", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/admin/users/route.ts:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-74911fa0efdb0702", "name": "Commented-code block (7 lines) in src/app/api/admin/activity/route.ts:10", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/api/admin/activity/route.ts:10"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-47deca6a0f13200c", "name": "Commented-code block (7 lines) in src/app/api/webhooks/fanbasis/route.ts:7", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/api/webhooks/fanbasis/route.ts:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a6f3708e1d1d48f7", "name": "Commented-code block (5 lines) in src/app/api/ai/chat/route.ts:7", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/ai/chat/route.ts:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-91880e9789fb4de6", "name": "Commented-code block (9 lines) in src/app/(dashboard)/dashboard/developer/page.tsx:334", "shortDescription": {"text": "Commented-code block (9 lines) in src/app/(dashboard)/dashboard/developer/page.tsx:334"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9599890f9a770bbd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/dashboard/developer/page.tsx:251", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/dashboard/developer/page.tsx:251"}, "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-ba7e7850f2ba900b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/dashboard/ab-testing/page.tsx:687", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/dashboard/ab-testing/page.tsx:687"}, "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-0f8597879d0d39f6", "name": "Commented-code block (5 lines) in src/app/(dashboard)/dashboard/brain/page.tsx:174", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/(dashboard)/dashboard/brain/page.tsx:174"}, "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-3d67e38c1822ee2c", "name": "Commented-code block (6 lines) in src/providers/links-provider.tsx:20", "shortDescription": {"text": "Commented-code block (6 lines) in src/providers/links-provider.tsx:20"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c1c9294499ddff1a", "name": "Commented-code block (5 lines) in src/providers/user-provider.tsx:27", "shortDescription": {"text": "Commented-code block (5 lines) in src/providers/user-provider.tsx:27"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7157963ef073a5c9", "name": "Commented-code block (6 lines) in src/hooks/use-collections.ts:78", "shortDescription": {"text": "Commented-code block (6 lines) in src/hooks/use-collections.ts:78"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-501e30a164e35fee", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/use-partner.ts:172", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/use-partner.ts:172"}, "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-e3d0ca2874688f22", "name": "Commented-code block (7 lines) in src/hooks/use-click-stats.ts:32", "shortDescription": {"text": "Commented-code block (7 lines) in src/hooks/use-click-stats.ts:32"}, "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-c0b76ca251a05bc8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/dashboard/anomaly-alert.tsx:82", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/dashboard/anomaly-alert.tsx:82"}, "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-03f492f732ba3769", "name": "Commented-code block (5 lines) in src/components/dashboard/floating-chat.tsx:119", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/dashboard/floating-chat.tsx:119"}, "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-fc05c25ce1e8991c", "name": "Commented-code block (6 lines) in src/components/billing/upgrade-button.tsx:27", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/billing/upgrade-button.tsx:27"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f099ca2c2e1fe9f2", "name": "Commented-code block (6 lines) in src/components/links/create-link-dialog.tsx:79", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/links/create-link-dialog.tsx:79"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4a77a27fd7e0a766", "name": "Commented-code block (5 lines) in src/components/links/link-pagination.tsx:19", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/links/link-pagination.tsx:19"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dfe82bbe026b021b", "name": "Commented-code block (5 lines) in src/components/collections/collections-canvas.tsx:51", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/collections/collections-canvas.tsx:51"}, "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-23cdf9cd7e7f728f", "name": "Commented-code block (5 lines) in src/components/ui/date-picker.tsx:270", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/ui/date-picker.tsx:270"}, "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-dd32deabd3ef1cf4", "name": "Commented-code block (5 lines) in src/lib/ai-action-bus.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/ai-action-bus.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-e983e47d79525991", "name": "Commented-code block (8 lines) in src/lib/url-normalize.ts:49", "shortDescription": {"text": "Commented-code block (8 lines) in src/lib/url-normalize.ts:49"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f83252f1876d21a1", "name": "Commented-code block (8 lines) in src/lib/fanbasis.ts:6", "shortDescription": {"text": "Commented-code block (8 lines) in src/lib/fanbasis.ts:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-001d91ce515b930b", "name": "Commented-code block (5 lines) in src/lib/refresh-bus.ts:7", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/refresh-bus.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-0f7f33b59e66519f", "name": "Commented-code block (6 lines) in src/lib/ai-tools.ts:5", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/ai-tools.ts:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/25245"}, "properties": {"repository": "Dariusan3/deeplink-platform", "repoUrl": "https://github.com/Dariusan3/deeplink-platform", "branch": "main"}, "results": [{"ruleId": "scanner-06a3d9f0b4dba61e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/partner/page.tsx:152"}, "properties": {"repobilityId": "493bcca9729c88a9", "scanner": "scanner-primary", "fingerprint": "06a3d9f0b4dba61e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d9f01a9389b46849", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/partner/referrals/page.tsx:121"}, "properties": {"repobilityId": "e4343aca2262ed5d", "scanner": "scanner-primary", "fingerprint": "d9f01a9389b46849", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b00343f335aa1d6d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/partner/link/page.tsx:62"}, "properties": {"repobilityId": "17ac20d57a70df08", "scanner": "scanner-primary", "fingerprint": "b00343f335aa1d6d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c0340c77e351b30c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/webhooks/fanbasis/route.ts:61"}, "properties": {"repobilityId": "02786a1cd7cdd001", "scanner": "scanner-primary", "fingerprint": "c0340c77e351b30c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d9d12e09beda6186", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/page.tsx:176"}, "properties": {"repobilityId": "8d313b2589100140", "scanner": "scanner-primary", "fingerprint": "d9d12e09beda6186", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8314b4e9ae294a4c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/users/page.tsx:224"}, "properties": {"repobilityId": "4bdb26632c42d210", "scanner": "scanner-primary", "fingerprint": "8314b4e9ae294a4c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-49351488d7d7deb6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/activity/page.tsx:293"}, "properties": {"repobilityId": "4c86794b0741a9b8", "scanner": "scanner-primary", "fingerprint": "49351488d7d7deb6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0e8cbbe07b7dd197", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/tiktok-open/page.tsx:86"}, "properties": {"repobilityId": "ab7ec173fc0c288b", "scanner": "scanner-primary", "fingerprint": "0e8cbbe07b7dd197", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a1a6589cee30d8ab", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/dashboard/developer/page.tsx:545"}, "properties": {"repobilityId": "bcccaf6d0869f1a4", "scanner": "scanner-primary", "fingerprint": "a1a6589cee30d8ab", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-049baea67ae7628a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/dashboard/ab-testing/page.tsx:522"}, "properties": {"repobilityId": "efe20eaccdf582de", "scanner": "scanner-primary", "fingerprint": "049baea67ae7628a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bf7483df3cfe051e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/dashboard/teams/page.tsx:227"}, "properties": {"repobilityId": "cfd7268f3fc09293", "scanner": "scanner-primary", "fingerprint": "bf7483df3cfe051e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e3a2a79e488083e8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/dashboard/collections/page.tsx:434"}, "properties": {"repobilityId": "520e54ce1fd39703", "scanner": "scanner-primary", "fingerprint": "e3a2a79e488083e8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-57e5b9412ee81af7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/dashboard/analytics/page.tsx:248"}, "properties": {"repobilityId": "3c9a405c47c3d923", "scanner": "scanner-primary", "fingerprint": "57e5b9412ee81af7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7d6e6735e97cd291", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/dashboard/brain/page.tsx:531"}, "properties": {"repobilityId": "8cb2180d2f2e5fb7", "scanner": "scanner-primary", "fingerprint": "7d6e6735e97cd291", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5e1d83e77cbcc1a6", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(dashboard)/dashboard/brain/page.tsx:699"}, "properties": {"repobilityId": "9ebb58bbf7fa2f61", "scanner": "scanner-primary", "fingerprint": "5e1d83e77cbcc1a6", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-0a2d83caafa0b4e8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sidebar.tsx:265"}, "properties": {"repobilityId": "b6d9ddc60e182673", "scanner": "scanner-primary", "fingerprint": "0a2d83caafa0b4e8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4fb1334962f4dfce", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/dashboard-links.tsx:99"}, "properties": {"repobilityId": "09d10ee12527bb0b", "scanner": "scanner-primary", "fingerprint": "4fb1334962f4dfce", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b06801db81d5cd4a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/recent-activity.tsx:193"}, "properties": {"repobilityId": "c62cf821d8aef5ef", "scanner": "scanner-primary", "fingerprint": "b06801db81d5cd4a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-03a71b4fb5a733fb", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/dashboard/floating-chat.tsx:318"}, "properties": {"repobilityId": "7b232b0577ac6c8d", "scanner": "scanner-primary", "fingerprint": "03a71b4fb5a733fb", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-a150c50f4acca040", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/quick-create.tsx:148"}, "properties": {"repobilityId": "7a7c9b5ce4a07a52", "scanner": "scanner-primary", "fingerprint": "a150c50f4acca040", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9bbcd73d1b0ec70c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/click-chart.tsx:109"}, "properties": {"repobilityId": "8072f069e82b746f", "scanner": "scanner-primary", "fingerprint": "9bbcd73d1b0ec70c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c49613d6a146a85a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing/LiveRouter.tsx:122"}, "properties": {"repobilityId": "87ed53df5682a70b", "scanner": "scanner-primary", "fingerprint": "c49613d6a146a85a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-72ba2cf93c525ea1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing/ProductBento.tsx:76"}, "properties": {"repobilityId": "b015a9eecb0f9f44", "scanner": "scanner-primary", "fingerprint": "72ba2cf93c525ea1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9128a91f1209252b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/partner/partner-sidebar.tsx:112"}, "properties": {"repobilityId": "073bb05a18c0cbc5", "scanner": "scanner-primary", "fingerprint": "9128a91f1209252b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8db6a045fb6e43cf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/links/link-card.tsx:150"}, "properties": {"repobilityId": "e4630460e54fbf02", "scanner": "scanner-primary", "fingerprint": "8db6a045fb6e43cf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d7f74f76ec486c18", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/links/rules-dialog.tsx:198"}, "properties": {"repobilityId": "e8fea32a69740cb8", "scanner": "scanner-primary", "fingerprint": "d7f74f76ec486c18", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-31eae29dc70a77ea", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/links/bulk-import-dialog.tsx:230"}, "properties": {"repobilityId": "3ee7fe02dde883ba", "scanner": "scanner-primary", "fingerprint": "31eae29dc70a77ea", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-170c19c358689058", "level": "note", "message": {"text": "React Flow <MiniMap> without dark background \u2014 src/components/collections/collections-canvas.tsx:578"}, "properties": {"repobilityId": "520721effbdd6b8f", "scanner": "scanner-primary", "fingerprint": "170c19c358689058", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.minimap.no-bg"]}}, {"ruleId": "scanner-fd07fff220f4a9b8", "level": "note", "message": {"text": "React Flow <Controls> without dark theming \u2014 src/components/collections/collections-canvas.tsx:577"}, "properties": {"repobilityId": "d1b929d3ee5b33f3", "scanner": "scanner-primary", "fingerprint": "fd07fff220f4a9b8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.controls.no-bg"]}}, {"ruleId": "scanner-56f57a4489f5c6a4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/collections/collections-canvas.tsx:84"}, "properties": {"repobilityId": "90091e6ea7ba635f", "scanner": "scanner-primary", "fingerprint": "56f57a4489f5c6a4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-42076d08be86e87a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/collections/collections-tree.tsx:290"}, "properties": {"repobilityId": "b9ca91705750b407", "scanner": "scanner-primary", "fingerprint": "42076d08be86e87a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1ac96dd6ed2ad5dc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/collections/add-link-to-collection-dialog.tsx:264"}, "properties": {"repobilityId": "0b7635585df16de9", "scanner": "scanner-primary", "fingerprint": "1ac96dd6ed2ad5dc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7134d19a0167a5c9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/analytics/clicks-chart.tsx:92"}, "properties": {"repobilityId": "f77764550aa795b3", "scanner": "scanner-primary", "fingerprint": "7134d19a0167a5c9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-acb53ca93a31c82d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/analytics/top-links.tsx:41"}, "properties": {"repobilityId": "738bddd6d1a983a7", "scanner": "scanner-primary", "fingerprint": "acb53ca93a31c82d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c2243489e0f62c71", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/analytics/referrer-sources.tsx:32"}, "properties": {"repobilityId": "deb482b267f0af5c", "scanner": "scanner-primary", "fingerprint": "c2243489e0f62c71", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c0741e384d28c003", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/analytics/weekly-report.tsx:99"}, "properties": {"repobilityId": "1e6c8c24b1800893", "scanner": "scanner-primary", "fingerprint": "c0741e384d28c003", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-e3b1f05afca30b4b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/qr/qr-dialog.tsx:59"}, "properties": {"repobilityId": "70dc3736d6d15a62", "scanner": "scanner-primary", "fingerprint": "e3b1f05afca30b4b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ee2dec68193fb8c6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/qr/qr-code-card.tsx:71"}, "properties": {"repobilityId": "887546dad7e50221", "scanner": "scanner-primary", "fingerprint": "ee2dec68193fb8c6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e0749a43b41a6396", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/date-picker.tsx:52"}, "properties": {"repobilityId": "fc5114161a6fcf7b", "scanner": "scanner-primary", "fingerprint": "e0749a43b41a6396", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bffb17e08b36f987", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in Tappr Landing.html:1205"}, "properties": {"repobilityId": "016818089ec8363c", "scanner": "scanner-primary", "fingerprint": "bffb17e08b36f987", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Tappr Landing.html"}, "region": {"startLine": 1205}}}]}, {"ruleId": "scanner-fdc72ac1ec6c3b6c", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/(dashboard)/dashboard/brain/page.tsx:699"}, "properties": {"repobilityId": "25a35248fb0af758", "scanner": "scanner-primary", "fingerprint": "fdc72ac1ec6c3b6c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/(dashboard)/dashboard/brain/page.tsx"}, "region": {"startLine": 699}}}]}, {"ruleId": "scanner-38098c67a6e29734", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/dashboard/floating-chat.tsx:318"}, "properties": {"repobilityId": "a6df362f37401863", "scanner": "scanner-primary", "fingerprint": "38098c67a6e29734", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/dashboard/floating-chat.tsx"}, "region": {"startLine": 318}}}]}, {"ruleId": "scanner-aba77d8448f6621f", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/analytics/weekly-report.tsx:99"}, "properties": {"repobilityId": "385b58cde423f028", "scanner": "scanner-primary", "fingerprint": "aba77d8448f6621f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/analytics/weekly-report.tsx"}, "region": {"startLine": 99}}}]}, {"ruleId": "scanner-226ba28f72e80476", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in .claude/settings.json:12"}, "properties": {"repobilityId": "7beb60abebf729a9", "scanner": "scanner-primary", "fingerprint": "226ba28f72e80476", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/settings.json"}, "region": {"startLine": 12}}}]}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "192186ca91e69bdb", "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": "dd69d68012124038", "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": "67731ba53293512e", "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": "46ec9be9e7ee49d1", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "f91ddc815c24da39", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "6b4e10ee01d23ae8", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ecb0d2c55ed6875d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/settings.local.json"}, "properties": {"repobilityId": "d8bae33a6d517bf0", "scanner": "scanner-primary", "fingerprint": "ecb0d2c55ed6875d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/settings.local.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-72b693a9aeb4b9f3", "level": "none", "message": {"text": "Commented-code block (6 lines) in next.config.ts:4"}, "properties": {"repobilityId": "f964601771274302", "scanner": "scanner-primary", "fingerprint": "72b693a9aeb4b9f3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-468bf235f3e4e2cb", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/middleware.ts:5"}, "properties": {"repobilityId": "851639b0ecc7e3f3", "scanner": "scanner-primary", "fingerprint": "468bf235f3e4e2cb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f66fc1ef4d618b86", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/billing/checkout/route.ts:42"}, "properties": {"repobilityId": "730db75b3dd63c43", "scanner": "scanner-primary", "fingerprint": "f66fc1ef4d618b86", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5ae4713850d6cd02", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/billing/activate/route.ts:9"}, "properties": {"repobilityId": "a67fe1cbd1a310d3", "scanner": "scanner-primary", "fingerprint": "5ae4713850d6cd02", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-551e0ec34b38f158", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/ig/insights/route.ts:74"}, "properties": {"repobilityId": "e3506691118c66d0", "scanner": "scanner-primary", "fingerprint": "551e0ec34b38f158", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-dccd6a5714eb3d4f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/ig/callback/route.ts:70"}, "properties": {"repobilityId": "9ff1e97576723868", "scanner": "scanner-primary", "fingerprint": "dccd6a5714eb3d4f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2193022c978da9a6", "level": "none", "message": {"text": "Commented-code block (10 lines) in src/app/api/admin/grant-plan/route.ts:11"}, "properties": {"repobilityId": "a05b7f271f9a7d6f", "scanner": "scanner-primary", "fingerprint": "2193022c978da9a6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b214a923eb41872f", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/api/admin/partner/activate/route.ts:48"}, "properties": {"repobilityId": "17647901ab6d74fb", "scanner": "scanner-primary", "fingerprint": "b214a923eb41872f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-94c885306b492efc", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/admin/users/route.ts:7"}, "properties": {"repobilityId": "f038c05e7c40cbfa", "scanner": "scanner-primary", "fingerprint": "94c885306b492efc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-74911fa0efdb0702", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/api/admin/activity/route.ts:10"}, "properties": {"repobilityId": "62d005f5b5aaaeea", "scanner": "scanner-primary", "fingerprint": "74911fa0efdb0702", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-47deca6a0f13200c", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/api/webhooks/fanbasis/route.ts:7"}, "properties": {"repobilityId": "7e945028daf658ca", "scanner": "scanner-primary", "fingerprint": "47deca6a0f13200c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a6f3708e1d1d48f7", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/ai/chat/route.ts:7"}, "properties": {"repobilityId": "49fff05a204124b5", "scanner": "scanner-primary", "fingerprint": "a6f3708e1d1d48f7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-91880e9789fb4de6", "level": "none", "message": {"text": "Commented-code block (9 lines) in src/app/(dashboard)/dashboard/developer/page.tsx:334"}, "properties": {"repobilityId": "4d7f8993069be71d", "scanner": "scanner-primary", "fingerprint": "91880e9789fb4de6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9599890f9a770bbd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/dashboard/developer/page.tsx:251"}, "properties": {"repobilityId": "6c03c5b3c1c7cf37", "scanner": "scanner-primary", "fingerprint": "9599890f9a770bbd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ba7e7850f2ba900b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(dashboard)/dashboard/ab-testing/page.tsx:687"}, "properties": {"repobilityId": "a8d5c592fe1d0ae8", "scanner": "scanner-primary", "fingerprint": "ba7e7850f2ba900b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0f8597879d0d39f6", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/(dashboard)/dashboard/brain/page.tsx:174"}, "properties": {"repobilityId": "5122bca9f2a0ef87", "scanner": "scanner-primary", "fingerprint": "0f8597879d0d39f6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3d67e38c1822ee2c", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/providers/links-provider.tsx:20"}, "properties": {"repobilityId": "5ef2342483f65a1b", "scanner": "scanner-primary", "fingerprint": "3d67e38c1822ee2c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c1c9294499ddff1a", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/providers/user-provider.tsx:27"}, "properties": {"repobilityId": "e02e8d55899053a1", "scanner": "scanner-primary", "fingerprint": "c1c9294499ddff1a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7157963ef073a5c9", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/hooks/use-collections.ts:78"}, "properties": {"repobilityId": "fd35334bd9e8c3c3", "scanner": "scanner-primary", "fingerprint": "7157963ef073a5c9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-501e30a164e35fee", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/use-partner.ts:172"}, "properties": {"repobilityId": "23020f9ed6304c08", "scanner": "scanner-primary", "fingerprint": "501e30a164e35fee", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e3d0ca2874688f22", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/hooks/use-click-stats.ts:32"}, "properties": {"repobilityId": "79bc41974efcc340", "scanner": "scanner-primary", "fingerprint": "e3d0ca2874688f22", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c0b76ca251a05bc8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/dashboard/anomaly-alert.tsx:82"}, "properties": {"repobilityId": "bce6500079fc9a27", "scanner": "scanner-primary", "fingerprint": "c0b76ca251a05bc8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-03f492f732ba3769", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/dashboard/floating-chat.tsx:119"}, "properties": {"repobilityId": "125af9e6314e329a", "scanner": "scanner-primary", "fingerprint": "03f492f732ba3769", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fc05c25ce1e8991c", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/billing/upgrade-button.tsx:27"}, "properties": {"repobilityId": "7c9eb926a9b9bcbe", "scanner": "scanner-primary", "fingerprint": "fc05c25ce1e8991c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f099ca2c2e1fe9f2", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/links/create-link-dialog.tsx:79"}, "properties": {"repobilityId": "55ae0c4b307f204a", "scanner": "scanner-primary", "fingerprint": "f099ca2c2e1fe9f2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4a77a27fd7e0a766", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/links/link-pagination.tsx:19"}, "properties": {"repobilityId": "e72a1be6c42a88cb", "scanner": "scanner-primary", "fingerprint": "4a77a27fd7e0a766", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dfe82bbe026b021b", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/collections/collections-canvas.tsx:51"}, "properties": {"repobilityId": "c0209dc8a88f490f", "scanner": "scanner-primary", "fingerprint": "dfe82bbe026b021b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-23cdf9cd7e7f728f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/ui/date-picker.tsx:270"}, "properties": {"repobilityId": "cf46429db9c9bdcd", "scanner": "scanner-primary", "fingerprint": "23cdf9cd7e7f728f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dd32deabd3ef1cf4", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/ai-action-bus.ts:1"}, "properties": {"repobilityId": "51b61529c61f0226", "scanner": "scanner-primary", "fingerprint": "dd32deabd3ef1cf4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e983e47d79525991", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/lib/url-normalize.ts:49"}, "properties": {"repobilityId": "c5f4b65f1deac2fe", "scanner": "scanner-primary", "fingerprint": "e983e47d79525991", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f83252f1876d21a1", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/lib/fanbasis.ts:6"}, "properties": {"repobilityId": "842a1ccdf0ba1394", "scanner": "scanner-primary", "fingerprint": "f83252f1876d21a1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-001d91ce515b930b", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/refresh-bus.ts:7"}, "properties": {"repobilityId": "513a2ff7e6633378", "scanner": "scanner-primary", "fingerprint": "001d91ce515b930b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0f7f33b59e66519f", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/ai-tools.ts:5"}, "properties": {"repobilityId": "3bc61d80c2977c32", "scanner": "scanner-primary", "fingerprint": "0f7f33b59e66519f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}]}]}