{"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-eeabcce03b8e2976", "name": "Stray `console.log` in TS/JS \u2014 scripts/backfill-contact-names.ts:49", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-contact-names.ts:49"}, "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-e7b1164109117df6", "name": "Stray `console.log` in TS/JS \u2014 scripts/fix-corrupted-emojis.ts:33", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/fix-corrupted-emojis.ts:33"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e3bbed7b620ef4a6", "name": "Stray `console.log` in TS/JS \u2014 scripts/diagnose-contact-names.ts:39", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diagnose-contact-names.ts:39"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8e63f97dd0cf4b6b", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-bot-decision.ts:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-bot-decision.ts:12"}, "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-d6a2e1b043553e48", "name": "Stray `console.log` in TS/JS \u2014 scripts/sync-name-to-casino-username.ts:26", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/sync-name-to-casino-username.ts:26"}, "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-ca3e5ec1915135bc", "name": "Icon-only button without accessible name \u2014 src/components/ChatWindow.tsx:976", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/ChatWindow.tsx:976"}, "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-3b1027c183a70c47", "name": "Icon-only button without accessible name \u2014 src/components/OnboardingWizard.tsx:142", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/OnboardingWizard.tsx:142"}, "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-7e3afb48fefae76f", "name": "Icon-only button without accessible name \u2014 src/components/TenantsClient.tsx:191", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/TenantsClient.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-421bca70af7dabd7", "name": "Stray `console.log` in TS/JS \u2014 src/components/PWARegister.tsx:56", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/PWARegister.tsx:56"}, "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-ab77a994a1377be0", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/settings/bot-enabled/route.ts:31", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/settings/bot-enabled/route.ts:31"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1448419d91a5c352", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/settings/offline-mode/route.ts:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/settings/offline-mode/route.ts:32"}, "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-8de441ae49d1ce6c", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/webhook/route.ts:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/webhook/route.ts:32"}, "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-871254afaef91d4b", "name": "Stray `console.log` in TS/JS \u2014 src/lib/push.ts:33", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/push.ts:33"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f72166576c41bdb6", "name": "Stray `console.log` in TS/JS \u2014 src/lib/meta/client.ts:124", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/meta/client.ts:124"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5b47c1fa58180f65", "name": "Stray `console.log` in TS/JS \u2014 src/lib/meta/handler.ts:133", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/meta/handler.ts:133"}, "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-bd0b609f0cb993e0", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/components/ComprobantesClient.tsx:514", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/ComprobantesClient.tsx:514"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ab5ffe7619e3a4ce", "name": "Insecure pattern 'node_child_process' in src/lib/audio/toOggOpus.ts:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in src/lib/audio/toOggOpus.ts:1"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). 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-b92cb331c9e00754", "name": "Very large file: src/components/ChatWindow.tsx (1173 lines)", "shortDescription": {"text": "Very large file: src/components/ChatWindow.tsx (1173 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-eb76c5b1c8c659f1", "name": "Very large file: src/app/api/iris-ai/route.ts (1172 lines)", "shortDescription": {"text": "Very large file: src/app/api/iris-ai/route.ts (1172 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": "1 test file(s) for 149 source file(s) (ratio 0.01). 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 96 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 67 placeholder/mock markers across 24 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-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-b9d2815b72dee3ff", "name": "Commented-code block (8 lines) in src/middleware.ts:20", "shortDescription": {"text": "Commented-code block (8 lines) in src/middleware.ts:20"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-893f8a8c93fca46a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/DashboardClient.tsx:183", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/DashboardClient.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-49c4961fed77185b", "name": "Commented-code block (6 lines) in src/components/CajaResumen.tsx:6", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/CajaResumen.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-08f8d74de9b32736", "name": "Commented-code block (5 lines) in src/components/ChatWindow.tsx:681", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/ChatWindow.tsx:681"}, "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-cef21ad3828f0f27", "name": "Commented-code block (5 lines) in src/components/ActivityGuard.tsx:6", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/ActivityGuard.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-f22ded8533f60718", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/ContactsClient.tsx:109", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/ContactsClient.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-deb4eef6089d425a", "name": "Commented-code block (7 lines) in src/components/OnboardingWizard.tsx:6", "shortDescription": {"text": "Commented-code block (7 lines) in src/components/OnboardingWizard.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-64678bc2029e5ae8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/CampanasClient.tsx:118", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/CampanasClient.tsx:118"}, "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-de1dbc406c0110e5", "name": "Commented-code block (6 lines) in src/components/ProfileCard.tsx:7", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/ProfileCard.tsx: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-2bb4a2e56dfc5af6", "name": "Commented-code block (5 lines) in src/components/AdminShell.tsx:35", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/AdminShell.tsx: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-7b2c2a6956c1a1f9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/ComprobantesClient.tsx:143", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/ComprobantesClient.tsx:143"}, "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-5355a802238fc830", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/QuickRepliesManager.tsx:17", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/QuickRepliesManager.tsx:17"}, "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-d831134add67265d", "name": "Commented-code block (9 lines) in src/components/IrisChat.tsx:5", "shortDescription": {"text": "Commented-code block (9 lines) in src/components/IrisChat.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-54266b60abf69a22", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/ContactHeader.tsx:117", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/ContactHeader.tsx:117"}, "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-65f2d9380d7366f1", "name": "Commented-code block (5 lines) in src/components/FichasClient.tsx:5", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/FichasClient.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-6d3811ad33cc0415", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/PWARegister.tsx:91", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/PWARegister.tsx:91"}, "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-1cacc7b471a15ae8", "name": "Commented-code block (5 lines) in src/app/api/comprobantes/route.ts:94", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/comprobantes/route.ts: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-9923a46d8e9cef10", "name": "Commented-code block (5 lines) in src/app/api/comprobantes/pago-manual/route.ts:6", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/comprobantes/pago-manual/route.ts:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b195371ad1f913eb", "name": "Commented-code block (6 lines) in src/app/api/tenants/[id]/route.ts:11", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/tenants/[id]/route.ts:11"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0581677048e75517", "name": "Commented-code block (7 lines) in src/app/api/admin/services/anthropic-balance/route.ts:6", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/api/admin/services/anthropic-balance/route.ts:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7b21dcf62ff08490", "name": "Commented-code block (5 lines) in src/app/api/agents/[id]/route.ts:7", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/agents/[id]/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-d7f4bf2415765038", "name": "Commented-code block (5 lines) in src/app/api/messages/route.ts:50", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/messages/route.ts:50"}, "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-108207468528845d", "name": "Commented-code block (5 lines) in src/app/api/unread_counts/route.ts:6", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/unread_counts/route.ts:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-916a1eee47a0239c", "name": "Commented-code block (5 lines) in src/lib/contact-status.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/contact-status.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-f2041e96753a28d2", "name": "Commented-code block (5 lines) in src/lib/onboarding.ts:8", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/onboarding.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-9ca5fa344bfd3e34", "name": "Commented-code block (6 lines) in src/lib/activity-log.ts:4", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/activity-log.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-c66d5c81bbbadb69", "name": "Commented-code block (5 lines) in src/lib/caja.ts:8", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/caja.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-4910277051ad35ab", "name": "Commented-code block (5 lines) in src/lib/ratelimit.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/ratelimit.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-a7b92c28c04426a5", "name": "Commented-code block (11 lines) in src/lib/pending.ts:4", "shortDescription": {"text": "Commented-code block (11 lines) in src/lib/pending.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-fad3d0b3817933fd", "name": "Commented-code block (5 lines) in src/lib/notify-sound.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/notify-sound.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-5e27ba729238f0f0", "name": "Commented-code block (5 lines) in src/lib/bot-config.ts:41", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/bot-config.ts:41"}, "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-26abb7edd7ebbb2b", "name": "Commented-code block (8 lines) in src/lib/meta/client.ts:25", "shortDescription": {"text": "Commented-code block (8 lines) in src/lib/meta/client.ts:25"}, "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-6aa133ed6083d21e", "name": "Commented-code block (5 lines) in src/lib/meta/handler.ts:15", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/meta/handler.ts:15"}, "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-8e047ab7af03962f", "name": "7 env vars used in code but missing from .env.example", "shortDescription": {"text": "7 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `NEXT_PUBLIC_VAPID_PUBLIC_KEY`, `NODE_ENV`, `VAPID_PRIVATE_KEY`, `VAPID_SUBJECT`, `VERCEL_GIT_COMMIT_SHA`, `WHATSAPP_APP_SECRET`, `WHATSAPP_WABA_ID`. 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/18173"}, "properties": {"repository": "riobarber242/iris-crm", "repoUrl": "https://github.com/riobarber242/iris-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-eeabcce03b8e2976", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-contact-names.ts:49"}, "properties": {"repobilityId": "5953d6a24dc06fea", "scanner": "scanner-primary", "fingerprint": "eeabcce03b8e2976", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e7b1164109117df6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/fix-corrupted-emojis.ts:33"}, "properties": {"repobilityId": "43d50900db4e99b9", "scanner": "scanner-primary", "fingerprint": "e7b1164109117df6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e3bbed7b620ef4a6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diagnose-contact-names.ts:39"}, "properties": {"repobilityId": "21f86704197298d3", "scanner": "scanner-primary", "fingerprint": "e3bbed7b620ef4a6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8e63f97dd0cf4b6b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-bot-decision.ts:12"}, "properties": {"repobilityId": "724f5fbec49c3289", "scanner": "scanner-primary", "fingerprint": "8e63f97dd0cf4b6b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d6a2e1b043553e48", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/sync-name-to-casino-username.ts:26"}, "properties": {"repobilityId": "15ccc40d4a993c4e", "scanner": "scanner-primary", "fingerprint": "d6a2e1b043553e48", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ca3e5ec1915135bc", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/ChatWindow.tsx:976"}, "properties": {"repobilityId": "45b34aa06d9f3c08", "scanner": "scanner-primary", "fingerprint": "ca3e5ec1915135bc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-3b1027c183a70c47", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/OnboardingWizard.tsx:142"}, "properties": {"repobilityId": "9a28f935f8b08ec2", "scanner": "scanner-primary", "fingerprint": "3b1027c183a70c47", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-7e3afb48fefae76f", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/TenantsClient.tsx:191"}, "properties": {"repobilityId": "01948a0b2b479d9b", "scanner": "scanner-primary", "fingerprint": "7e3afb48fefae76f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-421bca70af7dabd7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/PWARegister.tsx:56"}, "properties": {"repobilityId": "7226f3eb4579f990", "scanner": "scanner-primary", "fingerprint": "421bca70af7dabd7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ab77a994a1377be0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/settings/bot-enabled/route.ts:31"}, "properties": {"repobilityId": "57536af322046fa3", "scanner": "scanner-primary", "fingerprint": "ab77a994a1377be0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1448419d91a5c352", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/settings/offline-mode/route.ts:32"}, "properties": {"repobilityId": "373c01d6ef16fc11", "scanner": "scanner-primary", "fingerprint": "1448419d91a5c352", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8de441ae49d1ce6c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/webhook/route.ts:32"}, "properties": {"repobilityId": "846c6f4c7ef42c35", "scanner": "scanner-primary", "fingerprint": "8de441ae49d1ce6c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-871254afaef91d4b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/push.ts:33"}, "properties": {"repobilityId": "19b6e12b6bf7139c", "scanner": "scanner-primary", "fingerprint": "871254afaef91d4b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f72166576c41bdb6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/meta/client.ts:124"}, "properties": {"repobilityId": "becbcda0734f4ad1", "scanner": "scanner-primary", "fingerprint": "f72166576c41bdb6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5b47c1fa58180f65", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/meta/handler.ts:133"}, "properties": {"repobilityId": "95c639003da84384", "scanner": "scanner-primary", "fingerprint": "5b47c1fa58180f65", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bd0b609f0cb993e0", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/ComprobantesClient.tsx:514"}, "properties": {"repobilityId": "37c8de975362eb87", "scanner": "scanner-primary", "fingerprint": "bd0b609f0cb993e0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/ComprobantesClient.tsx"}, "region": {"startLine": 514}}}]}, {"ruleId": "scanner-ab5ffe7619e3a4ce", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in src/lib/audio/toOggOpus.ts:1"}, "properties": {"repobilityId": "6242d532120db30e", "scanner": "scanner-primary", "fingerprint": "ab5ffe7619e3a4ce", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/audio/toOggOpus.ts"}, "region": {"startLine": 1}}}]}, {"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-b92cb331c9e00754", "level": "note", "message": {"text": "Very large file: src/components/ChatWindow.tsx (1173 lines)"}, "properties": {"repobilityId": "10e5b421941ba7ec", "scanner": "scanner-primary", "fingerprint": "b92cb331c9e00754", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-eb76c5b1c8c659f1", "level": "note", "message": {"text": "Very large file: src/app/api/iris-ai/route.ts (1172 lines)"}, "properties": {"repobilityId": "89e320a61f36f4e6", "scanner": "scanner-primary", "fingerprint": "eb76c5b1c8c659f1", "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": "b6d81bc293f61c1f", "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": "d8dacea2fcab1d0b", "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": "a68068bdb2cbd3f5", "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": "ab0e5118dd2f7b57", "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": "1b64288257a1c8eb", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "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": "95513c27e5f62994", "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": "18a2734ef9473da9", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9d2815b72dee3ff", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/middleware.ts:20"}, "properties": {"repobilityId": "86e368e81d20e8de", "scanner": "scanner-primary", "fingerprint": "b9d2815b72dee3ff", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-893f8a8c93fca46a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/DashboardClient.tsx:183"}, "properties": {"repobilityId": "d820067f24c1948b", "scanner": "scanner-primary", "fingerprint": "893f8a8c93fca46a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-49c4961fed77185b", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/CajaResumen.tsx:6"}, "properties": {"repobilityId": "fa029bd6fe7b317f", "scanner": "scanner-primary", "fingerprint": "49c4961fed77185b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-08f8d74de9b32736", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/ChatWindow.tsx:681"}, "properties": {"repobilityId": "8d5f1946d4644d16", "scanner": "scanner-primary", "fingerprint": "08f8d74de9b32736", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cef21ad3828f0f27", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/ActivityGuard.tsx:6"}, "properties": {"repobilityId": "c3bb317fc297dd08", "scanner": "scanner-primary", "fingerprint": "cef21ad3828f0f27", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f22ded8533f60718", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/ContactsClient.tsx:109"}, "properties": {"repobilityId": "f9ee452be69966a4", "scanner": "scanner-primary", "fingerprint": "f22ded8533f60718", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-deb4eef6089d425a", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/components/OnboardingWizard.tsx:6"}, "properties": {"repobilityId": "08b0d5a99910b3d9", "scanner": "scanner-primary", "fingerprint": "deb4eef6089d425a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-64678bc2029e5ae8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/CampanasClient.tsx:118"}, "properties": {"repobilityId": "6eddd8b8748a15f0", "scanner": "scanner-primary", "fingerprint": "64678bc2029e5ae8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-de1dbc406c0110e5", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/ProfileCard.tsx:7"}, "properties": {"repobilityId": "297b290f8d88aa90", "scanner": "scanner-primary", "fingerprint": "de1dbc406c0110e5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2bb4a2e56dfc5af6", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/AdminShell.tsx:35"}, "properties": {"repobilityId": "c9f43894b4207eb6", "scanner": "scanner-primary", "fingerprint": "2bb4a2e56dfc5af6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7b2c2a6956c1a1f9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/ComprobantesClient.tsx:143"}, "properties": {"repobilityId": "15bcbb59a9b295de", "scanner": "scanner-primary", "fingerprint": "7b2c2a6956c1a1f9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5355a802238fc830", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/QuickRepliesManager.tsx:17"}, "properties": {"repobilityId": "55f6ac7a81f736a8", "scanner": "scanner-primary", "fingerprint": "5355a802238fc830", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d831134add67265d", "level": "none", "message": {"text": "Commented-code block (9 lines) in src/components/IrisChat.tsx:5"}, "properties": {"repobilityId": "e59e5c03a31795f6", "scanner": "scanner-primary", "fingerprint": "d831134add67265d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-54266b60abf69a22", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/ContactHeader.tsx:117"}, "properties": {"repobilityId": "7bcb0b28f7da545f", "scanner": "scanner-primary", "fingerprint": "54266b60abf69a22", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-65f2d9380d7366f1", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/FichasClient.tsx:5"}, "properties": {"repobilityId": "08fd8fcea432823a", "scanner": "scanner-primary", "fingerprint": "65f2d9380d7366f1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6d3811ad33cc0415", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/PWARegister.tsx:91"}, "properties": {"repobilityId": "b94caff39c0f1a7d", "scanner": "scanner-primary", "fingerprint": "6d3811ad33cc0415", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1cacc7b471a15ae8", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/comprobantes/route.ts:94"}, "properties": {"repobilityId": "bde9ba9905bff0be", "scanner": "scanner-primary", "fingerprint": "1cacc7b471a15ae8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9923a46d8e9cef10", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/comprobantes/pago-manual/route.ts:6"}, "properties": {"repobilityId": "88ac87563d8bdda0", "scanner": "scanner-primary", "fingerprint": "9923a46d8e9cef10", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b195371ad1f913eb", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/tenants/[id]/route.ts:11"}, "properties": {"repobilityId": "43bafc53a81bae41", "scanner": "scanner-primary", "fingerprint": "b195371ad1f913eb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0581677048e75517", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/api/admin/services/anthropic-balance/route.ts:6"}, "properties": {"repobilityId": "c2f94c7136a194fb", "scanner": "scanner-primary", "fingerprint": "0581677048e75517", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7b21dcf62ff08490", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/agents/[id]/route.ts:7"}, "properties": {"repobilityId": "ccf25cd49179023c", "scanner": "scanner-primary", "fingerprint": "7b21dcf62ff08490", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d7f4bf2415765038", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/messages/route.ts:50"}, "properties": {"repobilityId": "67f6ebf6a7cbb877", "scanner": "scanner-primary", "fingerprint": "d7f4bf2415765038", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-108207468528845d", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/unread_counts/route.ts:6"}, "properties": {"repobilityId": "4e514f572bb5b909", "scanner": "scanner-primary", "fingerprint": "108207468528845d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-916a1eee47a0239c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/contact-status.ts:3"}, "properties": {"repobilityId": "f94c1ca2653872f4", "scanner": "scanner-primary", "fingerprint": "916a1eee47a0239c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f2041e96753a28d2", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/onboarding.ts:8"}, "properties": {"repobilityId": "e1784c8d6eafdfd8", "scanner": "scanner-primary", "fingerprint": "f2041e96753a28d2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9ca5fa344bfd3e34", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/activity-log.ts:4"}, "properties": {"repobilityId": "6e553efa4b58ed9f", "scanner": "scanner-primary", "fingerprint": "9ca5fa344bfd3e34", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c66d5c81bbbadb69", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/caja.ts:8"}, "properties": {"repobilityId": "b432268e537d21dc", "scanner": "scanner-primary", "fingerprint": "c66d5c81bbbadb69", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4910277051ad35ab", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/ratelimit.ts:5"}, "properties": {"repobilityId": "31efde2351233d1f", "scanner": "scanner-primary", "fingerprint": "4910277051ad35ab", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a7b92c28c04426a5", "level": "none", "message": {"text": "Commented-code block (11 lines) in src/lib/pending.ts:4"}, "properties": {"repobilityId": "e3c3e4b4a07891ef", "scanner": "scanner-primary", "fingerprint": "a7b92c28c04426a5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fad3d0b3817933fd", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/notify-sound.ts:3"}, "properties": {"repobilityId": "e141cdff06394bcc", "scanner": "scanner-primary", "fingerprint": "fad3d0b3817933fd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5e27ba729238f0f0", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/bot-config.ts:41"}, "properties": {"repobilityId": "a1d29bb9e665ed6b", "scanner": "scanner-primary", "fingerprint": "5e27ba729238f0f0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-26abb7edd7ebbb2b", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/lib/meta/client.ts:25"}, "properties": {"repobilityId": "3df2a8e34b18188e", "scanner": "scanner-primary", "fingerprint": "26abb7edd7ebbb2b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6aa133ed6083d21e", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/meta/handler.ts:15"}, "properties": {"repobilityId": "9073a69fcfc32adf", "scanner": "scanner-primary", "fingerprint": "6aa133ed6083d21e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8e047ab7af03962f", "level": "note", "message": {"text": "7 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "5a0455f6498c27ad", "scanner": "scanner-primary", "fingerprint": "8e047ab7af03962f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}]}]}