{"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-49ab6e866a5dedbc", "name": "Stray `console.log` in TS/JS \u2014 supabase/export-localStorage.js:212", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/export-localStorage.js:212"}, "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-1735a59afbe84fa8", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/meta-leads-webhook/index.ts:84", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/meta-leads-webhook/index.ts:84"}, "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-95d65d4ebb9ac640", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-push/index.ts:107", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-push/index.ts:107"}, "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-477436d9019bf56f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/BottomNav.tsx:143", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/BottomNav.tsx:143"}, "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-653ee86cb5e871ff", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/PageLayout.tsx:24", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/PageLayout.tsx:24"}, "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-df354edf85f23a35", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/NotificationsPopover.tsx:165", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/NotificationsPopover.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-f3ee12b03124ace0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/Sidebar.tsx:199", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/Sidebar.tsx:199"}, "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-517da7b1a8366c74", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/shared/PeriodSelector.tsx:69", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/shared/PeriodSelector.tsx:69"}, "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-cd5b80160e86bc23", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/shared/GlobalSearch.tsx:283", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/shared/GlobalSearch.tsx:283"}, "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-c2ff5848d31a7aa6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/shared/TasksLinkedModal.tsx:47", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/shared/TasksLinkedModal.tsx:47"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a24dee9b74ca62d9", "name": "Stray `console.log` in TS/JS \u2014 src/lib/supabase.ts:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/supabase.ts:18"}, "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-14f26ba51b0db7c2", "name": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 src/lib/db.ts:975", "shortDescription": {"text": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 src/lib/db.ts:975"}, "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-59990d3a9e29392f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/permuta/PermutaPage.tsx:152", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/permuta/PermutaPage.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-cbc6cf1e211e7692", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/goals/GoalsPage.tsx:115", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/goals/GoalsPage.tsx:115"}, "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-aaf8b5f4f80701e6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/goals/WeekHistoryPage.tsx:81", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/goals/WeekHistoryPage.tsx:81"}, "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-76f028ee63ed2c29", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/leads/LeadSettings.tsx:225", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/leads/LeadSettings.tsx:225"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5ed69cf2e2a9837b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/leads/CampaignRoutingSettings.tsx:84", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/leads/CampaignRoutingSettings.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-a11b41293acebc3d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/leads/LeadsDashboard.tsx:237", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/leads/LeadsDashboard.tsx:237"}, "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-b3ac105d4b5e55b3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/leads/LeadPermutaTab.tsx:230", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/leads/LeadPermutaTab.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-de3209a8b679dd3e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/leads/LeadConversionTab.tsx:113", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/leads/LeadConversionTab.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-5c4e08679e86461a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/leads/LeadsPage.tsx:92", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/leads/LeadsPage.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-70bcbdbcb65cbdaf", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/leads/NextStepSuggestion.tsx:98", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/leads/NextStepSuggestion.tsx:98"}, "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-2c2dae0217a87930", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/leads/LeadVisitaTaskModal.tsx:79", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/leads/LeadVisitaTaskModal.tsx:79"}, "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-7d19564eceb7812a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/leads/LeadKanban.tsx:218", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/leads/LeadKanban.tsx:218"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-804e25c1e9dddcf9", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/leads/LeadForm.tsx:355", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/leads/LeadForm.tsx:355"}, "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-95947b3154480fc6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/leads/LeadModal.tsx:387", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/leads/LeadModal.tsx:387"}, "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-05c1420cfd617787", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/leads/LeadRadarTab.tsx:274", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/leads/LeadRadarTab.tsx:274"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bd91adef7ce17e6f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/dashboard/DashboardPage.tsx:108", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/dashboard/DashboardPage.tsx:108"}, "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-64143f6b875072cc", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/dashboard/PerformanceGoalsWidget.tsx:196", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/dashboard/PerformanceGoalsWidget.tsx:196"}, "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-f2a6e3d21e4e208f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/performance/CampaignsBaseTab.tsx:156", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/performance/CampaignsBaseTab.tsx:156"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8cbbe3bd06f7ebde", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/performance/SalesTab.tsx:204", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/performance/SalesTab.tsx:204"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-25dc4ed69516229c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/performance/DailyProductivityTab.tsx:425", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/performance/DailyProductivityTab.tsx:425"}, "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-110b0a6deb6334c1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/tasks/TasksPage.tsx:215", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/tasks/TasksPage.tsx:215"}, "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-2238d74680b00ca1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/tasks/TaskHistoryView.tsx:92", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/tasks/TaskHistoryView.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-93d73860c3221343", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/lead-lists/LeadListsPage.tsx:227", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/lead-lists/LeadListsPage.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-78556e4771583f2f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/lead-lists/ContactCampaignHistory.tsx:258", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/lead-lists/ContactCampaignHistory.tsx:258"}, "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-4be39f2a17f457d1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/lead-lists/DeleteLeadFromListModal.tsx:193", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/lead-lists/DeleteLeadFromListModal.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-78f0ab4e99be8952", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/lead-lists/LeadListDetail.tsx:250", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/lead-lists/LeadListDetail.tsx:250"}, "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-7cf5d317a6128b17", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/sales/SalesPage.tsx:271", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/sales/SalesPage.tsx:271"}, "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-6716797ec01b74c5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/campaigns/ParticipantsManager.tsx:73", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/campaigns/ParticipantsManager.tsx:73"}, "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-218842e1c6854f22", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/campaigns/KanbanTab.tsx:330", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/campaigns/KanbanTab.tsx:330"}, "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-f5a1972b1ef9759a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/campaigns/LeadsTab.tsx:881", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/campaigns/LeadsTab.tsx:881"}, "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-bd675050902d0668", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/campaigns/TransferToFunnelModal.tsx:102", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/campaigns/TransferToFunnelModal.tsx:102"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1aa7824caec9c2da", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/campaigns/CampaignDetail.tsx:189", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/campaigns/CampaignDetail.tsx:189"}, "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-464d065714b1f200", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/campaigns/CampaignsPage.tsx:184", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/campaigns/CampaignsPage.tsx:184"}, "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-93f41a761b02fe58", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/campaigns/ActivityTab.tsx:348", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/campaigns/ActivityTab.tsx:348"}, "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-a36d9fe8f4aa91c6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/campaigns/CampaignForm.tsx:412", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/campaigns/CampaignForm.tsx:412"}, "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-e8cffb81153feea3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/campaigns/XlsxImport.tsx:145", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/campaigns/XlsxImport.tsx:145"}, "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-4f0b43d6552fb82b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/contacts/ContactModal.tsx:229", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/contacts/ContactModal.tsx:229"}, "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-c9c8a0e6e15b276f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/modules/properties/PropertiesPage.tsx:131", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/properties/PropertiesPage.tsx:131"}, "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-f3a9a80316f88c61", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/AdminPage.tsx:364", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/AdminPage.tsx:364"}, "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-46a6df90707a6017", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/NotificationsPage.tsx:97", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/NotificationsPage.tsx:97"}, "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-ee81bf49a92fef41", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ActivityLogsPage.tsx:188", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ActivityLogsPage.tsx:188"}, "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-791989db448c3ccd", "name": "Stray `console.log` in TS/JS \u2014 e2e/dionata-diagnostic.e2e.ts:165", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/dionata-diagnostic.e2e.ts:165"}, "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-166dff3c3df6a10e", "name": "ORM models found but no DB engine detected", "shortDescription": {"text": "ORM models found but no DB engine detected"}, "fullDescription": {"text": "The repo defines tables/models but no DB connection string was found. Likely lives in env vars or a config file the scanner didn't read."}, "properties": {"scanner": "scanner-primary", "layer": "data", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7176e5d95d18d844", "name": "Runtime dotenv file present in repo: .env", "shortDescription": {"text": "Runtime dotenv file present in repo: .env"}, "fullDescription": {"text": "`.env` looks like a runtime dotenv file. It contains secret-looking assignments for VITE_SUPABASE_ANON_KEY. Move real values to a secret manager and keep only `.env.example` style templates in source control."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-fa722f1a90e94098", "name": "Possible secret in e2e/helpers/auth.ts", "shortDescription": {"text": "Possible secret in e2e/helpers/auth.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-34ecf2c6bb38e998", "name": "Possible secret in e2e/helpers/auth-dionata.ts", "shortDescription": {"text": "Possible secret in e2e/helpers/auth-dionata.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-80b8f6f5751ef02b", "name": "Very large file: src/lib/db.ts (1301 lines)", "shortDescription": {"text": "Very large file: src/lib/db.ts (1301 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-261cd6995fc10881", "name": "Very large file: src/modules/leads/LeadModal.tsx (1053 lines)", "shortDescription": {"text": "Very large file: src/modules/leads/LeadModal.tsx (1053 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-57dfedd5411d48fd", "name": "Very large file: src/modules/dashboard/DashboardPage.tsx (1589 lines)", "shortDescription": {"text": "Very large file: src/modules/dashboard/DashboardPage.tsx (1589 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-c0a9bf8a6a2022c0", "name": "Very large file: src/modules/campaigns/LeadsTab.tsx (1200 lines)", "shortDescription": {"text": "Very large file: src/modules/campaigns/LeadsTab.tsx (1200 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": "5 test file(s) for 162 source file(s) (ratio 0.03). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-faccb9061e9b52a0", "name": "No README detected", "shortDescription": {"text": "No README detected"}, "fullDescription": {"text": "No README file was found. Generated repos without README context are hard to operate, validate, or safely hand off."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 73 console/debugger/print-style debug statements in non-test source. This is a common fast-generation residue before production cleanup."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 167 placeholder/mock markers across 41 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, operator-readme. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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, operator-readme. 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-122f91b7f2906dc4", "name": "Agent authority lacks a verifier contract: .claude/settings.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/settings.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-505bc666a82f9849", "name": "Agent instruction/config may expose a secret: .claude/settings.local.json", "shortDescription": {"text": "Agent instruction/config may expose a secret: .claude/settings.local.json"}, "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-2c5f98b152cddb6d", "name": "Agent authority lacks a verifier contract: .claude/launch.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/launch.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-6f874f34bbb4f4eb", "name": "Commented-code block (7 lines) in src/modules/simulador/associativo/calc.ts:1", "shortDescription": {"text": "Commented-code block (7 lines) in src/modules/simulador/associativo/calc.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-3bdb124fd5af7e7e", "name": "Commented-code block (5 lines) in src/modules/campaigns/LeadsTab.tsx:368", "shortDescription": {"text": "Commented-code block (5 lines) in src/modules/campaigns/LeadsTab.tsx:368"}, "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-69a604a6c8057490", "name": "Commented-code block (5 lines) in src/modules/office/VirtualOfficePage.tsx:14", "shortDescription": {"text": "Commented-code block (5 lines) in src/modules/office/VirtualOfficePage.tsx:14"}, "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-f1b9cdee3f78ab8d", "name": "Commented-code block (5 lines) in src/store/useCampaignLeadsStore.ts:53", "shortDescription": {"text": "Commented-code block (5 lines) in src/store/useCampaignLeadsStore.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-d6b2e4535f4728a6", "name": "Commented-code block (6 lines) in e2e/dispatch-flow.e2e.ts:267", "shortDescription": {"text": "Commented-code block (6 lines) in e2e/dispatch-flow.e2e.ts:267"}, "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-eed9a9cf5fe58442", "name": "Commented-code block (5 lines) in e2e/dionata-diagnostic.e2e.ts:37", "shortDescription": {"text": "Commented-code block (5 lines) in e2e/dionata-diagnostic.e2e.ts:37"}, "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-1b5a76780c3df9aa", "name": "1 env vars used in code but missing from .env.example", "shortDescription": {"text": "1 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `PORT`. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7064cd9925eeb9c6", "name": "Frontend route `/*` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/*` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/17719"}, "properties": {"repository": "rafaelscbr/icrm", "repoUrl": "https://github.com/rafaelscbr/icrm", "branch": "main"}, "results": [{"ruleId": "scanner-49ab6e866a5dedbc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/export-localStorage.js:212"}, "properties": {"repobilityId": "c7a29add6213846a", "scanner": "scanner-primary", "fingerprint": "49ab6e866a5dedbc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1735a59afbe84fa8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/meta-leads-webhook/index.ts:84"}, "properties": {"repobilityId": "400bce8919e47c40", "scanner": "scanner-primary", "fingerprint": "1735a59afbe84fa8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-95d65d4ebb9ac640", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-push/index.ts:107"}, "properties": {"repobilityId": "deff015bd94f7b00", "scanner": "scanner-primary", "fingerprint": "95d65d4ebb9ac640", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-477436d9019bf56f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/BottomNav.tsx:143"}, "properties": {"repobilityId": "8419b2e690608ff4", "scanner": "scanner-primary", "fingerprint": "477436d9019bf56f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-653ee86cb5e871ff", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/PageLayout.tsx:24"}, "properties": {"repobilityId": "437e936fef0888c5", "scanner": "scanner-primary", "fingerprint": "653ee86cb5e871ff", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-df354edf85f23a35", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/NotificationsPopover.tsx:165"}, "properties": {"repobilityId": "57c091d125ed97c4", "scanner": "scanner-primary", "fingerprint": "df354edf85f23a35", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f3ee12b03124ace0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/Sidebar.tsx:199"}, "properties": {"repobilityId": "be1152cdf47927a8", "scanner": "scanner-primary", "fingerprint": "f3ee12b03124ace0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-517da7b1a8366c74", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/shared/PeriodSelector.tsx:69"}, "properties": {"repobilityId": "0e5e5f10bd88f664", "scanner": "scanner-primary", "fingerprint": "517da7b1a8366c74", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cd5b80160e86bc23", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/shared/GlobalSearch.tsx:283"}, "properties": {"repobilityId": "421617352b71fd3f", "scanner": "scanner-primary", "fingerprint": "cd5b80160e86bc23", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c2ff5848d31a7aa6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/shared/TasksLinkedModal.tsx:47"}, "properties": {"repobilityId": "27566a09c0078a36", "scanner": "scanner-primary", "fingerprint": "c2ff5848d31a7aa6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a24dee9b74ca62d9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/supabase.ts:18"}, "properties": {"repobilityId": "404935f6c09f8289", "scanner": "scanner-primary", "fingerprint": "a24dee9b74ca62d9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-14f26ba51b0db7c2", "level": "note", "message": {"text": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 src/lib/db.ts:975"}, "properties": {"repobilityId": "a36d53da9e6211f6", "scanner": "scanner-primary", "fingerprint": "14f26ba51b0db7c2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.edge-label.no-bg"]}}, {"ruleId": "scanner-59990d3a9e29392f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/permuta/PermutaPage.tsx:152"}, "properties": {"repobilityId": "2587887a2a3358cd", "scanner": "scanner-primary", "fingerprint": "59990d3a9e29392f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cbc6cf1e211e7692", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/goals/GoalsPage.tsx:115"}, "properties": {"repobilityId": "16165bc2bc10850a", "scanner": "scanner-primary", "fingerprint": "cbc6cf1e211e7692", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-aaf8b5f4f80701e6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/goals/WeekHistoryPage.tsx:81"}, "properties": {"repobilityId": "8c7b0f7c90db04a3", "scanner": "scanner-primary", "fingerprint": "aaf8b5f4f80701e6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-76f028ee63ed2c29", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/leads/LeadSettings.tsx:225"}, "properties": {"repobilityId": "797e046c3f7940cb", "scanner": "scanner-primary", "fingerprint": "76f028ee63ed2c29", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5ed69cf2e2a9837b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/leads/CampaignRoutingSettings.tsx:84"}, "properties": {"repobilityId": "7174688b2c68880b", "scanner": "scanner-primary", "fingerprint": "5ed69cf2e2a9837b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a11b41293acebc3d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/leads/LeadsDashboard.tsx:237"}, "properties": {"repobilityId": "2b8f7b9a0f09ea13", "scanner": "scanner-primary", "fingerprint": "a11b41293acebc3d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b3ac105d4b5e55b3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/leads/LeadPermutaTab.tsx:230"}, "properties": {"repobilityId": "62edff504a533d1c", "scanner": "scanner-primary", "fingerprint": "b3ac105d4b5e55b3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-de3209a8b679dd3e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/leads/LeadConversionTab.tsx:113"}, "properties": {"repobilityId": "5444fb63d4feb7df", "scanner": "scanner-primary", "fingerprint": "de3209a8b679dd3e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5c4e08679e86461a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/leads/LeadsPage.tsx:92"}, "properties": {"repobilityId": "5396988d3537e030", "scanner": "scanner-primary", "fingerprint": "5c4e08679e86461a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-70bcbdbcb65cbdaf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/leads/NextStepSuggestion.tsx:98"}, "properties": {"repobilityId": "e0899c2b1d660eb0", "scanner": "scanner-primary", "fingerprint": "70bcbdbcb65cbdaf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2c2dae0217a87930", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/leads/LeadVisitaTaskModal.tsx:79"}, "properties": {"repobilityId": "6c3cd875602e2a4c", "scanner": "scanner-primary", "fingerprint": "2c2dae0217a87930", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7d19564eceb7812a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/leads/LeadKanban.tsx:218"}, "properties": {"repobilityId": "262606bf0ae0ab15", "scanner": "scanner-primary", "fingerprint": "7d19564eceb7812a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-804e25c1e9dddcf9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/leads/LeadForm.tsx:355"}, "properties": {"repobilityId": "1b76f6fe8ae9e8c5", "scanner": "scanner-primary", "fingerprint": "804e25c1e9dddcf9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-95947b3154480fc6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/leads/LeadModal.tsx:387"}, "properties": {"repobilityId": "64c414a5bb5eb4b0", "scanner": "scanner-primary", "fingerprint": "95947b3154480fc6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-05c1420cfd617787", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/leads/LeadRadarTab.tsx:274"}, "properties": {"repobilityId": "b3a2c9cf7865acc0", "scanner": "scanner-primary", "fingerprint": "05c1420cfd617787", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bd91adef7ce17e6f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/dashboard/DashboardPage.tsx:108"}, "properties": {"repobilityId": "ff62cf14ae4e159e", "scanner": "scanner-primary", "fingerprint": "bd91adef7ce17e6f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-64143f6b875072cc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/dashboard/PerformanceGoalsWidget.tsx:196"}, "properties": {"repobilityId": "a0cbd489c20d80b4", "scanner": "scanner-primary", "fingerprint": "64143f6b875072cc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f2a6e3d21e4e208f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/performance/CampaignsBaseTab.tsx:156"}, "properties": {"repobilityId": "251a307712fb05c0", "scanner": "scanner-primary", "fingerprint": "f2a6e3d21e4e208f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8cbbe3bd06f7ebde", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/performance/SalesTab.tsx:204"}, "properties": {"repobilityId": "480b79bba4058965", "scanner": "scanner-primary", "fingerprint": "8cbbe3bd06f7ebde", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-25dc4ed69516229c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/performance/DailyProductivityTab.tsx:425"}, "properties": {"repobilityId": "ac4840a48b97a184", "scanner": "scanner-primary", "fingerprint": "25dc4ed69516229c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-110b0a6deb6334c1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/tasks/TasksPage.tsx:215"}, "properties": {"repobilityId": "5d2acf22d34cd1a7", "scanner": "scanner-primary", "fingerprint": "110b0a6deb6334c1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2238d74680b00ca1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/tasks/TaskHistoryView.tsx:92"}, "properties": {"repobilityId": "48c66758fc25d9fb", "scanner": "scanner-primary", "fingerprint": "2238d74680b00ca1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-93d73860c3221343", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/lead-lists/LeadListsPage.tsx:227"}, "properties": {"repobilityId": "8a7ccc30beb1cb55", "scanner": "scanner-primary", "fingerprint": "93d73860c3221343", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-78556e4771583f2f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/lead-lists/ContactCampaignHistory.tsx:258"}, "properties": {"repobilityId": "e245e75f7f3ed36c", "scanner": "scanner-primary", "fingerprint": "78556e4771583f2f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4be39f2a17f457d1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/lead-lists/DeleteLeadFromListModal.tsx:193"}, "properties": {"repobilityId": "6d83bba99a2fa342", "scanner": "scanner-primary", "fingerprint": "4be39f2a17f457d1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-78f0ab4e99be8952", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/lead-lists/LeadListDetail.tsx:250"}, "properties": {"repobilityId": "22bc040f8fe7fa20", "scanner": "scanner-primary", "fingerprint": "78f0ab4e99be8952", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7cf5d317a6128b17", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/sales/SalesPage.tsx:271"}, "properties": {"repobilityId": "3a2790ed823bbcbb", "scanner": "scanner-primary", "fingerprint": "7cf5d317a6128b17", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6716797ec01b74c5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/campaigns/ParticipantsManager.tsx:73"}, "properties": {"repobilityId": "7f848e690a5b1214", "scanner": "scanner-primary", "fingerprint": "6716797ec01b74c5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-218842e1c6854f22", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/campaigns/KanbanTab.tsx:330"}, "properties": {"repobilityId": "01c17deb0a5ab127", "scanner": "scanner-primary", "fingerprint": "218842e1c6854f22", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f5a1972b1ef9759a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/campaigns/LeadsTab.tsx:881"}, "properties": {"repobilityId": "c6bb9c018cbbe30d", "scanner": "scanner-primary", "fingerprint": "f5a1972b1ef9759a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bd675050902d0668", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/campaigns/TransferToFunnelModal.tsx:102"}, "properties": {"repobilityId": "234d427cd7816780", "scanner": "scanner-primary", "fingerprint": "bd675050902d0668", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1aa7824caec9c2da", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/campaigns/CampaignDetail.tsx:189"}, "properties": {"repobilityId": "c24ed7cfdfd1486a", "scanner": "scanner-primary", "fingerprint": "1aa7824caec9c2da", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-464d065714b1f200", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/campaigns/CampaignsPage.tsx:184"}, "properties": {"repobilityId": "78e6b0fb6e61609c", "scanner": "scanner-primary", "fingerprint": "464d065714b1f200", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-93f41a761b02fe58", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/campaigns/ActivityTab.tsx:348"}, "properties": {"repobilityId": "30f5ceeb6871327a", "scanner": "scanner-primary", "fingerprint": "93f41a761b02fe58", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a36d9fe8f4aa91c6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/campaigns/CampaignForm.tsx:412"}, "properties": {"repobilityId": "3187e06b10c7b206", "scanner": "scanner-primary", "fingerprint": "a36d9fe8f4aa91c6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e8cffb81153feea3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/campaigns/XlsxImport.tsx:145"}, "properties": {"repobilityId": "c312b211185285eb", "scanner": "scanner-primary", "fingerprint": "e8cffb81153feea3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4f0b43d6552fb82b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/contacts/ContactModal.tsx:229"}, "properties": {"repobilityId": "ca9134fe962a3117", "scanner": "scanner-primary", "fingerprint": "4f0b43d6552fb82b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c9c8a0e6e15b276f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/modules/properties/PropertiesPage.tsx:131"}, "properties": {"repobilityId": "a906de7655ef02c8", "scanner": "scanner-primary", "fingerprint": "c9c8a0e6e15b276f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f3a9a80316f88c61", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/AdminPage.tsx:364"}, "properties": {"repobilityId": "2293ca93e9a95090", "scanner": "scanner-primary", "fingerprint": "f3a9a80316f88c61", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-46a6df90707a6017", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/NotificationsPage.tsx:97"}, "properties": {"repobilityId": "58cc1eafaa0db937", "scanner": "scanner-primary", "fingerprint": "46a6df90707a6017", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ee81bf49a92fef41", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ActivityLogsPage.tsx:188"}, "properties": {"repobilityId": "822feeca6585f310", "scanner": "scanner-primary", "fingerprint": "ee81bf49a92fef41", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-791989db448c3ccd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/dionata-diagnostic.e2e.ts:165"}, "properties": {"repobilityId": "59496367de5dbf10", "scanner": "scanner-primary", "fingerprint": "791989db448c3ccd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-166dff3c3df6a10e", "level": "warning", "message": {"text": "ORM models found but no DB engine detected"}, "properties": {"repobilityId": "cda36de65e114635", "scanner": "scanner-primary", "fingerprint": "166dff3c3df6a10e", "layer": "data", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-7176e5d95d18d844", "level": "error", "message": {"text": "Runtime dotenv file present in repo: .env"}, "properties": {"repobilityId": "4b9c737a445874ba", "scanner": "scanner-primary", "fingerprint": "7176e5d95d18d844", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets", "config", "env-file", "runtime-env", "env_file_with_secret"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".env"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-fa722f1a90e94098", "level": "error", "message": {"text": "Possible secret in e2e/helpers/auth.ts"}, "properties": {"repobilityId": "10353351341b1da7", "scanner": "scanner-primary", "fingerprint": "fa722f1a90e94098", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "e2e/helpers/auth.ts"}, "region": {"startLine": 16}}}]}, {"ruleId": "scanner-34ecf2c6bb38e998", "level": "error", "message": {"text": "Possible secret in e2e/helpers/auth-dionata.ts"}, "properties": {"repobilityId": "1044742d6310dbbe", "scanner": "scanner-primary", "fingerprint": "34ecf2c6bb38e998", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "e2e/helpers/auth-dionata.ts"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-80b8f6f5751ef02b", "level": "note", "message": {"text": "Very large file: src/lib/db.ts (1301 lines)"}, "properties": {"repobilityId": "b6da9df073336f64", "scanner": "scanner-primary", "fingerprint": "80b8f6f5751ef02b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-261cd6995fc10881", "level": "note", "message": {"text": "Very large file: src/modules/leads/LeadModal.tsx (1053 lines)"}, "properties": {"repobilityId": "ba89e553b410e68e", "scanner": "scanner-primary", "fingerprint": "261cd6995fc10881", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-57dfedd5411d48fd", "level": "note", "message": {"text": "Very large file: src/modules/dashboard/DashboardPage.tsx (1589 lines)"}, "properties": {"repobilityId": "19547f4c29f109e6", "scanner": "scanner-primary", "fingerprint": "57dfedd5411d48fd", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c0a9bf8a6a2022c0", "level": "note", "message": {"text": "Very large file: src/modules/campaigns/LeadsTab.tsx (1200 lines)"}, "properties": {"repobilityId": "aee119d783550df9", "scanner": "scanner-primary", "fingerprint": "c0a9bf8a6a2022c0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "dcd4c176a3f473f5", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-faccb9061e9b52a0", "level": "note", "message": {"text": "No README detected"}, "properties": {"repobilityId": "24eb820740a86bf0", "scanner": "scanner-primary", "fingerprint": "faccb9061e9b52a0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["docs", "readme", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "9b25136534b5d5f4", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "bad0ac4dcacf242d", "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": "6ec78ca9984bf126", "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": "cef44d73dcd9a020", "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": "e2de86f93ddce7a5", "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": "42864aa30abbc998", "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": "65bbec94005f7ad7", "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": "2b1371334a831b65", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-122f91b7f2906dc4", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/settings.json"}, "properties": {"repobilityId": "a2967269048b6a9d", "scanner": "scanner-primary", "fingerprint": "122f91b7f2906dc4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/settings.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-505bc666a82f9849", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: .claude/settings.local.json"}, "properties": {"repobilityId": "777970b0fce0a93b", "scanner": "scanner-primary", "fingerprint": "505bc666a82f9849", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/settings.local.json"}, "region": {"startLine": 84}}}]}, {"ruleId": "scanner-2c5f98b152cddb6d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/launch.json"}, "properties": {"repobilityId": "0de48c0f4ab303d8", "scanner": "scanner-primary", "fingerprint": "2c5f98b152cddb6d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/launch.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6f874f34bbb4f4eb", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/modules/simulador/associativo/calc.ts:1"}, "properties": {"repobilityId": "485c8ea74e2b4b94", "scanner": "scanner-primary", "fingerprint": "6f874f34bbb4f4eb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3bdb124fd5af7e7e", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/modules/campaigns/LeadsTab.tsx:368"}, "properties": {"repobilityId": "1dec8af9c0226dc9", "scanner": "scanner-primary", "fingerprint": "3bdb124fd5af7e7e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-69a604a6c8057490", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/modules/office/VirtualOfficePage.tsx:14"}, "properties": {"repobilityId": "65fcae86e1548f30", "scanner": "scanner-primary", "fingerprint": "69a604a6c8057490", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f1b9cdee3f78ab8d", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/store/useCampaignLeadsStore.ts:53"}, "properties": {"repobilityId": "f9d14ac2446c6610", "scanner": "scanner-primary", "fingerprint": "f1b9cdee3f78ab8d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d6b2e4535f4728a6", "level": "none", "message": {"text": "Commented-code block (6 lines) in e2e/dispatch-flow.e2e.ts:267"}, "properties": {"repobilityId": "9291a94eccb25dd4", "scanner": "scanner-primary", "fingerprint": "d6b2e4535f4728a6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-eed9a9cf5fe58442", "level": "none", "message": {"text": "Commented-code block (5 lines) in e2e/dionata-diagnostic.e2e.ts:37"}, "properties": {"repobilityId": "aeb21f210bd76027", "scanner": "scanner-primary", "fingerprint": "eed9a9cf5fe58442", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1b5a76780c3df9aa", "level": "none", "message": {"text": "1 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "d04379b337b44a15", "scanner": "scanner-primary", "fingerprint": "1b5a76780c3df9aa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-7064cd9925eeb9c6", "level": "warning", "message": {"text": "Frontend route `/*` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "eb928b698e0c5cc3", "scanner": "scanner-primary", "fingerprint": "7064cd9925eeb9c6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}]}]}