{"version": "2.1.0", "$schema": "https://json.schemastore.org/sarif-2.1.0.json", "runs": [{"tool": {"driver": {"name": "Repobility", "informationUri": "https://repobility.com", "rules": [{"id": "scanner-bead75b0f9233e05", "name": "No API endpoints detected", "shortDescription": {"text": "No API endpoints detected"}, "fullDescription": {"text": "The scanner did not find FastAPI/Flask/Express/NestJS/GraphQL/gRPC routes. If this repo exposes APIs, the framework may be unsupported."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "info", "confidence": 1.0}}, {"id": "scanner-18022a7f99eb513b", "name": "\"active\" state uses light bg in a dark theme \u2014 components/layout/Sidebar.tsx:70", "shortDescription": {"text": "\"active\" state uses light bg in a dark theme \u2014 components/layout/Sidebar.tsx:70"}, "fullDescription": {"text": "A ternary like `active ? 'bg-white' : '...'` (or bg-gray-100/200) on a dark theme produces jarring white pills. Use a dark-emphasized active state instead \u2014 border + ring or slightly brighter dark bg. Example: `active ? 'bg-gray-800 border-gray-500 ring-1 ring-blue-500/30' : '\u2026'`.\n\nWhy: P-E in CHECKLIST.md \u2014 light bg in a dark theme is a class of regression.\nRule id: fq.active-light-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-75f3cdc2b05a2dd6", "name": "`truncate` class without `title=` for hover reveal \u2014 components/layout/Header.tsx:29", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/layout/Header.tsx:29"}, "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-4546d91150aa1d2f", "name": "`truncate` class without `title=` for hover reveal \u2014 components/academy/StudyCatalogClient.tsx:153", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/academy/StudyCatalogClient.tsx:153"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0791ec6d84b58762", "name": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/ActivityCalendar.tsx:317", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/ActivityCalendar.tsx:317"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-52bf24d85584e28c", "name": "`truncate` class without `title=` for hover reveal \u2014 components/accounts/AccountCombobox.tsx:127", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/accounts/AccountCombobox.tsx:127"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8c8e48767b62f175", "name": "`truncate` class without `title=` for hover reveal \u2014 components/activities/CalendarMonth.tsx:122", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/activities/CalendarMonth.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-35004d4152a2a6a1", "name": "`truncate` class without `title=` for hover reveal \u2014 components/incentivos/BogleAdmin.tsx:203", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/incentivos/BogleAdmin.tsx:203"}, "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-ea62e5d579c1e590", "name": "`truncate` class without `title=` for hover reveal \u2014 components/incentivos/VendorIncentives.tsx:332", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/incentivos/VendorIncentives.tsx:332"}, "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-857c1aa89c6e9d3a", "name": "`truncate` class without `title=` for hover reveal \u2014 components/incentivos/BogleVendor.tsx:203", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/incentivos/BogleVendor.tsx:203"}, "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-f964a1963e4c1004", "name": "`truncate` class without `title=` for hover reveal \u2014 components/reparto/KanbanRutas.tsx:260", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/reparto/KanbanRutas.tsx:260"}, "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-663db26568bc186f", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 components/cartera/CobranzaEmails.tsx:318", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/cartera/CobranzaEmails.tsx:318"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-12f7c17ff715d643", "name": "`truncate` class without `title=` for hover reveal \u2014 components/samples/SampleRequestForm.tsx:328", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/samples/SampleRequestForm.tsx:328"}, "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-f2d48e2964cf86aa", "name": "`truncate` class without `title=` for hover reveal \u2014 components/samples/AddCitasToSample.tsx:108", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/samples/AddCitasToSample.tsx:108"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e3ad6f3f0196ba57", "name": "`truncate` class without `title=` for hover reveal \u2014 components/equipo/EquipoBoard.tsx:124", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/equipo/EquipoBoard.tsx:124"}, "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-fcff26f42f0579f1", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/page.tsx:573", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/page.tsx:573"}, "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-93bd1a951ee49797", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/academy/page.tsx:192", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/academy/page.tsx:192"}, "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-939e27b6be107cf1", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/cuentas/[id]/page.tsx:325", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/cuentas/[id]/page.tsx:325"}, "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-47e0ff5f911b7110", "name": "Insecure pattern 'dangerous_innerhtml' in components/cartera/CobranzaEmails.tsx:318", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in components/cartera/CobranzaEmails.tsx:318"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "10 test file(s) for 394 source file(s) (ratio 0.03). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 92 console/debugger/print-style debug statements in non-test source. This is a common fast-generation residue before production cleanup."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 147 placeholder/mock markers across 53 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e332d22920f08fe7", "name": "Legacy-named symbol `is_legacy` in types/database.ts:28", "shortDescription": {"text": "Legacy-named symbol `is_legacy` in types/database.ts:28"}, "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-b342eec126eb993d", "name": "Commented-code block (7 lines) in scripts/recordatorio-contactos-vendedores.mjs:18", "shortDescription": {"text": "Commented-code block (7 lines) in scripts/recordatorio-contactos-vendedores.mjs: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-e7802fbe98cb5776", "name": "Commented-code block (6 lines) in scripts/gen-plantilla-ventas.mjs:4", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/gen-plantilla-ventas.mjs: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-3510f5b91b8da198", "name": "Commented-code block (13 lines) in scripts/verify-incentivos-gb.mjs:6", "shortDescription": {"text": "Commented-code block (13 lines) in scripts/verify-incentivos-gb.mjs: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-668552c64b3b5403", "name": "Commented-code block (5 lines) in scripts/migrate-reparto.mjs:10", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/migrate-reparto.mjs:10"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0506c09882f01856", "name": "Commented-code block (8 lines) in scripts/snapshot-gb.mjs:1", "shortDescription": {"text": "Commented-code block (8 lines) in scripts/snapshot-gb.mjs: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-df5d362b9d9c5b63", "name": "Commented-code block (6 lines) in components/ventas/ImportVentasClient.tsx:3", "shortDescription": {"text": "Commented-code block (6 lines) in components/ventas/ImportVentasClient.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-48aad400dfd0181b", "name": "Commented-code block (6 lines) in components/dashboard/ActivityCalendar.tsx:3", "shortDescription": {"text": "Commented-code block (6 lines) in components/dashboard/ActivityCalendar.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-4d6b2807256f80b3", "name": "Legacy-named symbol `is_legacy` in components/accounts/AccountForm.tsx:85", "shortDescription": {"text": "Legacy-named symbol `is_legacy` in components/accounts/AccountForm.tsx:85"}, "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-daf3bb7c8bd36759", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/usuarios/UsuariosClient.tsx:57", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/usuarios/UsuariosClient.tsx:57"}, "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-3440dae0df740281", "name": "Commented-code block (5 lines) in components/reparto/KanbanRutas.tsx:67", "shortDescription": {"text": "Commented-code block (5 lines) in components/reparto/KanbanRutas.tsx:67"}, "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-c40663224f325fd4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/reparto/UploadCFDI.tsx:51", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/reparto/UploadCFDI.tsx:51"}, "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-aa010d1c8e14b4c5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/reparto/ChoferesAdmin.tsx:82", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/reparto/ChoferesAdmin.tsx:82"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-76a5f804f42471fe", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/reparto/PedidoActions.tsx:56", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/reparto/PedidoActions.tsx:56"}, "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-1024de9e094ef904", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/reparto/PedidoForm.tsx:109", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/reparto/PedidoForm.tsx:109"}, "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-abbcd5fbc8f8dbaf", "name": "Legacy-named symbol `isLegacy` in components/cartera/RiesgoBadge.tsx:7", "shortDescription": {"text": "Legacy-named symbol `isLegacy` in components/cartera/RiesgoBadge.tsx:7"}, "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-d48486684198c9b6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/cartera/conciliacion/ReconcileConfirmDialog.tsx:183", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/cartera/conciliacion/ReconcileConfirmDialog.tsx:183"}, "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-e85bffdedbf20e77", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/consignaciones/ConsignacionForm.tsx:152", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/consignaciones/ConsignacionForm.tsx:152"}, "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-8b1039778e0eb74f", "name": "Commented-code block (5 lines) in components/consignaciones/ConsignacionActions.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in components/consignaciones/ConsignacionActions.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-8a6ae0a2096fff8f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/consignaciones/RetiroDialog.tsx:94", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/consignaciones/RetiroDialog.tsx:94"}, "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-2daafd4c74cd4421", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/consignaciones/ReposicionDialog.tsx:92", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/consignaciones/ReposicionDialog.tsx:92"}, "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-14309b01bba5cf5d", "name": "Commented-code block (5 lines) in app/api/activities/calendar/route.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/activities/calendar/route.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-6a6a734ab3271bca", "name": "Commented-code block (8 lines) in app/api/cron/clientes-inactivos/route.ts:1", "shortDescription": {"text": "Commented-code block (8 lines) in app/api/cron/clientes-inactivos/route.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-4882b8ccb9240e21", "name": "Commented-code block (5 lines) in app/api/reparto/diag/route.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/reparto/diag/route.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-77759ddc1f7b6380", "name": "Commented-code block (7 lines) in app/api/reparto/pedidos/[id]/entregar/route.ts:1", "shortDescription": {"text": "Commented-code block (7 lines) in app/api/reparto/pedidos/[id]/entregar/route.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-c4025b0a275f2855", "name": "Commented-code block (5 lines) in app/api/cuentas/[id]/next-best-action/route.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/cuentas/[id]/next-best-action/route.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-dd613b7e7def787c", "name": "Commented-code block (5 lines) in app/api/recordatorios/contactos-vendedores/route.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/recordatorios/contactos-vendedores/route.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-b5d9d651eb52c5a3", "name": "Commented-code block (6 lines) in app/api/cartera/conciliacion/[statementId]/match/route.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in app/api/cartera/conciliacion/[statementId]/match/route.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-4c856ce5730570c2", "name": "Commented-code block (5 lines) in app/api/cartera/conciliacion/[statementId]/confirm/route.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/cartera/conciliacion/[statementId]/confirm/route.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-027dab7c25ae5843", "name": "Commented-code block (6 lines) in app/api/cartera/[accountId]/cobranza/registrar/route.ts:7", "shortDescription": {"text": "Commented-code block (6 lines) in app/api/cartera/[accountId]/cobranza/registrar/route.ts:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9af3ee416dd5f1e5", "name": "Legacy-named symbol `is_legacy` in app/api/cartera/[accountId]/pdf/route.ts:21", "shortDescription": {"text": "Legacy-named symbol `is_legacy` in app/api/cartera/[accountId]/pdf/route.ts:21"}, "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-c6125de12431e0ac", "name": "Commented-code block (5 lines) in app/api/samples/[id]/enviar/route.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/samples/[id]/enviar/route.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-8c4f7bec9d63b612", "name": "Commented-code block (7 lines) in app/api/consignaciones/tomas/[id]/vincular/route.ts:7", "shortDescription": {"text": "Commented-code block (7 lines) in app/api/consignaciones/tomas/[id]/vincular/route.ts:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-81d21dbec0239278", "name": "Commented-code block (5 lines) in app/api/consignaciones/[id]/retiro/route.ts:58", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/consignaciones/[id]/retiro/route.ts:58"}, "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-e28580602ebec8da", "name": "Commented-code block (5 lines) in app/(app)/ventas/conciliacion/page.tsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in app/(app)/ventas/conciliacion/page.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-68d90ec2e880a6de", "name": "Commented-code block (5 lines) in app/(app)/reportes/page.tsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in app/(app)/reportes/page.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-37f89f3fd4f91e11", "name": "Legacy-named symbol `is_legacy` in app/(app)/reparto/credito/page.tsx:29", "shortDescription": {"text": "Legacy-named symbol `is_legacy` in app/(app)/reparto/credito/page.tsx:29"}, "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-2806a402c8bfd3f8", "name": "Commented-code block (5 lines) in app/(app)/reparto/credito/page.tsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in app/(app)/reparto/credito/page.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-8943354f1a952ff6", "name": "Legacy-named symbol `is_legacy` in app/(app)/cartera/[accountId]/page.tsx:42", "shortDescription": {"text": "Legacy-named symbol `is_legacy` in app/(app)/cartera/[accountId]/page.tsx:42"}, "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-adfecbdc0f8d5d5e", "name": "Commented-code block (5 lines) in app/(app)/consignaciones/tomas/page.tsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in app/(app)/consignaciones/tomas/page.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-35c788d7c827d1f7", "name": "Commented-code block (5 lines) in lib/muestra-email.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in lib/muestra-email.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-5adfd23c7f0cfd2a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/email.ts:53", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/email.ts:53"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9b2c1cb6b9e645b7", "name": "Commented-code block (5 lines) in lib/incentivos.ts:109", "shortDescription": {"text": "Commented-code block (5 lines) in lib/incentivos.ts:109"}, "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-942a43d94053ad17", "name": "Legacy-named symbol `isLegacy` in lib/cobranza.ts:67", "shortDescription": {"text": "Legacy-named symbol `isLegacy` in lib/cobranza.ts:67"}, "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-ce32e26870622a6b", "name": "Commented-code block (5 lines) in lib/cobranza.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in lib/cobranza.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-7e3421cac82a1240", "name": "Commented-code block (5 lines) in lib/base44-docs.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in lib/base44-docs.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-d809a32a79e9f48e", "name": "Commented-code block (5 lines) in lib/restock.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in lib/restock.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-1f0e67ce65d18ee6", "name": "Commented-code block (5 lines) in lib/base44-flota.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in lib/base44-flota.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-8aa70c03f1c6008c", "name": "Commented-code block (5 lines) in lib/supabase-reparto.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in lib/supabase-reparto.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-4e0765e44ec215b2", "name": "Commented-code block (6 lines) in lib/contpaq-map.ts:4", "shortDescription": {"text": "Commented-code block (6 lines) in lib/contpaq-map.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-27b3d71dcf5fe920", "name": "Commented-code block (6 lines) in lib/anthropic.ts:270", "shortDescription": {"text": "Commented-code block (6 lines) in lib/anthropic.ts:270"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7c66955f5e07f8b3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/anthropic.ts:41", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/anthropic.ts:41"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4b6368202b4f622f", "name": "Commented-code block (5 lines) in lib/excel/parseClientesFiscal.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in lib/excel/parseClientesFiscal.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-c40ce4d083c796a5", "name": "Commented-code block (5 lines) in lib/excel/parseContpaqCodigos.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in lib/excel/parseContpaqCodigos.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-dbf1f7c5d4db0cae", "name": "Commented-code block (7 lines) in lib/bank/aliases.ts:3", "shortDescription": {"text": "Commented-code block (7 lines) in lib/bank/aliases.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-7955c1c50395a3ff", "name": "Commented-code block (5 lines) in lib/bank/match.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in lib/bank/match.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-e7dad5a6186ba12c", "name": "Commented-code block (5 lines) in lib/asistente/types.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in lib/asistente/types.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-3482f7e5dd70cd1a", "name": "6 env vars used in code but missing from .env.example", "shortDescription": {"text": "6 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `CC_EMAIL`, `CRM_FROM_EMAIL`, `CRON_SECRET`, `DRY_RUN`, `NEXT_PUBLIC_APP_URL`, `RECORDATORIO_CC_EMAIL`. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/20983"}, "properties": {"repository": "teravinointelligence/Crm", "repoUrl": "https://github.com/teravinointelligence/Crm", "branch": "main"}, "results": [{"ruleId": "scanner-bead75b0f9233e05", "level": "none", "message": {"text": "No API endpoints detected"}, "properties": {"repobilityId": "0f8bb852027c38f8", "scanner": "scanner-primary", "fingerprint": "bead75b0f9233e05", "layer": "api", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-18022a7f99eb513b", "level": "note", "message": {"text": "\"active\" state uses light bg in a dark theme \u2014 components/layout/Sidebar.tsx:70"}, "properties": {"repobilityId": "f0022fb3f763f4ad", "scanner": "scanner-primary", "fingerprint": "18022a7f99eb513b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.active-light-bg"]}}, {"ruleId": "scanner-75f3cdc2b05a2dd6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/layout/Header.tsx:29"}, "properties": {"repobilityId": "4cd25789f9e17d12", "scanner": "scanner-primary", "fingerprint": "75f3cdc2b05a2dd6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4546d91150aa1d2f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/academy/StudyCatalogClient.tsx:153"}, "properties": {"repobilityId": "af935320ea6c7e6f", "scanner": "scanner-primary", "fingerprint": "4546d91150aa1d2f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0791ec6d84b58762", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/ActivityCalendar.tsx:317"}, "properties": {"repobilityId": "2843b9174403ccf2", "scanner": "scanner-primary", "fingerprint": "0791ec6d84b58762", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-52bf24d85584e28c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/accounts/AccountCombobox.tsx:127"}, "properties": {"repobilityId": "1f3be421d3ec86ff", "scanner": "scanner-primary", "fingerprint": "52bf24d85584e28c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8c8e48767b62f175", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/activities/CalendarMonth.tsx:122"}, "properties": {"repobilityId": "7837ffe36273d0c3", "scanner": "scanner-primary", "fingerprint": "8c8e48767b62f175", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-35004d4152a2a6a1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/incentivos/BogleAdmin.tsx:203"}, "properties": {"repobilityId": "4125af3a3056b9cf", "scanner": "scanner-primary", "fingerprint": "35004d4152a2a6a1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ea62e5d579c1e590", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/incentivos/VendorIncentives.tsx:332"}, "properties": {"repobilityId": "1aaa72f2c240726b", "scanner": "scanner-primary", "fingerprint": "ea62e5d579c1e590", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-857c1aa89c6e9d3a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/incentivos/BogleVendor.tsx:203"}, "properties": {"repobilityId": "61b02d964ca80b42", "scanner": "scanner-primary", "fingerprint": "857c1aa89c6e9d3a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f964a1963e4c1004", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/reparto/KanbanRutas.tsx:260"}, "properties": {"repobilityId": "617d1d48cc0300ab", "scanner": "scanner-primary", "fingerprint": "f964a1963e4c1004", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-663db26568bc186f", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/cartera/CobranzaEmails.tsx:318"}, "properties": {"repobilityId": "e0c23b9aa257ae35", "scanner": "scanner-primary", "fingerprint": "663db26568bc186f", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-12f7c17ff715d643", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/samples/SampleRequestForm.tsx:328"}, "properties": {"repobilityId": "1bb86f96033dfcef", "scanner": "scanner-primary", "fingerprint": "12f7c17ff715d643", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f2d48e2964cf86aa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/samples/AddCitasToSample.tsx:108"}, "properties": {"repobilityId": "8e947ad4b19aa84b", "scanner": "scanner-primary", "fingerprint": "f2d48e2964cf86aa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e3ad6f3f0196ba57", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/equipo/EquipoBoard.tsx:124"}, "properties": {"repobilityId": "7b9b03bc6fe548e7", "scanner": "scanner-primary", "fingerprint": "e3ad6f3f0196ba57", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fcff26f42f0579f1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/page.tsx:573"}, "properties": {"repobilityId": "45b34a9c593150a1", "scanner": "scanner-primary", "fingerprint": "fcff26f42f0579f1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-93bd1a951ee49797", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/academy/page.tsx:192"}, "properties": {"repobilityId": "0dac3327575ac560", "scanner": "scanner-primary", "fingerprint": "93bd1a951ee49797", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-939e27b6be107cf1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/cuentas/[id]/page.tsx:325"}, "properties": {"repobilityId": "de0fce827553f930", "scanner": "scanner-primary", "fingerprint": "939e27b6be107cf1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-47e0ff5f911b7110", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in components/cartera/CobranzaEmails.tsx:318"}, "properties": {"repobilityId": "562e2f968cfe3733", "scanner": "scanner-primary", "fingerprint": "47e0ff5f911b7110", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "components/cartera/CobranzaEmails.tsx"}, "region": {"startLine": 318}}}]}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-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": "400c27858bf82a03", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "96d994ef7d76bea6", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "7f7f9ab96e0cb88f", "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": "583cca8a66a8bca2", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "0f7c6e6550b0007c", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "5f8e3deac317a260", "scanner": "scanner-primary", "fingerprint": "ea8f3013f588db25", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-8424db9c75e04ba4", "level": "none", "message": {"text": "Very short observed git history"}, "properties": {"repobilityId": "3f170cfddc15ec2b", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-e332d22920f08fe7", "level": "note", "message": {"text": "Legacy-named symbol `is_legacy` in types/database.ts:28"}, "properties": {"repobilityId": "70d201482ede03e7", "scanner": "scanner-primary", "fingerprint": "e332d22920f08fe7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b342eec126eb993d", "level": "none", "message": {"text": "Commented-code block (7 lines) in scripts/recordatorio-contactos-vendedores.mjs:18"}, "properties": {"repobilityId": "33e3c4c9aa92a49e", "scanner": "scanner-primary", "fingerprint": "b342eec126eb993d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e7802fbe98cb5776", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/gen-plantilla-ventas.mjs:4"}, "properties": {"repobilityId": "d333a19985b8526c", "scanner": "scanner-primary", "fingerprint": "e7802fbe98cb5776", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3510f5b91b8da198", "level": "none", "message": {"text": "Commented-code block (13 lines) in scripts/verify-incentivos-gb.mjs:6"}, "properties": {"repobilityId": "9c939efec6a1971c", "scanner": "scanner-primary", "fingerprint": "3510f5b91b8da198", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-668552c64b3b5403", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/migrate-reparto.mjs:10"}, "properties": {"repobilityId": "eb5fecbe25ecf8f8", "scanner": "scanner-primary", "fingerprint": "668552c64b3b5403", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0506c09882f01856", "level": "none", "message": {"text": "Commented-code block (8 lines) in scripts/snapshot-gb.mjs:1"}, "properties": {"repobilityId": "c514f85cb123ae51", "scanner": "scanner-primary", "fingerprint": "0506c09882f01856", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-df5d362b9d9c5b63", "level": "none", "message": {"text": "Commented-code block (6 lines) in components/ventas/ImportVentasClient.tsx:3"}, "properties": {"repobilityId": "dd6b1a241e123cd6", "scanner": "scanner-primary", "fingerprint": "df5d362b9d9c5b63", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-48aad400dfd0181b", "level": "none", "message": {"text": "Commented-code block (6 lines) in components/dashboard/ActivityCalendar.tsx:3"}, "properties": {"repobilityId": "5e39f4a4ee0a5783", "scanner": "scanner-primary", "fingerprint": "48aad400dfd0181b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4d6b2807256f80b3", "level": "note", "message": {"text": "Legacy-named symbol `is_legacy` in components/accounts/AccountForm.tsx:85"}, "properties": {"repobilityId": "fa01749590489280", "scanner": "scanner-primary", "fingerprint": "4d6b2807256f80b3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-daf3bb7c8bd36759", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/usuarios/UsuariosClient.tsx:57"}, "properties": {"repobilityId": "a5b900c26d2672f9", "scanner": "scanner-primary", "fingerprint": "daf3bb7c8bd36759", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3440dae0df740281", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/reparto/KanbanRutas.tsx:67"}, "properties": {"repobilityId": "ea4b44a1a81075b7", "scanner": "scanner-primary", "fingerprint": "3440dae0df740281", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c40663224f325fd4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/reparto/UploadCFDI.tsx:51"}, "properties": {"repobilityId": "60235aad6e0d945f", "scanner": "scanner-primary", "fingerprint": "c40663224f325fd4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-aa010d1c8e14b4c5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/reparto/ChoferesAdmin.tsx:82"}, "properties": {"repobilityId": "6f0579aa73a0214e", "scanner": "scanner-primary", "fingerprint": "aa010d1c8e14b4c5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-76a5f804f42471fe", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/reparto/PedidoActions.tsx:56"}, "properties": {"repobilityId": "bf3350b8fbac5b86", "scanner": "scanner-primary", "fingerprint": "76a5f804f42471fe", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1024de9e094ef904", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/reparto/PedidoForm.tsx:109"}, "properties": {"repobilityId": "6cd13b2f4b4cca56", "scanner": "scanner-primary", "fingerprint": "1024de9e094ef904", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-abbcd5fbc8f8dbaf", "level": "note", "message": {"text": "Legacy-named symbol `isLegacy` in components/cartera/RiesgoBadge.tsx:7"}, "properties": {"repobilityId": "46ca72224eacda81", "scanner": "scanner-primary", "fingerprint": "abbcd5fbc8f8dbaf", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d48486684198c9b6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/cartera/conciliacion/ReconcileConfirmDialog.tsx:183"}, "properties": {"repobilityId": "280467adb7f4a256", "scanner": "scanner-primary", "fingerprint": "d48486684198c9b6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e85bffdedbf20e77", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/consignaciones/ConsignacionForm.tsx:152"}, "properties": {"repobilityId": "9900db027b31d4fe", "scanner": "scanner-primary", "fingerprint": "e85bffdedbf20e77", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8b1039778e0eb74f", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/consignaciones/ConsignacionActions.tsx:3"}, "properties": {"repobilityId": "cad64128922a327b", "scanner": "scanner-primary", "fingerprint": "8b1039778e0eb74f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8a6ae0a2096fff8f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/consignaciones/RetiroDialog.tsx:94"}, "properties": {"repobilityId": "3be397a56422a68c", "scanner": "scanner-primary", "fingerprint": "8a6ae0a2096fff8f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2daafd4c74cd4421", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/consignaciones/ReposicionDialog.tsx:92"}, "properties": {"repobilityId": "51d92c1f86b4066b", "scanner": "scanner-primary", "fingerprint": "2daafd4c74cd4421", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-14309b01bba5cf5d", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/activities/calendar/route.ts:5"}, "properties": {"repobilityId": "8b6aea0235c46acd", "scanner": "scanner-primary", "fingerprint": "14309b01bba5cf5d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6a6a734ab3271bca", "level": "none", "message": {"text": "Commented-code block (8 lines) in app/api/cron/clientes-inactivos/route.ts:1"}, "properties": {"repobilityId": "68b3b64067118de6", "scanner": "scanner-primary", "fingerprint": "6a6a734ab3271bca", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4882b8ccb9240e21", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/reparto/diag/route.ts:1"}, "properties": {"repobilityId": "fe47299840df69ca", "scanner": "scanner-primary", "fingerprint": "4882b8ccb9240e21", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-77759ddc1f7b6380", "level": "none", "message": {"text": "Commented-code block (7 lines) in app/api/reparto/pedidos/[id]/entregar/route.ts:1"}, "properties": {"repobilityId": "56cf02f2539ed44c", "scanner": "scanner-primary", "fingerprint": "77759ddc1f7b6380", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c4025b0a275f2855", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/cuentas/[id]/next-best-action/route.ts:1"}, "properties": {"repobilityId": "f89e13b82c28d035", "scanner": "scanner-primary", "fingerprint": "c4025b0a275f2855", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dd613b7e7def787c", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/recordatorios/contactos-vendedores/route.ts:3"}, "properties": {"repobilityId": "3facb41c28f9532e", "scanner": "scanner-primary", "fingerprint": "dd613b7e7def787c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b5d9d651eb52c5a3", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/api/cartera/conciliacion/[statementId]/match/route.ts:1"}, "properties": {"repobilityId": "2b8e66f6801ac5b5", "scanner": "scanner-primary", "fingerprint": "b5d9d651eb52c5a3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4c856ce5730570c2", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/cartera/conciliacion/[statementId]/confirm/route.ts:1"}, "properties": {"repobilityId": "b05a9bfa65bb817e", "scanner": "scanner-primary", "fingerprint": "4c856ce5730570c2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-027dab7c25ae5843", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/api/cartera/[accountId]/cobranza/registrar/route.ts:7"}, "properties": {"repobilityId": "44b2878587db7a01", "scanner": "scanner-primary", "fingerprint": "027dab7c25ae5843", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9af3ee416dd5f1e5", "level": "note", "message": {"text": "Legacy-named symbol `is_legacy` in app/api/cartera/[accountId]/pdf/route.ts:21"}, "properties": {"repobilityId": "d55c3d0a6e4ef430", "scanner": "scanner-primary", "fingerprint": "9af3ee416dd5f1e5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-c6125de12431e0ac", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/samples/[id]/enviar/route.ts:3"}, "properties": {"repobilityId": "4b164ce436460a83", "scanner": "scanner-primary", "fingerprint": "c6125de12431e0ac", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8c4f7bec9d63b612", "level": "none", "message": {"text": "Commented-code block (7 lines) in app/api/consignaciones/tomas/[id]/vincular/route.ts:7"}, "properties": {"repobilityId": "da78167504d081a8", "scanner": "scanner-primary", "fingerprint": "8c4f7bec9d63b612", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-81d21dbec0239278", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/consignaciones/[id]/retiro/route.ts:58"}, "properties": {"repobilityId": "f989ef8e79b1b85a", "scanner": "scanner-primary", "fingerprint": "81d21dbec0239278", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e28580602ebec8da", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/(app)/ventas/conciliacion/page.tsx:1"}, "properties": {"repobilityId": "22e53e4af8a9f153", "scanner": "scanner-primary", "fingerprint": "e28580602ebec8da", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-68d90ec2e880a6de", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/(app)/reportes/page.tsx:1"}, "properties": {"repobilityId": "4f62730672397ae8", "scanner": "scanner-primary", "fingerprint": "68d90ec2e880a6de", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-37f89f3fd4f91e11", "level": "note", "message": {"text": "Legacy-named symbol `is_legacy` in app/(app)/reparto/credito/page.tsx:29"}, "properties": {"repobilityId": "f4e9755cd702541a", "scanner": "scanner-primary", "fingerprint": "37f89f3fd4f91e11", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-2806a402c8bfd3f8", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/(app)/reparto/credito/page.tsx:1"}, "properties": {"repobilityId": "afcaedd07de06714", "scanner": "scanner-primary", "fingerprint": "2806a402c8bfd3f8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8943354f1a952ff6", "level": "note", "message": {"text": "Legacy-named symbol `is_legacy` in app/(app)/cartera/[accountId]/page.tsx:42"}, "properties": {"repobilityId": "f79760b2d3d28957", "scanner": "scanner-primary", "fingerprint": "8943354f1a952ff6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-adfecbdc0f8d5d5e", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/(app)/consignaciones/tomas/page.tsx:1"}, "properties": {"repobilityId": "298c9c5d647c23a9", "scanner": "scanner-primary", "fingerprint": "adfecbdc0f8d5d5e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-35c788d7c827d1f7", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/muestra-email.ts:1"}, "properties": {"repobilityId": "239025e2b13e5d52", "scanner": "scanner-primary", "fingerprint": "35c788d7c827d1f7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5adfd23c7f0cfd2a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/email.ts:53"}, "properties": {"repobilityId": "b8fa4572f4eb3207", "scanner": "scanner-primary", "fingerprint": "5adfd23c7f0cfd2a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9b2c1cb6b9e645b7", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/incentivos.ts:109"}, "properties": {"repobilityId": "6812993b10ea7e5c", "scanner": "scanner-primary", "fingerprint": "9b2c1cb6b9e645b7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-942a43d94053ad17", "level": "note", "message": {"text": "Legacy-named symbol `isLegacy` in lib/cobranza.ts:67"}, "properties": {"repobilityId": "c314eeec36f4ca20", "scanner": "scanner-primary", "fingerprint": "942a43d94053ad17", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ce32e26870622a6b", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/cobranza.ts:3"}, "properties": {"repobilityId": "6e04a2b4e9f16792", "scanner": "scanner-primary", "fingerprint": "ce32e26870622a6b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7e3421cac82a1240", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/base44-docs.ts:4"}, "properties": {"repobilityId": "b9d8db0d7636ca01", "scanner": "scanner-primary", "fingerprint": "7e3421cac82a1240", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d809a32a79e9f48e", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/restock.ts:5"}, "properties": {"repobilityId": "40f03451e9ba2af5", "scanner": "scanner-primary", "fingerprint": "d809a32a79e9f48e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1f0e67ce65d18ee6", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/base44-flota.ts:4"}, "properties": {"repobilityId": "9e6926d4d81fa87e", "scanner": "scanner-primary", "fingerprint": "1f0e67ce65d18ee6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8aa70c03f1c6008c", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/supabase-reparto.ts:3"}, "properties": {"repobilityId": "5913a382e7c3812f", "scanner": "scanner-primary", "fingerprint": "8aa70c03f1c6008c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4e0765e44ec215b2", "level": "none", "message": {"text": "Commented-code block (6 lines) in lib/contpaq-map.ts:4"}, "properties": {"repobilityId": "65f16f14a7356244", "scanner": "scanner-primary", "fingerprint": "4e0765e44ec215b2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-27b3d71dcf5fe920", "level": "none", "message": {"text": "Commented-code block (6 lines) in lib/anthropic.ts:270"}, "properties": {"repobilityId": "d7038edfbb8f5de7", "scanner": "scanner-primary", "fingerprint": "27b3d71dcf5fe920", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7c66955f5e07f8b3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/anthropic.ts:41"}, "properties": {"repobilityId": "a6fc3bae483d2e99", "scanner": "scanner-primary", "fingerprint": "7c66955f5e07f8b3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4b6368202b4f622f", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/excel/parseClientesFiscal.ts:4"}, "properties": {"repobilityId": "fa45e8c552ecc6d0", "scanner": "scanner-primary", "fingerprint": "4b6368202b4f622f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c40ce4d083c796a5", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/excel/parseContpaqCodigos.ts:4"}, "properties": {"repobilityId": "f43d74ec2b7fc2ac", "scanner": "scanner-primary", "fingerprint": "c40ce4d083c796a5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dbf1f7c5d4db0cae", "level": "none", "message": {"text": "Commented-code block (7 lines) in lib/bank/aliases.ts:3"}, "properties": {"repobilityId": "209bffb59f2dcd77", "scanner": "scanner-primary", "fingerprint": "dbf1f7c5d4db0cae", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7955c1c50395a3ff", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/bank/match.ts:1"}, "properties": {"repobilityId": "71eb60e07ed1a142", "scanner": "scanner-primary", "fingerprint": "7955c1c50395a3ff", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e7dad5a6186ba12c", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/asistente/types.ts:1"}, "properties": {"repobilityId": "75b677985ab7f001", "scanner": "scanner-primary", "fingerprint": "e7dad5a6186ba12c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3482f7e5dd70cd1a", "level": "note", "message": {"text": "6 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "1da70f25aa46f6e9", "scanner": "scanner-primary", "fingerprint": "3482f7e5dd70cd1a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}]}]}