{"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-2af8f9741b8a9039", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/CuentasReceptorasAdmin.tsx:172", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/CuentasReceptorasAdmin.tsx:172"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1caba5c12d18f7f7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/AdminLayout.tsx:137", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/AdminLayout.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-e65da0f699d7a866", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ExtrasEditor.tsx:81", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ExtrasEditor.tsx:81"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c63a6515c6b3e821", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/PhoneInput.tsx:111", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/PhoneInput.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-19d186021fa7036c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/FileDropzone.tsx:95", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/FileDropzone.tsx:95"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ad58260612836ba2", "name": "Icon-only button without accessible name \u2014 src/components/OrdenTransferenciasModal.tsx:102", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/OrdenTransferenciasModal.tsx:102"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d4dd4365f33815f2", "name": "Icon-only button without accessible name \u2014 src/components/AdminPagarOrdenModal.tsx:233", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/AdminPagarOrdenModal.tsx:233"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2cd850a4255be015", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/AdminPagarOrdenModal.tsx:314", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/AdminPagarOrdenModal.tsx:314"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9a3f3ca31f8676b3", "name": "Icon-only button without accessible name \u2014 src/components/GenerarOrdenDriverModal.tsx:191", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/GenerarOrdenDriverModal.tsx:191"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-58ea638c795d0a0f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/CuentasReceptorasCard.tsx:71", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/CuentasReceptorasCard.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-0eded5deb72bd0cb", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ExtraurbanoEditor.tsx:122", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ExtraurbanoEditor.tsx:122"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ab4361156ce4482e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/FinanzasOrden.tsx:238", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/FinanzasOrden.tsx:238"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-77f882f34d3ff976", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Reportar.tsx:1787", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Reportar.tsx:1787"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8792140c4bc5a6d1", "name": "TODO/FIXME marker in shipping code \u2014 src/pages/Reportar.tsx:52", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/pages/Reportar.tsx:52"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-73d2cff334cfa51e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/Auditoria.tsx:216", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/Auditoria.tsx:216"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bab21c93b8dab89c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/Home.tsx:58", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/Home.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-3b65a93713e9cc18", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/cobranza/Bandejas.tsx:503", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/cobranza/Bandejas.tsx:503"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2bfdd154dec3dba1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/tesoreria/Movimientos.tsx:497", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/tesoreria/Movimientos.tsx:497"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3bf6b3a3ebdf6c34", "name": "TODO/FIXME marker in shipping code \u2014 src/pages/admin/tesoreria/EstadoResultados.tsx:5", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/pages/admin/tesoreria/EstadoResultados.tsx:5"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f5ba3564137c32f1", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/bcv-tasa-scrape/index.ts:251", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/bcv-tasa-scrape/index.ts:251"}, "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-788322999c0c5222", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/bcv-tasa-scrape/index.ts:90", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/bcv-tasa-scrape/index.ts:90"}, "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-cdf88661ca9eddd3", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/otp-email-send/index.ts:29", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/otp-email-send/index.ts:29"}, "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-731d7e6937cc20c7", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/otp-verify/index.ts:12", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/otp-verify/index.ts:12"}, "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-a8f1d4dd535b053b", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/vencidos-email-diario/index.ts:20", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/vencidos-email-diario/index.ts:20"}, "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-fdf97a6c6e0b9b3a", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/otp-email-verify/index.ts:14", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/otp-email-verify/index.ts:14"}, "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-61848fcf517306a8", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/otp-send/index.ts:20", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/otp-send/index.ts:20"}, "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-a541da86adc38a68", "name": "Very large file: src/pages/Reportes.tsx (1478 lines)", "shortDescription": {"text": "Very large file: src/pages/Reportes.tsx (1478 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-720cfe32056402e1", "name": "Very large file: src/pages/Reportar.tsx (1960 lines)", "shortDescription": {"text": "Very large file: src/pages/Reportar.tsx (1960 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-23481870c4ac47d8", "name": "Very large file: src/pages/admin/finanzas/Movimientos.tsx (1362 lines)", "shortDescription": {"text": "Very large file: src/pages/admin/finanzas/Movimientos.tsx (1362 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-11fdbb625b08a564", "name": "Very large file: src/lib/finanzas.ts (2314 lines)", "shortDescription": {"text": "Very large file: src/lib/finanzas.ts (2314 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-8f947bc0e4c18921", "name": "Very large file: src/lib/cobranza.ts (1958 lines)", "shortDescription": {"text": "Very large file: src/lib/cobranza.ts (1958 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": "0 test file(s) for 131 source file(s) (ratio 0.00). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 179 placeholder/mock markers across 52 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, tests. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci, tests. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-76d31cebf02a3082", "name": "Commented-code block (5 lines) in src/contexts/AuthContext.tsx:49", "shortDescription": {"text": "Commented-code block (5 lines) in src/contexts/AuthContext.tsx:49"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bafde295cdeee17a", "name": "Commented-code block (5 lines) in src/hooks/useFormDraft.ts:127", "shortDescription": {"text": "Commented-code block (5 lines) in src/hooks/useFormDraft.ts:127"}, "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-b1732a719690d3ad", "name": "Commented-code block (6 lines) in src/types/index.ts:57", "shortDescription": {"text": "Commented-code block (6 lines) in src/types/index.ts:57"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e1452f8b853f00d1", "name": "Commented-code block (5 lines) in src/types/finanzas.ts:204", "shortDescription": {"text": "Commented-code block (5 lines) in src/types/finanzas.ts:204"}, "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-beb10fe8e7970041", "name": "Commented-code block (6 lines) in src/types/dashboard.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/types/dashboard.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-583df9fa8ba43d1a", "name": "Commented-code block (6 lines) in src/components/AdminLayout.tsx:11", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/AdminLayout.tsx:11"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-66d82e70038fa562", "name": "Commented-code block (5 lines) in src/components/SearchableSelect.tsx:5", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/SearchableSelect.tsx:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b2c8c169b70ae99b", "name": "Commented-code block (5 lines) in src/components/MovimientoManualClienteModal.tsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/MovimientoManualClienteModal.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a41e42bfb7da054c", "name": "Commented-code block (5 lines) in src/components/CuentaBancariaCard.tsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/CuentaBancariaCard.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7ac42d15d1c3f8b7", "name": "Commented-code block (5 lines) in src/components/RevisarDriverPagoModal.tsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/RevisarDriverPagoModal.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9f64c7c69615084b", "name": "Commented-code block (9 lines) in src/components/DriverDetalleModal.tsx:1", "shortDescription": {"text": "Commented-code block (9 lines) in src/components/DriverDetalleModal.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-68591229741ddb23", "name": "Commented-code block (9 lines) in src/components/AdminPagarOrdenModal.tsx:3", "shortDescription": {"text": "Commented-code block (9 lines) in src/components/AdminPagarOrdenModal.tsx: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-855d8a20704c1bc3", "name": "Commented-code block (6 lines) in src/components/GuardarPlantillaModal.tsx:37", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/GuardarPlantillaModal.tsx:37"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-82f3a6c3b10ca5e9", "name": "Commented-code block (6 lines) in src/components/MovimientoMasivoModal.tsx:1", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/MovimientoMasivoModal.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f658e526a8f877a9", "name": "Commented-code block (7 lines) in src/pages/Reportes.tsx:918", "shortDescription": {"text": "Commented-code block (7 lines) in src/pages/Reportes.tsx:918"}, "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-e47429262ea63bbe", "name": "Commented-code block (7 lines) in src/pages/Finanzas.tsx:3", "shortDescription": {"text": "Commented-code block (7 lines) in src/pages/Finanzas.tsx: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-4e9c2ba01af7e98a", "name": "Commented-code block (5 lines) in src/pages/Reportar.tsx:94", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/Reportar.tsx:94"}, "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-69454a00b12bbd92", "name": "Commented-code block (6 lines) in src/pages/admin/cobranza/ClienteDetalle.tsx:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/pages/admin/cobranza/ClienteDetalle.tsx: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-9433cd6bf8482e01", "name": "Commented-code block (5 lines) in src/pages/admin/cobranza/NuevaRelacion.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/admin/cobranza/NuevaRelacion.tsx: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-3423055e5f4dcc56", "name": "Commented-code block (8 lines) in src/pages/admin/cobranza/RelacionDetalle.tsx:3", "shortDescription": {"text": "Commented-code block (8 lines) in src/pages/admin/cobranza/RelacionDetalle.tsx: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-4be16fb58be4b08b", "name": "Commented-code block (7 lines) in src/pages/admin/cobranza/PagoNuevo.tsx:6", "shortDescription": {"text": "Commented-code block (7 lines) in src/pages/admin/cobranza/PagoNuevo.tsx:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-47d0b278b0dd2abb", "name": "Commented-code block (9 lines) in src/pages/admin/tesoreria/Movimientos.tsx:3", "shortDescription": {"text": "Commented-code block (9 lines) in src/pages/admin/tesoreria/Movimientos.tsx: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-429f108b42002680", "name": "Commented-code block (8 lines) in src/pages/admin/finanzas/NuevaOrden.tsx:1", "shortDescription": {"text": "Commented-code block (8 lines) in src/pages/admin/finanzas/NuevaOrden.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5c221c1043cf3356", "name": "Commented-code block (7 lines) in src/pages/admin/finanzas/EditarOrden.tsx:1", "shortDescription": {"text": "Commented-code block (7 lines) in src/pages/admin/finanzas/EditarOrden.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-783bc17d88b11654", "name": "Commented-code block (7 lines) in src/pages/admin/finanzas/Cortes.tsx:8", "shortDescription": {"text": "Commented-code block (7 lines) in src/pages/admin/finanzas/Cortes.tsx:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8c96839b71fffe0a", "name": "Commented-code block (7 lines) in src/lib/finanzas.ts:4", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/finanzas.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e69f9bced993b6f0", "name": "Commented-code block (6 lines) in src/lib/phone.ts:24", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/phone.ts:24"}, "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-851be64b8ae785aa", "name": "Commented-code block (7 lines) in src/lib/pdf-relacion.ts:8", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/pdf-relacion.ts:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8d29ff4453ba232e", "name": "Commented-code block (6 lines) in src/lib/dates.ts:135", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/dates.ts:135"}, "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-9e4bf623dafe401f", "name": "Legacy-named symbol `cautos_driver_v2` in src/lib/storage.ts:3", "shortDescription": {"text": "Legacy-named symbol `cautos_driver_v2` in src/lib/storage.ts:3"}, "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-0cf7247f98fcc94a", "name": "Commented-code block (5 lines) in src/lib/storage.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/storage.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7b104e4292589bd5", "name": "Commented-code block (5 lines) in src/lib/plantillas.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/plantillas.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-6c7a9e07c51cc6a2", "name": "Commented-code block (5 lines) in src/lib/calculos.ts:35", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/calculos.ts:35"}, "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-d876e06689499895", "name": "Commented-code block (5 lines) in src/lib/featureFlags.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/featureFlags.ts:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7ffb978e2f8bb7dd", "name": "Commented-code block (8 lines) in src/lib/cobranza.ts:18", "shortDescription": {"text": "Commented-code block (8 lines) in src/lib/cobranza.ts:18"}, "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-69108e3fc5796316", "name": "Commented-code block (5 lines) in src/lib/finanzas-driver.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/finanzas-driver.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8b66edaf63f336b7", "name": "Commented-code block (5 lines) in src/lib/conteo.ts:236", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/conteo.ts:236"}, "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-abdae75ee5ea8c4f", "name": "Commented-code block (5 lines) in src/lib/pendientes.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/pendientes.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-53f773e9a52c1db5", "name": "Commented-code block (6 lines) in supabase/functions/bcv-tasa-scrape/index.ts:9", "shortDescription": {"text": "Commented-code block (6 lines) in supabase/functions/bcv-tasa-scrape/index.ts:9"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a9f9055763f9485b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/bcv-tasa-scrape/index.ts:37", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/bcv-tasa-scrape/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-8d4686e0f1167fb5", "name": "Commented-code block (6 lines) in supabase/functions/otp-email-send/index.ts:5", "shortDescription": {"text": "Commented-code block (6 lines) in supabase/functions/otp-email-send/index.ts:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f5cf3f2d039ecd38", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/otp-email-send/index.ts:159", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/otp-email-send/index.ts:159"}, "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-58c3a99ae62ba327", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/otp-verify/index.ts:71", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/otp-verify/index.ts:71"}, "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-ad4da13752ee4f65", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/vencidos-email-diario/index.ts:107", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/vencidos-email-diario/index.ts:107"}, "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-5b31fa08cb03c811", "name": "Commented-code block (5 lines) in supabase/functions/otp-send/index.ts:11", "shortDescription": {"text": "Commented-code block (5 lines) in supabase/functions/otp-send/index.ts:11"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-66278b4b2d5a4539", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/otp-send/index.ts:111", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/otp-send/index.ts:111"}, "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-0e58339187b0af97", "name": "Frontend route `/editar/:id` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/editar/:id` 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-449b4d7918b8c15c", "name": "Frontend route `/finanzas/orden/:id` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/finanzas/orden/:id` 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-fe2b8d07ff284d2c", "name": "Frontend route `reportes` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `reportes` 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-ef27ab8f1bdbf239", "name": "Frontend route `reportes/editar/:id` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `reportes/editar/:id` 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-af139738c19477f9", "name": "Frontend route `reportes/nuevo` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `reportes/nuevo` 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-cd384148ee3b256b", "name": "Frontend route `grupos` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `grupos` 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-abc619cf67e0f483", "name": "Frontend route `drivers` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `drivers` 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-375ffe69b549d90c", "name": "Frontend route `extraurbanos` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `extraurbanos` 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-36c2f36ad4b63e2c", "name": "Frontend route `usuarios` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `usuarios` 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-c870a8a43d4f9d61", "name": "Frontend route `auditoria` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `auditoria` 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-364ccace05e8767f", "name": "Frontend route `configuracion` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `configuracion` 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-2b57227056aa5751", "name": "Frontend route `finanzas/tasa` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `finanzas/tasa` 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-5fe0d1cf7216621a", "name": "Frontend route `finanzas` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `finanzas` 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-aedac3d8cfcc9f36", "name": "Frontend route `finanzas/ordenes/nueva` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `finanzas/ordenes/nueva` 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-1ffcce0afabf7d9e", "name": "Frontend route `finanzas/ordenes/:id/editar` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `finanzas/ordenes/:id/editar` 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-ef848332b46c4032", "name": "Frontend route `finanzas/drivers/:id` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `finanzas/drivers/:id` 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-9ff6e3d8beda7b43", "name": "Frontend route `finanzas/cortes` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `finanzas/cortes` 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-74380b1877d5342b", "name": "Frontend route `finanzas/driver-pagos` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `finanzas/driver-pagos` 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-6994677a9a56b927", "name": "Frontend route `cobranza` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `cobranza` 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-4cb9054d97929305", "name": "Frontend route `cobranza/clientes` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `cobranza/clientes` 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-d878d03cda0a6638", "name": "Frontend route `cobranza/clientes/:id` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `cobranza/clientes/:id` 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-2569982d9e8a2d89", "name": "Frontend route `cobranza/bandejas` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `cobranza/bandejas` 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-a8a4c990e473a4f3", "name": "Frontend route `cobranza/relaciones` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `cobranza/relaciones` 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-40480b11e1e6dd08", "name": "Frontend route `cobranza/relaciones/nueva` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `cobranza/relaciones/nueva` 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-6dfd7387d14ece06", "name": "Frontend route `cobranza/relaciones/:id/editar` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `cobranza/relaciones/:id/editar` 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-6514bac977c52fd9", "name": "Frontend route `cobranza/relaciones/:id` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `cobranza/relaciones/:id` 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-eee8c74fa21410ae", "name": "Frontend route `cobranza/vencidos` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `cobranza/vencidos` 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-5b13a30f610ab8cf", "name": "Frontend route `cobranza/pagos` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `cobranza/pagos` 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-bca97e3983dbcc7c", "name": "Frontend route `cobranza/pagos/nuevo` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `cobranza/pagos/nuevo` 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-a375ab474a7cda0e", "name": "Frontend route `cobranza/pagos/:id` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `cobranza/pagos/:id` 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/24852"}, "properties": {"repository": "cautosops/reportes", "repoUrl": "https://github.com/cautosops/reportes", "branch": "main"}, "results": [{"ruleId": "scanner-2af8f9741b8a9039", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/CuentasReceptorasAdmin.tsx:172"}, "properties": {"repobilityId": "05359ba2f9480b47", "scanner": "scanner-primary", "fingerprint": "2af8f9741b8a9039", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1caba5c12d18f7f7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/AdminLayout.tsx:137"}, "properties": {"repobilityId": "d531e6d9150888b5", "scanner": "scanner-primary", "fingerprint": "1caba5c12d18f7f7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e65da0f699d7a866", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ExtrasEditor.tsx:81"}, "properties": {"repobilityId": "98054cf2eb03297b", "scanner": "scanner-primary", "fingerprint": "e65da0f699d7a866", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c63a6515c6b3e821", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/PhoneInput.tsx:111"}, "properties": {"repobilityId": "012ae6c421a7968c", "scanner": "scanner-primary", "fingerprint": "c63a6515c6b3e821", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-19d186021fa7036c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/FileDropzone.tsx:95"}, "properties": {"repobilityId": "1ede2908066412ab", "scanner": "scanner-primary", "fingerprint": "19d186021fa7036c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ad58260612836ba2", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/OrdenTransferenciasModal.tsx:102"}, "properties": {"repobilityId": "9936f8c7db0f7e39", "scanner": "scanner-primary", "fingerprint": "ad58260612836ba2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-d4dd4365f33815f2", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/AdminPagarOrdenModal.tsx:233"}, "properties": {"repobilityId": "59c4e7d8f448bdaa", "scanner": "scanner-primary", "fingerprint": "d4dd4365f33815f2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-2cd850a4255be015", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/AdminPagarOrdenModal.tsx:314"}, "properties": {"repobilityId": "24e2b12492f0b685", "scanner": "scanner-primary", "fingerprint": "2cd850a4255be015", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9a3f3ca31f8676b3", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/GenerarOrdenDriverModal.tsx:191"}, "properties": {"repobilityId": "7e92be15fa3abe67", "scanner": "scanner-primary", "fingerprint": "9a3f3ca31f8676b3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-58ea638c795d0a0f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/CuentasReceptorasCard.tsx:71"}, "properties": {"repobilityId": "d6c01a87d7da4f8d", "scanner": "scanner-primary", "fingerprint": "58ea638c795d0a0f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0eded5deb72bd0cb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ExtraurbanoEditor.tsx:122"}, "properties": {"repobilityId": "268562202c61810c", "scanner": "scanner-primary", "fingerprint": "0eded5deb72bd0cb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ab4361156ce4482e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/FinanzasOrden.tsx:238"}, "properties": {"repobilityId": "54a0f0a349142d0f", "scanner": "scanner-primary", "fingerprint": "ab4361156ce4482e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-77f882f34d3ff976", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Reportar.tsx:1787"}, "properties": {"repobilityId": "f18c4b4ddca71897", "scanner": "scanner-primary", "fingerprint": "77f882f34d3ff976", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8792140c4bc5a6d1", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/pages/Reportar.tsx:52"}, "properties": {"repobilityId": "7870598af232e3d1", "scanner": "scanner-primary", "fingerprint": "8792140c4bc5a6d1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-73d2cff334cfa51e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/Auditoria.tsx:216"}, "properties": {"repobilityId": "e84b194e29f1559b", "scanner": "scanner-primary", "fingerprint": "73d2cff334cfa51e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bab21c93b8dab89c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/Home.tsx:58"}, "properties": {"repobilityId": "abb7d1fc1409b951", "scanner": "scanner-primary", "fingerprint": "bab21c93b8dab89c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3b65a93713e9cc18", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/cobranza/Bandejas.tsx:503"}, "properties": {"repobilityId": "1bbab4109ba0d49e", "scanner": "scanner-primary", "fingerprint": "3b65a93713e9cc18", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2bfdd154dec3dba1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/tesoreria/Movimientos.tsx:497"}, "properties": {"repobilityId": "718c81f3d64b51ff", "scanner": "scanner-primary", "fingerprint": "2bfdd154dec3dba1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3bf6b3a3ebdf6c34", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/pages/admin/tesoreria/EstadoResultados.tsx:5"}, "properties": {"repobilityId": "db7058ea747c055a", "scanner": "scanner-primary", "fingerprint": "3bf6b3a3ebdf6c34", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-f5ba3564137c32f1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/bcv-tasa-scrape/index.ts:251"}, "properties": {"repobilityId": "6424310fcfcc546f", "scanner": "scanner-primary", "fingerprint": "f5ba3564137c32f1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-788322999c0c5222", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/bcv-tasa-scrape/index.ts:90"}, "properties": {"repobilityId": "fa05bacf4c48f499", "scanner": "scanner-primary", "fingerprint": "788322999c0c5222", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/bcv-tasa-scrape/index.ts"}, "region": {"startLine": 90}}}]}, {"ruleId": "scanner-cdf88661ca9eddd3", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/otp-email-send/index.ts:29"}, "properties": {"repobilityId": "00a63e4e21ceb79b", "scanner": "scanner-primary", "fingerprint": "cdf88661ca9eddd3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/otp-email-send/index.ts"}, "region": {"startLine": 29}}}]}, {"ruleId": "scanner-731d7e6937cc20c7", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/otp-verify/index.ts:12"}, "properties": {"repobilityId": "e63edada76a791b6", "scanner": "scanner-primary", "fingerprint": "731d7e6937cc20c7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/otp-verify/index.ts"}, "region": {"startLine": 12}}}]}, {"ruleId": "scanner-a8f1d4dd535b053b", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/vencidos-email-diario/index.ts:20"}, "properties": {"repobilityId": "93aa09e4db990ae9", "scanner": "scanner-primary", "fingerprint": "a8f1d4dd535b053b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/vencidos-email-diario/index.ts"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-fdf97a6c6e0b9b3a", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/otp-email-verify/index.ts:14"}, "properties": {"repobilityId": "8b3aa41d159b736b", "scanner": "scanner-primary", "fingerprint": "fdf97a6c6e0b9b3a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/otp-email-verify/index.ts"}, "region": {"startLine": 14}}}]}, {"ruleId": "scanner-61848fcf517306a8", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/otp-send/index.ts:20"}, "properties": {"repobilityId": "2224b72b7a24c7a1", "scanner": "scanner-primary", "fingerprint": "61848fcf517306a8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/otp-send/index.ts"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-a541da86adc38a68", "level": "note", "message": {"text": "Very large file: src/pages/Reportes.tsx (1478 lines)"}, "properties": {"repobilityId": "596451c3e60e3e5b", "scanner": "scanner-primary", "fingerprint": "a541da86adc38a68", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-720cfe32056402e1", "level": "note", "message": {"text": "Very large file: src/pages/Reportar.tsx (1960 lines)"}, "properties": {"repobilityId": "93ff0422bbe7d24e", "scanner": "scanner-primary", "fingerprint": "720cfe32056402e1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-23481870c4ac47d8", "level": "note", "message": {"text": "Very large file: src/pages/admin/finanzas/Movimientos.tsx (1362 lines)"}, "properties": {"repobilityId": "8ea0a047c0d73b6f", "scanner": "scanner-primary", "fingerprint": "23481870c4ac47d8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-11fdbb625b08a564", "level": "note", "message": {"text": "Very large file: src/lib/finanzas.ts (2314 lines)"}, "properties": {"repobilityId": "c6d73eb89addf28e", "scanner": "scanner-primary", "fingerprint": "11fdbb625b08a564", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-8f947bc0e4c18921", "level": "note", "message": {"text": "Very large file: src/lib/cobranza.ts (1958 lines)"}, "properties": {"repobilityId": "24621bbb02c79faa", "scanner": "scanner-primary", "fingerprint": "8f947bc0e4c18921", "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": "f497f17a62e1622c", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "0259eb099ab92b32", "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": "6c3c8c96529960a3", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "57a4df7469108171", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "3f235645341f4267", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-76d31cebf02a3082", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/contexts/AuthContext.tsx:49"}, "properties": {"repobilityId": "70b12aefb3a57f22", "scanner": "scanner-primary", "fingerprint": "76d31cebf02a3082", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bafde295cdeee17a", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/hooks/useFormDraft.ts:127"}, "properties": {"repobilityId": "acf18babb1708ce8", "scanner": "scanner-primary", "fingerprint": "bafde295cdeee17a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b1732a719690d3ad", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/types/index.ts:57"}, "properties": {"repobilityId": "245cd15728a8a53e", "scanner": "scanner-primary", "fingerprint": "b1732a719690d3ad", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e1452f8b853f00d1", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/types/finanzas.ts:204"}, "properties": {"repobilityId": "5f8cfe3af2adff27", "scanner": "scanner-primary", "fingerprint": "e1452f8b853f00d1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-beb10fe8e7970041", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/types/dashboard.ts:3"}, "properties": {"repobilityId": "48957dc3ebbc173d", "scanner": "scanner-primary", "fingerprint": "beb10fe8e7970041", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-583df9fa8ba43d1a", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/AdminLayout.tsx:11"}, "properties": {"repobilityId": "1ae126987d275f1d", "scanner": "scanner-primary", "fingerprint": "583df9fa8ba43d1a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-66d82e70038fa562", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/SearchableSelect.tsx:5"}, "properties": {"repobilityId": "17b99787bf3531ec", "scanner": "scanner-primary", "fingerprint": "66d82e70038fa562", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b2c8c169b70ae99b", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/MovimientoManualClienteModal.tsx:1"}, "properties": {"repobilityId": "d00811256e7f832a", "scanner": "scanner-primary", "fingerprint": "b2c8c169b70ae99b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a41e42bfb7da054c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/CuentaBancariaCard.tsx:1"}, "properties": {"repobilityId": "37c89b4525a9ff4a", "scanner": "scanner-primary", "fingerprint": "a41e42bfb7da054c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7ac42d15d1c3f8b7", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/RevisarDriverPagoModal.tsx:1"}, "properties": {"repobilityId": "eb33c6d01a52b6cb", "scanner": "scanner-primary", "fingerprint": "7ac42d15d1c3f8b7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9f64c7c69615084b", "level": "none", "message": {"text": "Commented-code block (9 lines) in src/components/DriverDetalleModal.tsx:1"}, "properties": {"repobilityId": "08de35bca62d1086", "scanner": "scanner-primary", "fingerprint": "9f64c7c69615084b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-68591229741ddb23", "level": "none", "message": {"text": "Commented-code block (9 lines) in src/components/AdminPagarOrdenModal.tsx:3"}, "properties": {"repobilityId": "544875cd5628bbcb", "scanner": "scanner-primary", "fingerprint": "68591229741ddb23", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-855d8a20704c1bc3", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/GuardarPlantillaModal.tsx:37"}, "properties": {"repobilityId": "0a3ea6320f770d98", "scanner": "scanner-primary", "fingerprint": "855d8a20704c1bc3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-82f3a6c3b10ca5e9", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/MovimientoMasivoModal.tsx:1"}, "properties": {"repobilityId": "bf8fba0c6fd19ed1", "scanner": "scanner-primary", "fingerprint": "82f3a6c3b10ca5e9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f658e526a8f877a9", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/pages/Reportes.tsx:918"}, "properties": {"repobilityId": "6b3424c1a065caa1", "scanner": "scanner-primary", "fingerprint": "f658e526a8f877a9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e47429262ea63bbe", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/pages/Finanzas.tsx:3"}, "properties": {"repobilityId": "6a242e1d9ff4d36d", "scanner": "scanner-primary", "fingerprint": "e47429262ea63bbe", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4e9c2ba01af7e98a", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/Reportar.tsx:94"}, "properties": {"repobilityId": "d3125e3a55f15dec", "scanner": "scanner-primary", "fingerprint": "4e9c2ba01af7e98a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-69454a00b12bbd92", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/pages/admin/cobranza/ClienteDetalle.tsx:3"}, "properties": {"repobilityId": "3c7b6ba90f618fad", "scanner": "scanner-primary", "fingerprint": "69454a00b12bbd92", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9433cd6bf8482e01", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/admin/cobranza/NuevaRelacion.tsx:3"}, "properties": {"repobilityId": "fe3519bab8da9afd", "scanner": "scanner-primary", "fingerprint": "9433cd6bf8482e01", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3423055e5f4dcc56", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/pages/admin/cobranza/RelacionDetalle.tsx:3"}, "properties": {"repobilityId": "8c8f6e12ba5d6a20", "scanner": "scanner-primary", "fingerprint": "3423055e5f4dcc56", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4be16fb58be4b08b", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/pages/admin/cobranza/PagoNuevo.tsx:6"}, "properties": {"repobilityId": "ead1301cacd7119b", "scanner": "scanner-primary", "fingerprint": "4be16fb58be4b08b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-47d0b278b0dd2abb", "level": "none", "message": {"text": "Commented-code block (9 lines) in src/pages/admin/tesoreria/Movimientos.tsx:3"}, "properties": {"repobilityId": "2761c8cde3b57df7", "scanner": "scanner-primary", "fingerprint": "47d0b278b0dd2abb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-429f108b42002680", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/pages/admin/finanzas/NuevaOrden.tsx:1"}, "properties": {"repobilityId": "b93c44f6dac1769f", "scanner": "scanner-primary", "fingerprint": "429f108b42002680", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5c221c1043cf3356", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/pages/admin/finanzas/EditarOrden.tsx:1"}, "properties": {"repobilityId": "fb280cb2e9736b04", "scanner": "scanner-primary", "fingerprint": "5c221c1043cf3356", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-783bc17d88b11654", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/pages/admin/finanzas/Cortes.tsx:8"}, "properties": {"repobilityId": "d0f04b4e5460749f", "scanner": "scanner-primary", "fingerprint": "783bc17d88b11654", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8c96839b71fffe0a", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/finanzas.ts:4"}, "properties": {"repobilityId": "2a4302c47acbcc52", "scanner": "scanner-primary", "fingerprint": "8c96839b71fffe0a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e69f9bced993b6f0", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/phone.ts:24"}, "properties": {"repobilityId": "e8da6156ac6f5ae4", "scanner": "scanner-primary", "fingerprint": "e69f9bced993b6f0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-851be64b8ae785aa", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/pdf-relacion.ts:8"}, "properties": {"repobilityId": "db28b9f6f67f8387", "scanner": "scanner-primary", "fingerprint": "851be64b8ae785aa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8d29ff4453ba232e", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/dates.ts:135"}, "properties": {"repobilityId": "7b6423c037fc4dba", "scanner": "scanner-primary", "fingerprint": "8d29ff4453ba232e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9e4bf623dafe401f", "level": "note", "message": {"text": "Legacy-named symbol `cautos_driver_v2` in src/lib/storage.ts:3"}, "properties": {"repobilityId": "337162020cc1e975", "scanner": "scanner-primary", "fingerprint": "9e4bf623dafe401f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-0cf7247f98fcc94a", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/storage.ts:1"}, "properties": {"repobilityId": "20cafb3b90514c2a", "scanner": "scanner-primary", "fingerprint": "0cf7247f98fcc94a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7b104e4292589bd5", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/plantillas.ts:3"}, "properties": {"repobilityId": "597c3b4d7f869937", "scanner": "scanner-primary", "fingerprint": "7b104e4292589bd5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6c7a9e07c51cc6a2", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/calculos.ts:35"}, "properties": {"repobilityId": "f0aaa07ff7fe60d7", "scanner": "scanner-primary", "fingerprint": "6c7a9e07c51cc6a2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d876e06689499895", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/featureFlags.ts:5"}, "properties": {"repobilityId": "20ef06de77bd8397", "scanner": "scanner-primary", "fingerprint": "d876e06689499895", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7ffb978e2f8bb7dd", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/lib/cobranza.ts:18"}, "properties": {"repobilityId": "9089bb1c1c95657d", "scanner": "scanner-primary", "fingerprint": "7ffb978e2f8bb7dd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-69108e3fc5796316", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/finanzas-driver.ts:1"}, "properties": {"repobilityId": "8a868a6a44f26995", "scanner": "scanner-primary", "fingerprint": "69108e3fc5796316", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8b66edaf63f336b7", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/conteo.ts:236"}, "properties": {"repobilityId": "4d32a007c726ec05", "scanner": "scanner-primary", "fingerprint": "8b66edaf63f336b7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-abdae75ee5ea8c4f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/pendientes.ts:3"}, "properties": {"repobilityId": "0d3ffc0f361f1968", "scanner": "scanner-primary", "fingerprint": "abdae75ee5ea8c4f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-53f773e9a52c1db5", "level": "none", "message": {"text": "Commented-code block (6 lines) in supabase/functions/bcv-tasa-scrape/index.ts:9"}, "properties": {"repobilityId": "67195930586b285b", "scanner": "scanner-primary", "fingerprint": "53f773e9a52c1db5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a9f9055763f9485b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/bcv-tasa-scrape/index.ts:37"}, "properties": {"repobilityId": "6b48deb39eca197b", "scanner": "scanner-primary", "fingerprint": "a9f9055763f9485b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8d4686e0f1167fb5", "level": "none", "message": {"text": "Commented-code block (6 lines) in supabase/functions/otp-email-send/index.ts:5"}, "properties": {"repobilityId": "2c017b6518e4acdf", "scanner": "scanner-primary", "fingerprint": "8d4686e0f1167fb5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f5cf3f2d039ecd38", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/otp-email-send/index.ts:159"}, "properties": {"repobilityId": "9ddb60dbb2e1dc84", "scanner": "scanner-primary", "fingerprint": "f5cf3f2d039ecd38", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-58c3a99ae62ba327", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/otp-verify/index.ts:71"}, "properties": {"repobilityId": "b469e24bf70dbca9", "scanner": "scanner-primary", "fingerprint": "58c3a99ae62ba327", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ad4da13752ee4f65", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/vencidos-email-diario/index.ts:107"}, "properties": {"repobilityId": "0613eda6eb42fce0", "scanner": "scanner-primary", "fingerprint": "ad4da13752ee4f65", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5b31fa08cb03c811", "level": "none", "message": {"text": "Commented-code block (5 lines) in supabase/functions/otp-send/index.ts:11"}, "properties": {"repobilityId": "8ad65afba1826f34", "scanner": "scanner-primary", "fingerprint": "5b31fa08cb03c811", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-66278b4b2d5a4539", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/otp-send/index.ts:111"}, "properties": {"repobilityId": "0536a071d4bcb3a8", "scanner": "scanner-primary", "fingerprint": "66278b4b2d5a4539", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0e58339187b0af97", "level": "warning", "message": {"text": "Frontend route `/editar/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "a75dc388ecdd8b8f", "scanner": "scanner-primary", "fingerprint": "0e58339187b0af97", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-449b4d7918b8c15c", "level": "warning", "message": {"text": "Frontend route `/finanzas/orden/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "fa161e5a394115d7", "scanner": "scanner-primary", "fingerprint": "449b4d7918b8c15c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-fe2b8d07ff284d2c", "level": "warning", "message": {"text": "Frontend route `reportes` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "8bc6e379a5104168", "scanner": "scanner-primary", "fingerprint": "fe2b8d07ff284d2c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-ef27ab8f1bdbf239", "level": "warning", "message": {"text": "Frontend route `reportes/editar/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "c7f28020a61f36b6", "scanner": "scanner-primary", "fingerprint": "ef27ab8f1bdbf239", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-af139738c19477f9", "level": "warning", "message": {"text": "Frontend route `reportes/nuevo` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "d7e82b154b252310", "scanner": "scanner-primary", "fingerprint": "af139738c19477f9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-cd384148ee3b256b", "level": "warning", "message": {"text": "Frontend route `grupos` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "336192cb332dab67", "scanner": "scanner-primary", "fingerprint": "cd384148ee3b256b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-abc619cf67e0f483", "level": "warning", "message": {"text": "Frontend route `drivers` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "df4418ed1e7f9749", "scanner": "scanner-primary", "fingerprint": "abc619cf67e0f483", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-375ffe69b549d90c", "level": "warning", "message": {"text": "Frontend route `extraurbanos` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "81ad401b668a3431", "scanner": "scanner-primary", "fingerprint": "375ffe69b549d90c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-36c2f36ad4b63e2c", "level": "warning", "message": {"text": "Frontend route `usuarios` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "ac1f9e7fb205f224", "scanner": "scanner-primary", "fingerprint": "36c2f36ad4b63e2c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c870a8a43d4f9d61", "level": "warning", "message": {"text": "Frontend route `auditoria` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "648abd01706a9006", "scanner": "scanner-primary", "fingerprint": "c870a8a43d4f9d61", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-364ccace05e8767f", "level": "warning", "message": {"text": "Frontend route `configuracion` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "8f6088027eb7e155", "scanner": "scanner-primary", "fingerprint": "364ccace05e8767f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-2b57227056aa5751", "level": "warning", "message": {"text": "Frontend route `finanzas/tasa` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "c39362abe21ced13", "scanner": "scanner-primary", "fingerprint": "2b57227056aa5751", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-5fe0d1cf7216621a", "level": "warning", "message": {"text": "Frontend route `finanzas` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "0aadbce72f1a9efc", "scanner": "scanner-primary", "fingerprint": "5fe0d1cf7216621a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-aedac3d8cfcc9f36", "level": "warning", "message": {"text": "Frontend route `finanzas/ordenes/nueva` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "97f1b6faa6685d53", "scanner": "scanner-primary", "fingerprint": "aedac3d8cfcc9f36", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-1ffcce0afabf7d9e", "level": "warning", "message": {"text": "Frontend route `finanzas/ordenes/:id/editar` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "4e25642e54e27728", "scanner": "scanner-primary", "fingerprint": "1ffcce0afabf7d9e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-ef848332b46c4032", "level": "warning", "message": {"text": "Frontend route `finanzas/drivers/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "2859c14da4eda8e4", "scanner": "scanner-primary", "fingerprint": "ef848332b46c4032", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-9ff6e3d8beda7b43", "level": "warning", "message": {"text": "Frontend route `finanzas/cortes` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "1ee0b32026d328ae", "scanner": "scanner-primary", "fingerprint": "9ff6e3d8beda7b43", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-74380b1877d5342b", "level": "warning", "message": {"text": "Frontend route `finanzas/driver-pagos` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "fd2bdebed4c4684e", "scanner": "scanner-primary", "fingerprint": "74380b1877d5342b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-6994677a9a56b927", "level": "warning", "message": {"text": "Frontend route `cobranza` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "8f514b5e2f78c3b4", "scanner": "scanner-primary", "fingerprint": "6994677a9a56b927", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-4cb9054d97929305", "level": "warning", "message": {"text": "Frontend route `cobranza/clientes` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "36e17add38552c9c", "scanner": "scanner-primary", "fingerprint": "4cb9054d97929305", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d878d03cda0a6638", "level": "warning", "message": {"text": "Frontend route `cobranza/clientes/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "ccb0e543bac248a6", "scanner": "scanner-primary", "fingerprint": "d878d03cda0a6638", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-2569982d9e8a2d89", "level": "warning", "message": {"text": "Frontend route `cobranza/bandejas` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "cd52564b567bc5a8", "scanner": "scanner-primary", "fingerprint": "2569982d9e8a2d89", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a8a4c990e473a4f3", "level": "warning", "message": {"text": "Frontend route `cobranza/relaciones` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "73134917cb9afaee", "scanner": "scanner-primary", "fingerprint": "a8a4c990e473a4f3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-40480b11e1e6dd08", "level": "warning", "message": {"text": "Frontend route `cobranza/relaciones/nueva` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "4323bfbdc7a6b38c", "scanner": "scanner-primary", "fingerprint": "40480b11e1e6dd08", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-6dfd7387d14ece06", "level": "warning", "message": {"text": "Frontend route `cobranza/relaciones/:id/editar` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "907840cc957dc752", "scanner": "scanner-primary", "fingerprint": "6dfd7387d14ece06", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-6514bac977c52fd9", "level": "warning", "message": {"text": "Frontend route `cobranza/relaciones/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "1e111bea3056c8c4", "scanner": "scanner-primary", "fingerprint": "6514bac977c52fd9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-eee8c74fa21410ae", "level": "warning", "message": {"text": "Frontend route `cobranza/vencidos` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "9e5c8e25a0ea32e0", "scanner": "scanner-primary", "fingerprint": "eee8c74fa21410ae", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-5b13a30f610ab8cf", "level": "warning", "message": {"text": "Frontend route `cobranza/pagos` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "eac613daf00d7c0e", "scanner": "scanner-primary", "fingerprint": "5b13a30f610ab8cf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-bca97e3983dbcc7c", "level": "warning", "message": {"text": "Frontend route `cobranza/pagos/nuevo` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "b8147847136ca8ba", "scanner": "scanner-primary", "fingerprint": "bca97e3983dbcc7c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a375ab474a7cda0e", "level": "warning", "message": {"text": "Frontend route `cobranza/pagos/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "be9310529ca26ea1", "scanner": "scanner-primary", "fingerprint": "a375ab474a7cda0e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}]}]}