{"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-351b009dd5492555", "name": "Stray `console.log` in TS/JS \u2014 scripts/migrate-console-logs.ts:124", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate-console-logs.ts:124"}, "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-ad2d57fc1db3e9c8", "name": "Stray `console.log` in TS/JS \u2014 scripts/diagnose-db.ts:31", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diagnose-db.ts:31"}, "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-ab6d0ec9c4bc181a", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/parse-quote-pdf/index.ts:332", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/parse-quote-pdf/index.ts:332"}, "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-60fa1eb6ea66340a", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/whatsapp-daily-alerts/index.ts:107", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/whatsapp-daily-alerts/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-9b72021d2b1b41c2", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/remove-push-subscription/index.ts:41", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/remove-push-subscription/index.ts:41"}, "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-68095ea1dcf69c80", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/sre-lookup/index.ts:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/sre-lookup/index.ts:20"}, "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-b1fc2f336eeb6e9d", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-inspection-email/index.ts:66", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-inspection-email/index.ts:66"}, "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-f62ec9cef9e621d4", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-payment-reminder/index.ts:50", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-payment-reminder/index.ts:50"}, "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-92b88202aad3f076", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-document-alerts/index.ts:67", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-document-alerts/index.ts:67"}, "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-46537a8ba5338fd3", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-invoice-email/index.ts:57", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-invoice-email/index.ts:57"}, "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-fa0a7913217b3792", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-service-confirmation/index.ts:47", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-service-confirmation/index.ts:47"}, "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-056bba77f5c4a4ef", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/parse-purchase-order-pdf/index.ts:381", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/parse-purchase-order-pdf/index.ts:381"}, "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-10904dd1efec4262", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-operator-notification/index.ts:54", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-operator-notification/index.ts:54"}, "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-fb40e288c87477af", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-whatsapp-inspection/index.ts:39", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-whatsapp-inspection/index.ts:39"}, "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-b796d4030a528058", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-password-reset/index.ts:333", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-password-reset/index.ts:333"}, "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-80099db584bc75ad", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/scheduled-backup-email/index.ts:232", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/scheduled-backup-email/index.ts:232"}, "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-8ffe4511f0fd5e59", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-whatsapp-admin/index.ts:91", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-whatsapp-admin/index.ts:91"}, "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-03833c1feb7a4e9d", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-whatsapp-retiro/index.ts:33", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-whatsapp-retiro/index.ts:33"}, "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-0ec286b6cb5bdee8", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/vehicle-api/index.ts:64", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/vehicle-api/index.ts:64"}, "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-d678e84087b52589", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/save-push-subscription/index.ts:52", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/save-push-subscription/index.ts:52"}, "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-387d259b533fb7e1", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/generate-sql-dump/index.ts:51", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/generate-sql-dump/index.ts:51"}, "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-a5d3a4a73b928433", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-user-invitation/index.ts:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-user-invitation/index.ts:14"}, "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-a6236b0080393715", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/tollroutes-proxy/index.ts:85", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/tollroutes-proxy/index.ts:85"}, "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-7fea33b8a427c451", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-whatsapp-operator/index.ts:76", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-whatsapp-operator/index.ts:76"}, "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-7d7ddcf243fcf771", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/generate-backup/index.ts:201", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/generate-backup/index.ts:201"}, "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-72ccaab5e85a2f16", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-daily-pending-report/index.ts:136", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-daily-pending-report/index.ts:136"}, "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-09bdd2b00f127aa6", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-push-notification/index.ts:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-push-notification/index.ts:22"}, "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-42c507ac96397a56", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/check-vehicle-patent/index.ts:39", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/check-vehicle-patent/index.ts:39"}, "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-c93d09bd327ea140", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/_shared/whatsapp.ts:255", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/_shared/whatsapp.ts:255"}, "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-236947bf1e9e3022", "name": "Stray `console.log` in TS/JS \u2014 public/sw.js:6", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 public/sw.js:6"}, "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-22b0e35ec48bc211", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/settings/UserManagementTab.tsx:199", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/settings/UserManagementTab.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-0d0d32590e3c386c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/settings/audit/AuditTimeline.tsx:127", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/settings/audit/AuditTimeline.tsx:127"}, "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-438446e4dea1285f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/GlobalSearch.tsx:83", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/GlobalSearch.tsx:83"}, "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-8127dd80f248cfb5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/OperatorLayout.tsx:71", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/OperatorLayout.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-ebe612879ab8718e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/Sidebar.tsx:248", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/Sidebar.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-274294cb1e15be35", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/Header.tsx:94", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/Header.tsx:94"}, "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-1926a183a6b8da6d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/inventory/XMLInventoryUpload.tsx:1561", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/inventory/XMLInventoryUpload.tsx:1561"}, "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-03fde333b81261cd", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/inventory/ProductCatalogTable.tsx:196", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/inventory/ProductCatalogTable.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-4ef6591dd623a39c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/vip/BatchUpdateModal.tsx:386", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/vip/BatchUpdateModal.tsx:386"}, "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-06015423089db113", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/vip/KanbanBoard.tsx:130", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/vip/KanbanBoard.tsx:130"}, "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-46b8016850cc8fc5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/vip/PurchaseOrderManager.tsx:293", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/vip/PurchaseOrderManager.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-99d7d5bfc2a978fb", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/vip/ServiceCard.tsx:70", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/vip/ServiceCard.tsx:70"}, "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-4a8b8013aafc828c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/vip/PurchaseOrderDialog.tsx:139", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/vip/PurchaseOrderDialog.tsx:139"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-000295d735d4d281", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/projections/TopDebtorsCard.tsx:120", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projections/TopDebtorsCard.tsx:120"}, "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-5e230c240079cc16", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/closures/ClosureDetailsModal.tsx:372", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/closures/ClosureDetailsModal.tsx:372"}, "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-6705b7a1d5d61744", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/closures/ClosureSummaryPanel.tsx:77", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/closures/ClosureSummaryPanel.tsx:77"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3d18351c60d9e9ba", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/closures/ClosureFormStepNavigation.tsx:73", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/closures/ClosureFormStepNavigation.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-a46d7fe920eddb42", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/common/AutocompleteInput.tsx:107", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/common/AutocompleteInput.tsx:107"}, "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-e0395909813e37b1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/common/DatePickerInput.tsx:54", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/common/DatePickerInput.tsx:54"}, "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-d70bb20e6abe1e71", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/serviceRates/ServiceRatesTable.tsx:58", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/serviceRates/ServiceRatesTable.tsx:58"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-65c9e55c9f56222c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/service-types/ServiceTypesTable.tsx:67", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/service-types/ServiceTypesTable.tsx:67"}, "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-cd3ef6575394fd4d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/metric-card.tsx:75", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/metric-card.tsx:75"}, "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-070a2ccdcf7839d2", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ui/chart.tsx:79", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ui/chart.tsx:79"}, "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-7c6a85d973282317", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/batch-progress-modal.tsx:86", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/batch-progress-modal.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-49c8d2dbd38d111b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/PendingCategoryCard.tsx:78", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/PendingCategoryCard.tsx:78"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0f291b908d8a4186", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/RecentServicesTable.tsx:43", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/RecentServicesTable.tsx:43"}, "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-857f9ff471581111", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/finance/historical/HistoricalResults.tsx:492", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/finance/historical/HistoricalResults.tsx:492"}, "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-a32467678e761d9e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/finance/historical/HistoricalPurchasesTable.tsx:128", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/finance/historical/HistoricalPurchasesTable.tsx:128"}, "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-102fb499426661d9", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/finance/historical/RecentImportLogsCard.tsx:68", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/finance/historical/RecentImportLogsCard.tsx:68"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e09a7fa52493c0e7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/finance/historical/HistoricalPurchasesPipelineView.t", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/finance/historical/HistoricalPurchasesPipelineView.tsx:278"}, "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-7bf391a98401dbd2", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/finance/historical/HistoricalSalesGroupedList.tsx:12", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/finance/historical/HistoricalSalesGroupedList.tsx:129"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6687d3a427562c79", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/finance/historical/HistoricalPurchasesGroupedList.ts", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/finance/historical/HistoricalPurchasesGroupedList.tsx:133"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-25f253c161a86200", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/finance/historical/HistoricalSalesTable.tsx:139", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/finance/historical/HistoricalSalesTable.tsx:139"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c1a7dad40511983d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/cost-centers/CostCentersPage.tsx:106", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/cost-centers/CostCentersPage.tsx:106"}, "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-80791325e6027689", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/PurchaseVoidTool.tsx:140", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/PurchaseVoidTool.tsx:140"}, "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-c79b3ca1493e82cf", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/BulkStatusRepairTool.tsx:297", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/BulkStatusRepairTool.tsx:297"}, "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-74e2ea8aa96dd54a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/suppliers/XMLDocumentUpload.tsx:1323", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/suppliers/XMLDocumentUpload.tsx:1323"}, "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-576d588622bd0265", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/suppliers/XMLSupplierUpload.tsx:469", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/suppliers/XMLSupplierUpload.tsx:469"}, "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-a587315f11d81e5f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/suppliers/PaymentList.tsx:342", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/suppliers/PaymentList.tsx:342"}, "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-5f76b478a7c7d92f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/suppliers/SupplierPaymentCalendar.tsx:221", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/suppliers/SupplierPaymentCalendar.tsx:221"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a4087953b9315278", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/suppliers/detail/SupplierPartsTab.tsx:94", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/suppliers/detail/SupplierPartsTab.tsx:94"}, "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-889c0deca8a63dac", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/suppliers/detail/SupplierPaymentsTab.tsx:118", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/suppliers/detail/SupplierPaymentsTab.tsx:118"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c18ae77d6d197238", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/suppliers/form/SupplierInvoiceSelector.tsx:161", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/suppliers/form/SupplierInvoiceSelector.tsx:161"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7413f58a3df69e71", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/suppliers/form/PendingPaymentSelector.tsx:104", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/suppliers/form/PendingPaymentSelector.tsx:104"}, "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-8518a12e2c7a4269", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/suppliers/form/SupplierFormStepNavigation.tsx:73", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/suppliers/form/SupplierFormStepNavigation.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-7856edd518da714d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/suppliers/form/SupplierSummaryPanel.tsx:63", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/suppliers/form/SupplierSummaryPanel.tsx:63"}, "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-2f01706e22a0d99d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/clients/ClientsMobileView.tsx:111", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/clients/ClientsMobileView.tsx:111"}, "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-25ea0653a77b2690", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/clients/ClientGeneralInfo.tsx:20", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/clients/ClientGeneralInfo.tsx:20"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5e3dd71677384f50", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/clients/ClientServiceHistory.tsx:73", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/clients/ClientServiceHistory.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-d381ade981f5f714", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/clients/ClientDetailsModal.tsx:72", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/clients/ClientDetailsModal.tsx:72"}, "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-b8f34856c22e44d0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/clients/form/ClientFormStepNavigation.tsx:73", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/clients/form/ClientFormStepNavigation.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-157cf5033cf8c6db", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/clients/form/ClientSummaryPanel.tsx:56", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/clients/form/ClientSummaryPanel.tsx:56"}, "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-7869ca3b7c49acce", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/portal/layout/PortalSidebar.tsx:80", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/portal/layout/PortalSidebar.tsx:80"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5a803665ba411c4a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/quick-entry/LocationCapture.tsx:137", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/quick-entry/LocationCapture.tsx:137"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-25b15891ce5090c8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/services/ServicesMobileView.tsx:109", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/services/ServicesMobileView.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-86b330af695006b9", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/services/ServiceCostsSection.tsx:136", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/services/ServiceCostsSection.tsx:136"}, "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-22e46170a982fb58", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/services/ServiceBatchUpdateModal.tsx:273", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/services/ServiceBatchUpdateModal.tsx:273"}, "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-37fecb62e14edbca", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/services/ServicesTable.tsx:184", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/services/ServicesTable.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-06a6347cd28c6626", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/services/form/FormStepNavigation.tsx:75", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/services/form/FormStepNavigation.tsx:75"}, "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-ef900d759c8bd60e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/services/form/LocationCombobox.tsx:79", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/services/form/LocationCombobox.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-e9f0536724657547", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/services/form/FormSummaryPanel.tsx:82", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/services/form/FormSummaryPanel.tsx:82"}, "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-79ed0c92f2957feb", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/services/form/InsuredNameCombobox.tsx:62", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/services/form/InsuredNameCombobox.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-7f1ece1d369a83ac", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/operator/NextServiceCard.tsx:65", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/operator/NextServiceCard.tsx:65"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d5c93aaa83d86d00", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/operator/AssignedServiceCard.tsx:62", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/operator/AssignedServiceCard.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-ee1f9149c72a2250", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/reports/ReportsPage.tsx:393", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/reports/ReportsPage.tsx:393"}, "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-71a35b67bc03654c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/reports/shared/ReportMetricCard.tsx:18", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/reports/shared/ReportMetricCard.tsx:18"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f9c3898f99d36ab2", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/reports/dashboard/ReportsDashboard.tsx:80", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/reports/dashboard/ReportsDashboard.tsx:80"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-61d003acd3938a83", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/reports/maintenance/MaintenanceTables.tsx:264", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/reports/maintenance/MaintenanceTables.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-d91db9b8bfe03087", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/costs/XMLCostUpload.tsx:1385", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/costs/XMLCostUpload.tsx:1385"}, "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-3ab7f4f2a4aaf969", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/costs/EnhancedCostsTable.tsx:557", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/costs/EnhancedCostsTable.tsx:557"}, "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-e2dd1ac4b76c0086", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/costs/CSVCostUpload.tsx:239", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/costs/CSVCostUpload.tsx:239"}, "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-4899e44cc1da38cd", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/costs/CostsDashboard.tsx:244", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/costs/CostsDashboard.tsx:244"}, "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-6fd279f8969fc0a9", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/costs/form/CostSummaryPanel.tsx:143", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/costs/form/CostSummaryPanel.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-6a604c34bd5fb33f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/costs/form/CostCombobox.tsx:112", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/costs/form/CostCombobox.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-a6418a9b8b095840", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/costs/form/SupplierSelector.tsx:93", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/costs/form/SupplierSelector.tsx:93"}, "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-340e0cacbe0806f5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/costs/form/CostFormStepNavigation.tsx:74", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/costs/form/CostFormStepNavigation.tsx:74"}, "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-3bc3881f7690cecb", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/cranes/CraneParts.tsx:279", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/cranes/CraneParts.tsx:279"}, "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-da5f58dbb076f37e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/cranes/CraneCosts.tsx:170", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/cranes/CraneCosts.tsx:170"}, "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-214b248bbdb68755", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/cranes/forms/SimilarProductAlert.tsx:71", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/cranes/forms/SimilarProductAlert.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-bb4ff1144dacadcb", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/trip-calculator/SavedLocationsManager.tsx:131", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/trip-calculator/SavedLocationsManager.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-5203f4b21e30d8f8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/trip-calculator/TripCalculatorForm.tsx:123", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/trip-calculator/TripCalculatorForm.tsx:123"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-21fd3ca85320961c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/trip-calculator/TripCostBreakdown.tsx:153", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/trip-calculator/TripCostBreakdown.tsx:153"}, "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-146c34d6870f81c7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/vehicles/VehicleFullHistory.tsx:237", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/vehicles/VehicleFullHistory.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-9fc302ca88e9f972", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/invoices/InvoiceDetailsModal.tsx:750", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/invoices/InvoiceDetailsModal.tsx:750"}, "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-4e3550154be97425", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/invoices/InvoicesPipelineMetrics.tsx:180", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/invoices/InvoicesPipelineMetrics.tsx:180"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9d4c56ca601db4aa", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/invoices/InvoicesPipelineView.tsx:312", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/invoices/InvoicesPipelineView.tsx:312"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-34f760a66be5b1de", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/invoices/InvoiceHistoryImport.tsx:1648", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/invoices/InvoiceHistoryImport.tsx:1648"}, "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-f5e014722240ad80", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/invoices/InvoicesMobileView.tsx:147", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/invoices/InvoicesMobileView.tsx:147"}, "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-ef76a2efdcbd4b8d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/invoices/EnhancedClosureSelector.tsx:154", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/invoices/EnhancedClosureSelector.tsx:154"}, "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-12d7f9f4b28a842e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/invoices/BankStatementReconciliationPanel.tsx:615", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/invoices/BankStatementReconciliationPanel.tsx:615"}, "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-0ee18516caf475d6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/invoices/form/InvoiceSummaryPanel.tsx:85", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/invoices/form/InvoiceSummaryPanel.tsx:85"}, "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-71e83971a20aead4", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/invoices/form/InvoiceFormStepNavigation.tsx:73", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/invoices/form/InvoiceFormStepNavigation.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-c97eabbd1560da1a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Index.tsx:93", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Index.tsx:93"}, "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-56a8ff60f13e890a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/PendingUsers.tsx:196", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/PendingUsers.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-1fc8e0922af650d0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/portal/PortalServices.tsx:279", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/portal/PortalServices.tsx:279"}, "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-9d1261303047a083", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/_shared/cors.ts:33", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/_shared/cors.ts:33"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-272dfd6e8b8ee14d", "name": "Insecure pattern 'document_write' in src/utils/fileDownload.ts:16", "shortDescription": {"text": "Insecure pattern 'document_write' in src/utils/fileDownload.ts:16"}, "fullDescription": {"text": "Found a known-risky pattern (document_write). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-270a63e0182eed63", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/utils/fileDownload.ts:81", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/utils/fileDownload.ts:81"}, "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-fd63816fbc58df1b", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/components/auth/TurnstileWidget.tsx:98", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/auth/TurnstileWidget.tsx:98"}, "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-e3b7085febd0cd92", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/ui/chart.tsx:79", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/ui/chart.tsx:79"}, "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-8526ff6a9480de03", "name": "Insecure pattern 'local_storage_auth_token' in src/components/pwa/InstallPrompt.tsx:61", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in src/components/pwa/InstallPrompt.tsx:61"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ab1989fe1cbcc471", "name": "Insecure pattern 'document_write' in src/components/invoices/InvoiceDetailsModal.tsx:664", "shortDescription": {"text": "Insecure pattern 'document_write' in src/components/invoices/InvoiceDetailsModal.tsx:664"}, "fullDescription": {"text": "Found a known-risky pattern (document_write). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "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-23bc3421f7978fa7", "name": "Very large file: src/integrations/supabase/types.ts (7137 lines)", "shortDescription": {"text": "Very large file: src/integrations/supabase/types.ts (7137 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-9daac948f3da85fc", "name": "Very large file: src/components/inventory/XMLInventoryUpload.tsx (2162 lines)", "shortDescription": {"text": "Very large file: src/components/inventory/XMLInventoryUpload.tsx (2162 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-0f1987f5ee180b48", "name": "Very large file: src/components/finance/historical/PurchaseHistoryImport.tsx (1873 lines)", "shortDescription": {"text": "Very large file: src/components/finance/historical/PurchaseHistoryImport.tsx (1873 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-b49d65bb0345d72b", "name": "Very large file: src/components/suppliers/XMLDocumentUpload.tsx (1861 lines)", "shortDescription": {"text": "Very large file: src/components/suppliers/XMLDocumentUpload.tsx (1861 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-36d8bd8ba6ef73c3", "name": "Very large file: src/components/services/EnhancedServiceForm.tsx (1367 lines)", "shortDescription": {"text": "Very large file: src/components/services/EnhancedServiceForm.tsx (1367 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-74fd8b1abc987d22", "name": "Very large file: src/components/costs/XMLCostUpload.tsx (1847 lines)", "shortDescription": {"text": "Very large file: src/components/costs/XMLCostUpload.tsx (1847 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-7daee28f80b2623c", "name": "Very large file: src/components/invoices/InvoiceHistoryImport.tsx (1663 lines)", "shortDescription": {"text": "Very large file: src/components/invoices/InvoiceHistoryImport.tsx (1663 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": "29 test file(s) for 1041 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-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 120 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 706 placeholder/mock markers across 205 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-303dd2629067104d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/parse-quote-pdf/index.ts:214", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/parse-quote-pdf/index.ts:214"}, "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-3c772c68c1f10ea4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/classify-cost/index.ts:61", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/classify-cost/index.ts:61"}, "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-36d0aab81fe5fee3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/sre-lookup/index.ts:22", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/sre-lookup/index.ts:22"}, "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-800d4d58af8f7482", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/parse-receipt-image/index.ts:163", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/parse-receipt-image/index.ts:163"}, "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-3e1e2b234e75eb60", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/parse-purchase-order-pdf/index.ts:253", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/parse-purchase-order-pdf/index.ts:253"}, "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-72226cabbccad0e0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/send-password-reset/index.ts:72", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/send-password-reset/index.ts:72"}, "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-e97990b45fee67fe", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/suggest-bank-match/index.ts:196", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/suggest-bank-match/index.ts:196"}, "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-5810ed939cf31749", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/mapbox-proxy/index.ts:127", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/mapbox-proxy/index.ts:127"}, "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-ee9c702682f68bdb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/vehicle-api/index.ts:83", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/vehicle-api/index.ts:83"}, "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-3009b8ef6eacd767", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/tollroutes-proxy/index.ts:37", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/tollroutes-proxy/index.ts:37"}, "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-f00bf4b296b6b626", "name": "Legacy-named symbol `auto_backup` in supabase/functions/generate-backup/index.ts:118", "shortDescription": {"text": "Legacy-named symbol `auto_backup` in supabase/functions/generate-backup/index.ts:118"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-677b49e925f78a78", "name": "Legacy-named symbol `generate_quick_backup` in supabase/functions/generate-backup/backupGenerators.ts:118", "shortDescription": {"text": "Legacy-named symbol `generate_quick_backup` in supabase/functions/generate-backup/backupGenerators.ts:118"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ee3f79d0c0f77471", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/check-vehicle-patent/index.ts:41", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/check-vehicle-patent/index.ts:41"}, "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-a299e0aad716930b", "name": "Legacy-named symbol `auto_backup` in src/integrations/supabase/types.ts:5281", "shortDescription": {"text": "Legacy-named symbol `auto_backup` in src/integrations/supabase/types.ts:5281"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-eaafd7cdec9eb56b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/utils/vipPdfImportClient.ts:23", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/utils/vipPdfImportClient.ts:23"}, "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-37826a3e47cc707a", "name": "Commented-code block (9 lines) in src/utils/serviceHelpers.ts:81", "shortDescription": {"text": "Commented-code block (9 lines) in src/utils/serviceHelpers.ts:81"}, "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-3263fce32cee9a6f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/utils/localReceiptOcr.ts:182", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/utils/localReceiptOcr.ts:182"}, "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-147140e05ce411d1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/ErrorBoundary.tsx:20", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/ErrorBoundary.tsx:20"}, "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-96f2f4ec8dfe5a89", "name": "Commented-code block (10 lines) in src/components/suppliers/BatchEditSuppliersModal.tsx:54", "shortDescription": {"text": "Commented-code block (10 lines) in src/components/suppliers/BatchEditSuppliersModal.tsx:54"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d235e64b6b341b52", "name": "Commented-code block (9 lines) in src/lib/portal-container.ts:3", "shortDescription": {"text": "Commented-code block (9 lines) in src/lib/portal-container.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f12c8b0c2427a484", "name": "Legacy-named symbol `tOld` in src/hooks/useCraneParts.ts:206", "shortDescription": {"text": "Legacy-named symbol `tOld` in src/hooks/useCraneParts.ts:206"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a3c336e7aff99338", "name": "Commented-code block (8 lines) in src/hooks/useSupplierDetail.ts:173", "shortDescription": {"text": "Commented-code block (8 lines) in src/hooks/useSupplierDetail.ts:173"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4be22db1df08660f", "name": "Legacy-named symbol `auto_backup` in src/hooks/useSystemSettings.ts:14", "shortDescription": {"text": "Legacy-named symbol `auto_backup` in src/hooks/useSystemSettings.ts:14"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cc35b14f19f5e4dc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useUserManagement.ts:397", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useUserManagement.ts:397"}, "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-ecd8af2d85be40f8", "name": "Commented-code block (5 lines) in src/hooks/__tests__/useInvoiceOperations.test.tsx:80", "shortDescription": {"text": "Commented-code block (5 lines) in src/hooks/__tests__/useInvoiceOperations.test.tsx:80"}, "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-98ebd3adbc7b688e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/__tests__/useInvoiceOperations.test.tsx:41", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/__tests__/useInvoiceOperations.test.tsx:41"}, "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-b334d875f2339fa1", "name": "5 env vars used in code but missing from .env.example", "shortDescription": {"text": "5 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `CI`, `DEV`, `NEXT_PUBLIC_SUPABASE_ANON_KEY`, `NEXT_PUBLIC_SUPABASE_URL`, `VITE_SUPABASE_ANON_KEY`. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cb07a36b9b4572a8", "name": "Frontend route `/auth/callback` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/auth/callback` 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}}, {"id": "scanner-7f1bec1fd65c0879", "name": "Frontend route `/reset-password` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/reset-password` 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}}, {"id": "scanner-86df8fc42cd869f2", "name": "Frontend route `/performance-test` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/performance-test` 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}}, {"id": "scanner-d299ba481f5c1551", "name": "Frontend route `/debug-freeze` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/debug-freeze` 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}}, {"id": "scanner-1124be3c73fa7ac0", "name": "Frontend route `/connection-test` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/connection-test` 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}}, {"id": "scanner-9fd3e7b3e607ec61", "name": "Frontend route `/clients/:clientId/pipeline` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/clients/:clientId/pipeline` 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}}, {"id": "scanner-9a93989ae176cf47", "name": "Frontend route `service/:id/inspection` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `service/:id/inspection` 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}}, {"id": "scanner-cef386312d50c26d", "name": "Frontend route `dashboard` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `dashboard` 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}}, {"id": "scanner-9fb8d6f20d40cbfa", "name": "Frontend route `services` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `services` 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}}, {"id": "scanner-8a500017d0f81671", "name": "Frontend route `purchase-orders` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `purchase-orders` 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}}, {"id": "scanner-2ca74a451a077894", "name": "Frontend route `request-service` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `request-service` 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}}, {"id": "scanner-c6b1063982c47250", "name": "Frontend route `invoices` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `invoices` 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/19280"}, "properties": {"repository": "SergioIriarte666/gruas-alerta-calendario", "repoUrl": "https://github.com/SergioIriarte666/gruas-alerta-calendario", "branch": "main"}, "results": [{"ruleId": "scanner-351b009dd5492555", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate-console-logs.ts:124"}, "properties": {"repobilityId": "107d5273fc367ce7", "scanner": "scanner-primary", "fingerprint": "351b009dd5492555", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ad2d57fc1db3e9c8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diagnose-db.ts:31"}, "properties": {"repobilityId": "8437be3bad2e760c", "scanner": "scanner-primary", "fingerprint": "ad2d57fc1db3e9c8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ab6d0ec9c4bc181a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/parse-quote-pdf/index.ts:332"}, "properties": {"repobilityId": "0aa320e4f1725b13", "scanner": "scanner-primary", "fingerprint": "ab6d0ec9c4bc181a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-60fa1eb6ea66340a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/whatsapp-daily-alerts/index.ts:107"}, "properties": {"repobilityId": "49fd77ee3bbc0e81", "scanner": "scanner-primary", "fingerprint": "60fa1eb6ea66340a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9b72021d2b1b41c2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/remove-push-subscription/index.ts:41"}, "properties": {"repobilityId": "17d16aae773f11eb", "scanner": "scanner-primary", "fingerprint": "9b72021d2b1b41c2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-68095ea1dcf69c80", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/sre-lookup/index.ts:20"}, "properties": {"repobilityId": "3e584c82157f5c0b", "scanner": "scanner-primary", "fingerprint": "68095ea1dcf69c80", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b1fc2f336eeb6e9d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-inspection-email/index.ts:66"}, "properties": {"repobilityId": "c76440f2769936ac", "scanner": "scanner-primary", "fingerprint": "b1fc2f336eeb6e9d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f62ec9cef9e621d4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-payment-reminder/index.ts:50"}, "properties": {"repobilityId": "71380813b509fed3", "scanner": "scanner-primary", "fingerprint": "f62ec9cef9e621d4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-92b88202aad3f076", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-document-alerts/index.ts:67"}, "properties": {"repobilityId": "81ae765b4dcba2d0", "scanner": "scanner-primary", "fingerprint": "92b88202aad3f076", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-46537a8ba5338fd3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-invoice-email/index.ts:57"}, "properties": {"repobilityId": "1ad7517723e0fba6", "scanner": "scanner-primary", "fingerprint": "46537a8ba5338fd3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fa0a7913217b3792", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-service-confirmation/index.ts:47"}, "properties": {"repobilityId": "9a4a91619332471a", "scanner": "scanner-primary", "fingerprint": "fa0a7913217b3792", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-056bba77f5c4a4ef", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/parse-purchase-order-pdf/index.ts:381"}, "properties": {"repobilityId": "b3cf9072802142ae", "scanner": "scanner-primary", "fingerprint": "056bba77f5c4a4ef", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-10904dd1efec4262", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-operator-notification/index.ts:54"}, "properties": {"repobilityId": "1bda644448bf08d6", "scanner": "scanner-primary", "fingerprint": "10904dd1efec4262", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fb40e288c87477af", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-whatsapp-inspection/index.ts:39"}, "properties": {"repobilityId": "fab0c2f6c13064c3", "scanner": "scanner-primary", "fingerprint": "fb40e288c87477af", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b796d4030a528058", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-password-reset/index.ts:333"}, "properties": {"repobilityId": "f56d89db8e6afa5a", "scanner": "scanner-primary", "fingerprint": "b796d4030a528058", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-80099db584bc75ad", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/scheduled-backup-email/index.ts:232"}, "properties": {"repobilityId": "c751c3b5762d08ec", "scanner": "scanner-primary", "fingerprint": "80099db584bc75ad", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8ffe4511f0fd5e59", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-whatsapp-admin/index.ts:91"}, "properties": {"repobilityId": "8ab1d70a157f93b0", "scanner": "scanner-primary", "fingerprint": "8ffe4511f0fd5e59", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-03833c1feb7a4e9d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-whatsapp-retiro/index.ts:33"}, "properties": {"repobilityId": "7a1c8a0abdac7d95", "scanner": "scanner-primary", "fingerprint": "03833c1feb7a4e9d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0ec286b6cb5bdee8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/vehicle-api/index.ts:64"}, "properties": {"repobilityId": "9a46edca4fc65d6c", "scanner": "scanner-primary", "fingerprint": "0ec286b6cb5bdee8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d678e84087b52589", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/save-push-subscription/index.ts:52"}, "properties": {"repobilityId": "5f208d079c3ff152", "scanner": "scanner-primary", "fingerprint": "d678e84087b52589", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-387d259b533fb7e1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/generate-sql-dump/index.ts:51"}, "properties": {"repobilityId": "05f859c43acb10e3", "scanner": "scanner-primary", "fingerprint": "387d259b533fb7e1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a5d3a4a73b928433", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-user-invitation/index.ts:14"}, "properties": {"repobilityId": "f20edbec77f16424", "scanner": "scanner-primary", "fingerprint": "a5d3a4a73b928433", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a6236b0080393715", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/tollroutes-proxy/index.ts:85"}, "properties": {"repobilityId": "fb56ca2e8f83cc5b", "scanner": "scanner-primary", "fingerprint": "a6236b0080393715", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7fea33b8a427c451", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-whatsapp-operator/index.ts:76"}, "properties": {"repobilityId": "fd10088e4e3a0abc", "scanner": "scanner-primary", "fingerprint": "7fea33b8a427c451", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7d7ddcf243fcf771", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/generate-backup/index.ts:201"}, "properties": {"repobilityId": "6cfb79ddcddf1c0b", "scanner": "scanner-primary", "fingerprint": "7d7ddcf243fcf771", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-72ccaab5e85a2f16", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-daily-pending-report/index.ts:136"}, "properties": {"repobilityId": "f974a99145d0d292", "scanner": "scanner-primary", "fingerprint": "72ccaab5e85a2f16", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-09bdd2b00f127aa6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-push-notification/index.ts:22"}, "properties": {"repobilityId": "8d236a23d5b89001", "scanner": "scanner-primary", "fingerprint": "09bdd2b00f127aa6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-42c507ac96397a56", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/check-vehicle-patent/index.ts:39"}, "properties": {"repobilityId": "2aac3722a1bb9b5a", "scanner": "scanner-primary", "fingerprint": "42c507ac96397a56", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c93d09bd327ea140", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/_shared/whatsapp.ts:255"}, "properties": {"repobilityId": "80f7a99f26169787", "scanner": "scanner-primary", "fingerprint": "c93d09bd327ea140", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-236947bf1e9e3022", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 public/sw.js:6"}, "properties": {"repobilityId": "19ecb22d48da856c", "scanner": "scanner-primary", "fingerprint": "236947bf1e9e3022", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-22b0e35ec48bc211", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/settings/UserManagementTab.tsx:199"}, "properties": {"repobilityId": "a3171b6e04359965", "scanner": "scanner-primary", "fingerprint": "22b0e35ec48bc211", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0d0d32590e3c386c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/settings/audit/AuditTimeline.tsx:127"}, "properties": {"repobilityId": "41d109a3f9076f3c", "scanner": "scanner-primary", "fingerprint": "0d0d32590e3c386c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-438446e4dea1285f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/GlobalSearch.tsx:83"}, "properties": {"repobilityId": "48405c6b5e7e950e", "scanner": "scanner-primary", "fingerprint": "438446e4dea1285f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8127dd80f248cfb5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/OperatorLayout.tsx:71"}, "properties": {"repobilityId": "8b0bc3a4b618f8e2", "scanner": "scanner-primary", "fingerprint": "8127dd80f248cfb5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ebe612879ab8718e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/Sidebar.tsx:248"}, "properties": {"repobilityId": "be1152cdf47927a8", "scanner": "scanner-primary", "fingerprint": "ebe612879ab8718e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-274294cb1e15be35", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/Header.tsx:94"}, "properties": {"repobilityId": "c848c722ce61f0cc", "scanner": "scanner-primary", "fingerprint": "274294cb1e15be35", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1926a183a6b8da6d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/inventory/XMLInventoryUpload.tsx:1561"}, "properties": {"repobilityId": "9aed334354d8d8ad", "scanner": "scanner-primary", "fingerprint": "1926a183a6b8da6d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-03fde333b81261cd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/inventory/ProductCatalogTable.tsx:196"}, "properties": {"repobilityId": "10c8fca8f4a0f659", "scanner": "scanner-primary", "fingerprint": "03fde333b81261cd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4ef6591dd623a39c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/vip/BatchUpdateModal.tsx:386"}, "properties": {"repobilityId": "bfc501246be74458", "scanner": "scanner-primary", "fingerprint": "4ef6591dd623a39c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-06015423089db113", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/vip/KanbanBoard.tsx:130"}, "properties": {"repobilityId": "1a7abc8cd603ff61", "scanner": "scanner-primary", "fingerprint": "06015423089db113", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-46b8016850cc8fc5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/vip/PurchaseOrderManager.tsx:293"}, "properties": {"repobilityId": "2c50a55c5e6d2ae3", "scanner": "scanner-primary", "fingerprint": "46b8016850cc8fc5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-99d7d5bfc2a978fb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/vip/ServiceCard.tsx:70"}, "properties": {"repobilityId": "ef159668e02626a9", "scanner": "scanner-primary", "fingerprint": "99d7d5bfc2a978fb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4a8b8013aafc828c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/vip/PurchaseOrderDialog.tsx:139"}, "properties": {"repobilityId": "ac4e2fec2d69e037", "scanner": "scanner-primary", "fingerprint": "4a8b8013aafc828c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-000295d735d4d281", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projections/TopDebtorsCard.tsx:120"}, "properties": {"repobilityId": "58ed809385c5703a", "scanner": "scanner-primary", "fingerprint": "000295d735d4d281", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5e230c240079cc16", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/closures/ClosureDetailsModal.tsx:372"}, "properties": {"repobilityId": "31e58dea5390d01a", "scanner": "scanner-primary", "fingerprint": "5e230c240079cc16", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6705b7a1d5d61744", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/closures/ClosureSummaryPanel.tsx:77"}, "properties": {"repobilityId": "aadd59155f92185c", "scanner": "scanner-primary", "fingerprint": "6705b7a1d5d61744", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3d18351c60d9e9ba", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/closures/ClosureFormStepNavigation.tsx:73"}, "properties": {"repobilityId": "6faa3dff0ffeb47d", "scanner": "scanner-primary", "fingerprint": "3d18351c60d9e9ba", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a46d7fe920eddb42", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/common/AutocompleteInput.tsx:107"}, "properties": {"repobilityId": "94c158da1b5e887c", "scanner": "scanner-primary", "fingerprint": "a46d7fe920eddb42", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e0395909813e37b1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/common/DatePickerInput.tsx:54"}, "properties": {"repobilityId": "7468c814afaa3b72", "scanner": "scanner-primary", "fingerprint": "e0395909813e37b1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d70bb20e6abe1e71", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/serviceRates/ServiceRatesTable.tsx:58"}, "properties": {"repobilityId": "53f543c54ccd1a2b", "scanner": "scanner-primary", "fingerprint": "d70bb20e6abe1e71", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-65c9e55c9f56222c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/service-types/ServiceTypesTable.tsx:67"}, "properties": {"repobilityId": "a2fddb19b6b0a0ea", "scanner": "scanner-primary", "fingerprint": "65c9e55c9f56222c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cd3ef6575394fd4d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/metric-card.tsx:75"}, "properties": {"repobilityId": "71833461ba6dc945", "scanner": "scanner-primary", "fingerprint": "cd3ef6575394fd4d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-070a2ccdcf7839d2", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ui/chart.tsx:79"}, "properties": {"repobilityId": "b8c68f17a4018107", "scanner": "scanner-primary", "fingerprint": "070a2ccdcf7839d2", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-7c6a85d973282317", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/batch-progress-modal.tsx:86"}, "properties": {"repobilityId": "47d33f0d799a08a1", "scanner": "scanner-primary", "fingerprint": "7c6a85d973282317", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-49c8d2dbd38d111b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/PendingCategoryCard.tsx:78"}, "properties": {"repobilityId": "68b2632858000b1e", "scanner": "scanner-primary", "fingerprint": "49c8d2dbd38d111b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0f291b908d8a4186", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/RecentServicesTable.tsx:43"}, "properties": {"repobilityId": "0726a817d5c03540", "scanner": "scanner-primary", "fingerprint": "0f291b908d8a4186", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-857f9ff471581111", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/finance/historical/HistoricalResults.tsx:492"}, "properties": {"repobilityId": "f645c38e8f0538e6", "scanner": "scanner-primary", "fingerprint": "857f9ff471581111", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a32467678e761d9e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/finance/historical/HistoricalPurchasesTable.tsx:128"}, "properties": {"repobilityId": "d3f7931155b46c08", "scanner": "scanner-primary", "fingerprint": "a32467678e761d9e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-102fb499426661d9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/finance/historical/RecentImportLogsCard.tsx:68"}, "properties": {"repobilityId": "b8337a3342537536", "scanner": "scanner-primary", "fingerprint": "102fb499426661d9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e09a7fa52493c0e7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/finance/historical/HistoricalPurchasesPipelineView.tsx:278"}, "properties": {"repobilityId": "f37a2e895af8671b", "scanner": "scanner-primary", "fingerprint": "e09a7fa52493c0e7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7bf391a98401dbd2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/finance/historical/HistoricalSalesGroupedList.tsx:129"}, "properties": {"repobilityId": "4181beb22111df39", "scanner": "scanner-primary", "fingerprint": "7bf391a98401dbd2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6687d3a427562c79", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/finance/historical/HistoricalPurchasesGroupedList.tsx:133"}, "properties": {"repobilityId": "b6c1cfdeb6206c8e", "scanner": "scanner-primary", "fingerprint": "6687d3a427562c79", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-25f253c161a86200", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/finance/historical/HistoricalSalesTable.tsx:139"}, "properties": {"repobilityId": "86c5face74c2b650", "scanner": "scanner-primary", "fingerprint": "25f253c161a86200", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c1a7dad40511983d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/cost-centers/CostCentersPage.tsx:106"}, "properties": {"repobilityId": "a005577d50ff832e", "scanner": "scanner-primary", "fingerprint": "c1a7dad40511983d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-80791325e6027689", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/PurchaseVoidTool.tsx:140"}, "properties": {"repobilityId": "eee364e8c7637d27", "scanner": "scanner-primary", "fingerprint": "80791325e6027689", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c79b3ca1493e82cf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/BulkStatusRepairTool.tsx:297"}, "properties": {"repobilityId": "53ba44bfed5a8db2", "scanner": "scanner-primary", "fingerprint": "c79b3ca1493e82cf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-74e2ea8aa96dd54a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/suppliers/XMLDocumentUpload.tsx:1323"}, "properties": {"repobilityId": "e19b9d15837d5749", "scanner": "scanner-primary", "fingerprint": "74e2ea8aa96dd54a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-576d588622bd0265", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/suppliers/XMLSupplierUpload.tsx:469"}, "properties": {"repobilityId": "647293836029b5d9", "scanner": "scanner-primary", "fingerprint": "576d588622bd0265", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a587315f11d81e5f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/suppliers/PaymentList.tsx:342"}, "properties": {"repobilityId": "adbdcb5588ebc599", "scanner": "scanner-primary", "fingerprint": "a587315f11d81e5f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5f76b478a7c7d92f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/suppliers/SupplierPaymentCalendar.tsx:221"}, "properties": {"repobilityId": "6e2702c97fe17c13", "scanner": "scanner-primary", "fingerprint": "5f76b478a7c7d92f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a4087953b9315278", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/suppliers/detail/SupplierPartsTab.tsx:94"}, "properties": {"repobilityId": "1562e265683b8fdb", "scanner": "scanner-primary", "fingerprint": "a4087953b9315278", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-889c0deca8a63dac", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/suppliers/detail/SupplierPaymentsTab.tsx:118"}, "properties": {"repobilityId": "55de44afc7852310", "scanner": "scanner-primary", "fingerprint": "889c0deca8a63dac", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c18ae77d6d197238", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/suppliers/form/SupplierInvoiceSelector.tsx:161"}, "properties": {"repobilityId": "ed91b56afa9704a7", "scanner": "scanner-primary", "fingerprint": "c18ae77d6d197238", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7413f58a3df69e71", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/suppliers/form/PendingPaymentSelector.tsx:104"}, "properties": {"repobilityId": "5eba841274b9d8f6", "scanner": "scanner-primary", "fingerprint": "7413f58a3df69e71", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8518a12e2c7a4269", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/suppliers/form/SupplierFormStepNavigation.tsx:73"}, "properties": {"repobilityId": "56c248e4e65a1319", "scanner": "scanner-primary", "fingerprint": "8518a12e2c7a4269", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7856edd518da714d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/suppliers/form/SupplierSummaryPanel.tsx:63"}, "properties": {"repobilityId": "ee923ee3cd4d509d", "scanner": "scanner-primary", "fingerprint": "7856edd518da714d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2f01706e22a0d99d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/clients/ClientsMobileView.tsx:111"}, "properties": {"repobilityId": "9278d3def7d95600", "scanner": "scanner-primary", "fingerprint": "2f01706e22a0d99d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-25ea0653a77b2690", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/clients/ClientGeneralInfo.tsx:20"}, "properties": {"repobilityId": "92d83a3a9c4452a0", "scanner": "scanner-primary", "fingerprint": "25ea0653a77b2690", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5e3dd71677384f50", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/clients/ClientServiceHistory.tsx:73"}, "properties": {"repobilityId": "6f5e61f8d3ac5bae", "scanner": "scanner-primary", "fingerprint": "5e3dd71677384f50", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d381ade981f5f714", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/clients/ClientDetailsModal.tsx:72"}, "properties": {"repobilityId": "b519bfef9ce0feb2", "scanner": "scanner-primary", "fingerprint": "d381ade981f5f714", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b8f34856c22e44d0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/clients/form/ClientFormStepNavigation.tsx:73"}, "properties": {"repobilityId": "e8c4e1365a508971", "scanner": "scanner-primary", "fingerprint": "b8f34856c22e44d0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-157cf5033cf8c6db", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/clients/form/ClientSummaryPanel.tsx:56"}, "properties": {"repobilityId": "b844b89a39c5b877", "scanner": "scanner-primary", "fingerprint": "157cf5033cf8c6db", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7869ca3b7c49acce", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/portal/layout/PortalSidebar.tsx:80"}, "properties": {"repobilityId": "94aa9446f74c6d7b", "scanner": "scanner-primary", "fingerprint": "7869ca3b7c49acce", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5a803665ba411c4a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/quick-entry/LocationCapture.tsx:137"}, "properties": {"repobilityId": "26a96ae5e0dbd5a7", "scanner": "scanner-primary", "fingerprint": "5a803665ba411c4a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-25b15891ce5090c8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/services/ServicesMobileView.tsx:109"}, "properties": {"repobilityId": "75c42630b03910d5", "scanner": "scanner-primary", "fingerprint": "25b15891ce5090c8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-86b330af695006b9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/services/ServiceCostsSection.tsx:136"}, "properties": {"repobilityId": "8967eb19a83c7fa9", "scanner": "scanner-primary", "fingerprint": "86b330af695006b9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-22e46170a982fb58", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/services/ServiceBatchUpdateModal.tsx:273"}, "properties": {"repobilityId": "23fcd5d39af42b04", "scanner": "scanner-primary", "fingerprint": "22e46170a982fb58", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-37fecb62e14edbca", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/services/ServicesTable.tsx:184"}, "properties": {"repobilityId": "a2198fbc28e37d0f", "scanner": "scanner-primary", "fingerprint": "37fecb62e14edbca", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-06a6347cd28c6626", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/services/form/FormStepNavigation.tsx:75"}, "properties": {"repobilityId": "8ddf8a38128559af", "scanner": "scanner-primary", "fingerprint": "06a6347cd28c6626", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ef900d759c8bd60e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/services/form/LocationCombobox.tsx:79"}, "properties": {"repobilityId": "2c9ce96425e6f161", "scanner": "scanner-primary", "fingerprint": "ef900d759c8bd60e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e9f0536724657547", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/services/form/FormSummaryPanel.tsx:82"}, "properties": {"repobilityId": "ad982f50fdb7ab6a", "scanner": "scanner-primary", "fingerprint": "e9f0536724657547", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-79ed0c92f2957feb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/services/form/InsuredNameCombobox.tsx:62"}, "properties": {"repobilityId": "c576567109bcff47", "scanner": "scanner-primary", "fingerprint": "79ed0c92f2957feb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7f1ece1d369a83ac", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/operator/NextServiceCard.tsx:65"}, "properties": {"repobilityId": "bc7d97f4a48d4522", "scanner": "scanner-primary", "fingerprint": "7f1ece1d369a83ac", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d5c93aaa83d86d00", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/operator/AssignedServiceCard.tsx:62"}, "properties": {"repobilityId": "6ba9cd3ea7c9e9af", "scanner": "scanner-primary", "fingerprint": "d5c93aaa83d86d00", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ee1f9149c72a2250", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/reports/ReportsPage.tsx:393"}, "properties": {"repobilityId": "4680f1724e2f1b9f", "scanner": "scanner-primary", "fingerprint": "ee1f9149c72a2250", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-71a35b67bc03654c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/reports/shared/ReportMetricCard.tsx:18"}, "properties": {"repobilityId": "e55b4180fd0eb68c", "scanner": "scanner-primary", "fingerprint": "71a35b67bc03654c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f9c3898f99d36ab2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/reports/dashboard/ReportsDashboard.tsx:80"}, "properties": {"repobilityId": "ef6fd2bf144e0876", "scanner": "scanner-primary", "fingerprint": "f9c3898f99d36ab2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-61d003acd3938a83", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/reports/maintenance/MaintenanceTables.tsx:264"}, "properties": {"repobilityId": "8557e16eae689188", "scanner": "scanner-primary", "fingerprint": "61d003acd3938a83", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d91db9b8bfe03087", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/costs/XMLCostUpload.tsx:1385"}, "properties": {"repobilityId": "114d654f57d431ad", "scanner": "scanner-primary", "fingerprint": "d91db9b8bfe03087", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3ab7f4f2a4aaf969", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/costs/EnhancedCostsTable.tsx:557"}, "properties": {"repobilityId": "3b7afc9274b91a5f", "scanner": "scanner-primary", "fingerprint": "3ab7f4f2a4aaf969", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e2dd1ac4b76c0086", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/costs/CSVCostUpload.tsx:239"}, "properties": {"repobilityId": "1b4c57e8d23064d9", "scanner": "scanner-primary", "fingerprint": "e2dd1ac4b76c0086", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4899e44cc1da38cd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/costs/CostsDashboard.tsx:244"}, "properties": {"repobilityId": "bb77bd07d9599cf7", "scanner": "scanner-primary", "fingerprint": "4899e44cc1da38cd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6fd279f8969fc0a9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/costs/form/CostSummaryPanel.tsx:143"}, "properties": {"repobilityId": "66b33b12598f9d4e", "scanner": "scanner-primary", "fingerprint": "6fd279f8969fc0a9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6a604c34bd5fb33f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/costs/form/CostCombobox.tsx:112"}, "properties": {"repobilityId": "7cc2152aae8728c3", "scanner": "scanner-primary", "fingerprint": "6a604c34bd5fb33f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a6418a9b8b095840", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/costs/form/SupplierSelector.tsx:93"}, "properties": {"repobilityId": "b1ef01c5b7b38868", "scanner": "scanner-primary", "fingerprint": "a6418a9b8b095840", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-340e0cacbe0806f5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/costs/form/CostFormStepNavigation.tsx:74"}, "properties": {"repobilityId": "42c0a1db55797319", "scanner": "scanner-primary", "fingerprint": "340e0cacbe0806f5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3bc3881f7690cecb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/cranes/CraneParts.tsx:279"}, "properties": {"repobilityId": "507e194552556911", "scanner": "scanner-primary", "fingerprint": "3bc3881f7690cecb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-da5f58dbb076f37e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/cranes/CraneCosts.tsx:170"}, "properties": {"repobilityId": "d1fc2f034a9bd41a", "scanner": "scanner-primary", "fingerprint": "da5f58dbb076f37e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-214b248bbdb68755", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/cranes/forms/SimilarProductAlert.tsx:71"}, "properties": {"repobilityId": "b8b451300f8da3bc", "scanner": "scanner-primary", "fingerprint": "214b248bbdb68755", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bb4ff1144dacadcb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/trip-calculator/SavedLocationsManager.tsx:131"}, "properties": {"repobilityId": "c7445ae525d6b2a1", "scanner": "scanner-primary", "fingerprint": "bb4ff1144dacadcb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5203f4b21e30d8f8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/trip-calculator/TripCalculatorForm.tsx:123"}, "properties": {"repobilityId": "66d9bcfed94c8f6c", "scanner": "scanner-primary", "fingerprint": "5203f4b21e30d8f8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-21fd3ca85320961c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/trip-calculator/TripCostBreakdown.tsx:153"}, "properties": {"repobilityId": "4913510b0cc59f1c", "scanner": "scanner-primary", "fingerprint": "21fd3ca85320961c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-146c34d6870f81c7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/vehicles/VehicleFullHistory.tsx:237"}, "properties": {"repobilityId": "7dea9b9f883876e1", "scanner": "scanner-primary", "fingerprint": "146c34d6870f81c7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9fc302ca88e9f972", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/invoices/InvoiceDetailsModal.tsx:750"}, "properties": {"repobilityId": "d0539a73148315b2", "scanner": "scanner-primary", "fingerprint": "9fc302ca88e9f972", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4e3550154be97425", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/invoices/InvoicesPipelineMetrics.tsx:180"}, "properties": {"repobilityId": "e8587951d21e153f", "scanner": "scanner-primary", "fingerprint": "4e3550154be97425", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9d4c56ca601db4aa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/invoices/InvoicesPipelineView.tsx:312"}, "properties": {"repobilityId": "57b8650ca6fbfa42", "scanner": "scanner-primary", "fingerprint": "9d4c56ca601db4aa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-34f760a66be5b1de", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/invoices/InvoiceHistoryImport.tsx:1648"}, "properties": {"repobilityId": "15774013fa6403d6", "scanner": "scanner-primary", "fingerprint": "34f760a66be5b1de", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f5e014722240ad80", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/invoices/InvoicesMobileView.tsx:147"}, "properties": {"repobilityId": "255b96f3789e335b", "scanner": "scanner-primary", "fingerprint": "f5e014722240ad80", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ef76a2efdcbd4b8d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/invoices/EnhancedClosureSelector.tsx:154"}, "properties": {"repobilityId": "d3c01e7b2cfc84f6", "scanner": "scanner-primary", "fingerprint": "ef76a2efdcbd4b8d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-12d7f9f4b28a842e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/invoices/BankStatementReconciliationPanel.tsx:615"}, "properties": {"repobilityId": "f5b7a242649e7939", "scanner": "scanner-primary", "fingerprint": "12d7f9f4b28a842e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0ee18516caf475d6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/invoices/form/InvoiceSummaryPanel.tsx:85"}, "properties": {"repobilityId": "702e864652ccadf1", "scanner": "scanner-primary", "fingerprint": "0ee18516caf475d6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-71e83971a20aead4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/invoices/form/InvoiceFormStepNavigation.tsx:73"}, "properties": {"repobilityId": "f9d29be0813ca862", "scanner": "scanner-primary", "fingerprint": "71e83971a20aead4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c97eabbd1560da1a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Index.tsx:93"}, "properties": {"repobilityId": "a77c7e7666e4073b", "scanner": "scanner-primary", "fingerprint": "c97eabbd1560da1a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-56a8ff60f13e890a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/PendingUsers.tsx:196"}, "properties": {"repobilityId": "c976db17ddd1b557", "scanner": "scanner-primary", "fingerprint": "56a8ff60f13e890a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1fc8e0922af650d0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/portal/PortalServices.tsx:279"}, "properties": {"repobilityId": "be3439aef68d3e2c", "scanner": "scanner-primary", "fingerprint": "1fc8e0922af650d0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9d1261303047a083", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/_shared/cors.ts:33"}, "properties": {"repobilityId": "7c8e268f4e944077", "scanner": "scanner-primary", "fingerprint": "9d1261303047a083", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/_shared/cors.ts"}, "region": {"startLine": 33}}}]}, {"ruleId": "scanner-272dfd6e8b8ee14d", "level": "note", "message": {"text": "Insecure pattern 'document_write' in src/utils/fileDownload.ts:16"}, "properties": {"repobilityId": "0bd6d41c6c3bdaa0", "scanner": "scanner-primary", "fingerprint": "272dfd6e8b8ee14d", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/utils/fileDownload.ts"}, "region": {"startLine": 16}}}]}, {"ruleId": "scanner-270a63e0182eed63", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/utils/fileDownload.ts:81"}, "properties": {"repobilityId": "e187e04493399e39", "scanner": "scanner-primary", "fingerprint": "270a63e0182eed63", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/utils/fileDownload.ts"}, "region": {"startLine": 81}}}]}, {"ruleId": "scanner-fd63816fbc58df1b", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/auth/TurnstileWidget.tsx:98"}, "properties": {"repobilityId": "5ebf03c2e16b25a8", "scanner": "scanner-primary", "fingerprint": "fd63816fbc58df1b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/auth/TurnstileWidget.tsx"}, "region": {"startLine": 98}}}]}, {"ruleId": "scanner-e3b7085febd0cd92", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/ui/chart.tsx:79"}, "properties": {"repobilityId": "33f10636e53b4298", "scanner": "scanner-primary", "fingerprint": "e3b7085febd0cd92", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/ui/chart.tsx"}, "region": {"startLine": 79}}}]}, {"ruleId": "scanner-8526ff6a9480de03", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in src/components/pwa/InstallPrompt.tsx:61"}, "properties": {"repobilityId": "5d6add759633016b", "scanner": "scanner-primary", "fingerprint": "8526ff6a9480de03", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/pwa/InstallPrompt.tsx"}, "region": {"startLine": 61}}}]}, {"ruleId": "scanner-ab1989fe1cbcc471", "level": "note", "message": {"text": "Insecure pattern 'document_write' in src/components/invoices/InvoiceDetailsModal.tsx:664"}, "properties": {"repobilityId": "4cec9d1fbe59704a", "scanner": "scanner-primary", "fingerprint": "ab1989fe1cbcc471", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/invoices/InvoiceDetailsModal.tsx"}, "region": {"startLine": 664}}}]}, {"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-23bc3421f7978fa7", "level": "note", "message": {"text": "Very large file: src/integrations/supabase/types.ts (7137 lines)"}, "properties": {"repobilityId": "ede8ac5264027534", "scanner": "scanner-primary", "fingerprint": "23bc3421f7978fa7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9daac948f3da85fc", "level": "note", "message": {"text": "Very large file: src/components/inventory/XMLInventoryUpload.tsx (2162 lines)"}, "properties": {"repobilityId": "059ad588ee636a49", "scanner": "scanner-primary", "fingerprint": "9daac948f3da85fc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-0f1987f5ee180b48", "level": "note", "message": {"text": "Very large file: src/components/finance/historical/PurchaseHistoryImport.tsx (1873 lines)"}, "properties": {"repobilityId": "733ad1436ae21756", "scanner": "scanner-primary", "fingerprint": "0f1987f5ee180b48", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b49d65bb0345d72b", "level": "note", "message": {"text": "Very large file: src/components/suppliers/XMLDocumentUpload.tsx (1861 lines)"}, "properties": {"repobilityId": "09779141d1321390", "scanner": "scanner-primary", "fingerprint": "b49d65bb0345d72b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-36d8bd8ba6ef73c3", "level": "note", "message": {"text": "Very large file: src/components/services/EnhancedServiceForm.tsx (1367 lines)"}, "properties": {"repobilityId": "5f7bd13080612c9a", "scanner": "scanner-primary", "fingerprint": "36d8bd8ba6ef73c3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-74fd8b1abc987d22", "level": "note", "message": {"text": "Very large file: src/components/costs/XMLCostUpload.tsx (1847 lines)"}, "properties": {"repobilityId": "9f80b761a5b2be14", "scanner": "scanner-primary", "fingerprint": "74fd8b1abc987d22", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-7daee28f80b2623c", "level": "note", "message": {"text": "Very large file: src/components/invoices/InvoiceHistoryImport.tsx (1663 lines)"}, "properties": {"repobilityId": "fd7b47bccadcb23f", "scanner": "scanner-primary", "fingerprint": "7daee28f80b2623c", "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": "8a1b7c455bea7681", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "144edae0075755a3", "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": "b2f805af2368081a", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "25727dc12432cd7e", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "39f5d1c70340764f", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "1fe3e1e1f634ed75", "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": "6f151ebef9b5f4cf", "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": "7a50bfea3e0ec573", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-303dd2629067104d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/parse-quote-pdf/index.ts:214"}, "properties": {"repobilityId": "27e04f37709702b6", "scanner": "scanner-primary", "fingerprint": "303dd2629067104d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3c772c68c1f10ea4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/classify-cost/index.ts:61"}, "properties": {"repobilityId": "2efacf4c4b06ae91", "scanner": "scanner-primary", "fingerprint": "3c772c68c1f10ea4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-36d0aab81fe5fee3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/sre-lookup/index.ts:22"}, "properties": {"repobilityId": "fdf9346f41d29263", "scanner": "scanner-primary", "fingerprint": "36d0aab81fe5fee3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-800d4d58af8f7482", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/parse-receipt-image/index.ts:163"}, "properties": {"repobilityId": "b295a6c70c58910b", "scanner": "scanner-primary", "fingerprint": "800d4d58af8f7482", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3e1e2b234e75eb60", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/parse-purchase-order-pdf/index.ts:253"}, "properties": {"repobilityId": "faeaa335627fa654", "scanner": "scanner-primary", "fingerprint": "3e1e2b234e75eb60", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-72226cabbccad0e0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/send-password-reset/index.ts:72"}, "properties": {"repobilityId": "b017c9e5c657e3b0", "scanner": "scanner-primary", "fingerprint": "72226cabbccad0e0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e97990b45fee67fe", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/suggest-bank-match/index.ts:196"}, "properties": {"repobilityId": "d120137953872bb3", "scanner": "scanner-primary", "fingerprint": "e97990b45fee67fe", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5810ed939cf31749", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/mapbox-proxy/index.ts:127"}, "properties": {"repobilityId": "d7b223bb9a39d6e5", "scanner": "scanner-primary", "fingerprint": "5810ed939cf31749", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ee9c702682f68bdb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/vehicle-api/index.ts:83"}, "properties": {"repobilityId": "d77506d3b8e6b1cd", "scanner": "scanner-primary", "fingerprint": "ee9c702682f68bdb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3009b8ef6eacd767", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/tollroutes-proxy/index.ts:37"}, "properties": {"repobilityId": "98e1c4d423592045", "scanner": "scanner-primary", "fingerprint": "3009b8ef6eacd767", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f00bf4b296b6b626", "level": "note", "message": {"text": "Legacy-named symbol `auto_backup` in supabase/functions/generate-backup/index.ts:118"}, "properties": {"repobilityId": "e9f794f504521636", "scanner": "scanner-primary", "fingerprint": "f00bf4b296b6b626", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-677b49e925f78a78", "level": "note", "message": {"text": "Legacy-named symbol `generate_quick_backup` in supabase/functions/generate-backup/backupGenerators.ts:118"}, "properties": {"repobilityId": "33439978bc5e65dd", "scanner": "scanner-primary", "fingerprint": "677b49e925f78a78", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ee3f79d0c0f77471", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/check-vehicle-patent/index.ts:41"}, "properties": {"repobilityId": "8dd516756b94afd7", "scanner": "scanner-primary", "fingerprint": "ee3f79d0c0f77471", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a299e0aad716930b", "level": "note", "message": {"text": "Legacy-named symbol `auto_backup` in src/integrations/supabase/types.ts:5281"}, "properties": {"repobilityId": "968e671d7df8d3a8", "scanner": "scanner-primary", "fingerprint": "a299e0aad716930b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-eaafd7cdec9eb56b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/utils/vipPdfImportClient.ts:23"}, "properties": {"repobilityId": "fd162401320113b2", "scanner": "scanner-primary", "fingerprint": "eaafd7cdec9eb56b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-37826a3e47cc707a", "level": "none", "message": {"text": "Commented-code block (9 lines) in src/utils/serviceHelpers.ts:81"}, "properties": {"repobilityId": "e08b8412deebc1d2", "scanner": "scanner-primary", "fingerprint": "37826a3e47cc707a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3263fce32cee9a6f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/utils/localReceiptOcr.ts:182"}, "properties": {"repobilityId": "685b397cac82c915", "scanner": "scanner-primary", "fingerprint": "3263fce32cee9a6f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-147140e05ce411d1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/ErrorBoundary.tsx:20"}, "properties": {"repobilityId": "847e14e2f09e90db", "scanner": "scanner-primary", "fingerprint": "147140e05ce411d1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-96f2f4ec8dfe5a89", "level": "none", "message": {"text": "Commented-code block (10 lines) in src/components/suppliers/BatchEditSuppliersModal.tsx:54"}, "properties": {"repobilityId": "68b7e80ec152ca3d", "scanner": "scanner-primary", "fingerprint": "96f2f4ec8dfe5a89", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d235e64b6b341b52", "level": "none", "message": {"text": "Commented-code block (9 lines) in src/lib/portal-container.ts:3"}, "properties": {"repobilityId": "4f2b9b1df96d9673", "scanner": "scanner-primary", "fingerprint": "d235e64b6b341b52", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f12c8b0c2427a484", "level": "note", "message": {"text": "Legacy-named symbol `tOld` in src/hooks/useCraneParts.ts:206"}, "properties": {"repobilityId": "ba26f3afe80da06c", "scanner": "scanner-primary", "fingerprint": "f12c8b0c2427a484", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a3c336e7aff99338", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/hooks/useSupplierDetail.ts:173"}, "properties": {"repobilityId": "2fd65fc812f88567", "scanner": "scanner-primary", "fingerprint": "a3c336e7aff99338", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4be22db1df08660f", "level": "note", "message": {"text": "Legacy-named symbol `auto_backup` in src/hooks/useSystemSettings.ts:14"}, "properties": {"repobilityId": "4b133e5bc95004bd", "scanner": "scanner-primary", "fingerprint": "4be22db1df08660f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-cc35b14f19f5e4dc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useUserManagement.ts:397"}, "properties": {"repobilityId": "d83d9f0c2f660c49", "scanner": "scanner-primary", "fingerprint": "cc35b14f19f5e4dc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ecd8af2d85be40f8", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/hooks/__tests__/useInvoiceOperations.test.tsx:80"}, "properties": {"repobilityId": "eb2cb35775107f4b", "scanner": "scanner-primary", "fingerprint": "ecd8af2d85be40f8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-98ebd3adbc7b688e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/__tests__/useInvoiceOperations.test.tsx:41"}, "properties": {"repobilityId": "1d63439f8a6172ad", "scanner": "scanner-primary", "fingerprint": "98ebd3adbc7b688e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b334d875f2339fa1", "level": "note", "message": {"text": "5 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "faa38682016f5d53", "scanner": "scanner-primary", "fingerprint": "b334d875f2339fa1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-cb07a36b9b4572a8", "level": "warning", "message": {"text": "Frontend route `/auth/callback` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "89437733215e6393", "scanner": "scanner-primary", "fingerprint": "cb07a36b9b4572a8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-7f1bec1fd65c0879", "level": "warning", "message": {"text": "Frontend route `/reset-password` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "934747c714145754", "scanner": "scanner-primary", "fingerprint": "7f1bec1fd65c0879", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-86df8fc42cd869f2", "level": "warning", "message": {"text": "Frontend route `/performance-test` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "9b986053dbd91768", "scanner": "scanner-primary", "fingerprint": "86df8fc42cd869f2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d299ba481f5c1551", "level": "warning", "message": {"text": "Frontend route `/debug-freeze` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "18a90b6faaeb668c", "scanner": "scanner-primary", "fingerprint": "d299ba481f5c1551", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-1124be3c73fa7ac0", "level": "warning", "message": {"text": "Frontend route `/connection-test` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "6c4675d194e825e9", "scanner": "scanner-primary", "fingerprint": "1124be3c73fa7ac0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-9fd3e7b3e607ec61", "level": "warning", "message": {"text": "Frontend route `/clients/:clientId/pipeline` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "0cd9c9e282514dbb", "scanner": "scanner-primary", "fingerprint": "9fd3e7b3e607ec61", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-9a93989ae176cf47", "level": "warning", "message": {"text": "Frontend route `service/:id/inspection` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "b3614eff1e765b1d", "scanner": "scanner-primary", "fingerprint": "9a93989ae176cf47", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-cef386312d50c26d", "level": "warning", "message": {"text": "Frontend route `dashboard` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "7176b9e63e301c9b", "scanner": "scanner-primary", "fingerprint": "cef386312d50c26d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-9fb8d6f20d40cbfa", "level": "warning", "message": {"text": "Frontend route `services` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "cf9eddfe879279a3", "scanner": "scanner-primary", "fingerprint": "9fb8d6f20d40cbfa", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-8a500017d0f81671", "level": "warning", "message": {"text": "Frontend route `purchase-orders` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "bb3a2f4e0368ecf3", "scanner": "scanner-primary", "fingerprint": "8a500017d0f81671", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-2ca74a451a077894", "level": "warning", "message": {"text": "Frontend route `request-service` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "a31bdbef82a61ddc", "scanner": "scanner-primary", "fingerprint": "2ca74a451a077894", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c6b1063982c47250", "level": "warning", "message": {"text": "Frontend route `invoices` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "3b0550ed7e59599d", "scanner": "scanner-primary", "fingerprint": "c6b1063982c47250", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}]}]}