{"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-fa1e3d6d1b7a1546", "name": "Stray `console.log` in TS/JS \u2014 vite.config.ts:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 vite.config.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-8f4671f66ed9211b", "name": "Stray `console.log` in TS/JS \u2014 src/main.tsx:6", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/main.tsx:6"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aed9e63edbb65317", "name": "Stray `console.log` in TS/JS \u2014 src/integrations/supabase/client.ts:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/integrations/supabase/client.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-136f89d54f3b0f53", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/SearchableSelect.tsx:182", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/SearchableSelect.tsx:182"}, "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-0bf9c73e8882739c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/Layout.tsx:300", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Layout.tsx:300"}, "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-b209c77e83b119fd", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ui/chart.tsx:70", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ui/chart.tsx:70"}, "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-25a5fb005b05d6fc", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Conversaciones.tsx:599", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Conversaciones.tsx:599"}, "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-1a9834ec8595e6ca", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Administracion.tsx:591", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Administracion.tsx:591"}, "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-e01fa27e98f12a84", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Ventas.tsx:567", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Ventas.tsx:567"}, "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-2b2ca35c4978e819", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Clientes.tsx:265", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Clientes.tsx:265"}, "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-6cd670ebc1af7a9a", "name": "Stray `console.log` in TS/JS \u2014 src/pages/Vehiculos.tsx:294", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/pages/Vehiculos.tsx:294"}, "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-ed07aa0d34e5007b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Creditos.tsx:179", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Creditos.tsx:179"}, "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-d2d4545edcfc6ab5", "name": "Stray `console.log` in TS/JS \u2014 src/lib/aiImageService.ts:137", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/aiImageService.ts:137"}, "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-7115d371d50e262c", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/edit-vehicle-image/index.ts:34", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/edit-vehicle-image/index.ts:34"}, "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-c9f4e965014c659a", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/gemma-proxy/index.ts:246", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/gemma-proxy/index.ts:246"}, "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-ad4156c2a2917550", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/manychat-send-message/index.ts:126", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/manychat-send-message/index.ts:126"}, "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-2f3aa11aa0af9227", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/autored-proxy/index.ts:80", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/autored-proxy/index.ts:80"}, "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-9cba8704d176d090", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/agente-egana/index.ts:687", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/agente-egana/index.ts:687"}, "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-7176e5d95d18d844", "name": "Runtime dotenv file present in repo: .env", "shortDescription": {"text": "Runtime dotenv file present in repo: .env"}, "fullDescription": {"text": "`.env` looks like a runtime dotenv file. It contains secret-looking assignments for VITE_SUPABASE_PUBLISHABLE_KEY. Move real values to a secret manager and keep only `.env.example` style templates in source control."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-346e1b43a708b263", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/main.tsx:19", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/main.tsx:19"}, "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-93d0283845aa2c2d", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/ui/chart.tsx:70", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/ui/chart.tsx:70"}, "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-97ef769a25377372", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/edit-vehicle-image/index.ts:4", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/edit-vehicle-image/index.ts:4"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-75e6d93d8872f6da", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/manychat-send/index.ts:4", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/manychat-send/index.ts:4"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1d4cc287e5ce5422", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/get-autos/index.ts:4", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/get-autos/index.ts:4"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-60b926d03b981e6c", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/gemma-proxy/index.ts:37", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/gemma-proxy/index.ts:37"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-64a86948fc518a56", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/yapo-publish/index.ts:29", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/yapo-publish/index.ts:29"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0db1c582b11251e7", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/manychat-send-message/index.ts:4", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/manychat-send-message/index.ts:4"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8c95dc5feaebf808", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/meta-webhook/index.ts:4", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/meta-webhook/index.ts:4"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-55d944e8a64d4a6b", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/autored-proxy/index.ts:26", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/autored-proxy/index.ts:26"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-36d4606a98a1aa62", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/manychat-webhook/index.ts:4", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/manychat-webhook/index.ts:4"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-643f194a97df37ad", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/agente-egana/index.ts:4", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/agente-egana/index.ts:4"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2c36c8c1e3969061", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/yapo-feed/index.ts:21", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/yapo-feed/index.ts:21"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3ce9d295fee5b0dd", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/backfill-whatsapp-phones/index.ts:4", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/backfill-whatsapp-phones/index.ts:4"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a05396044209f164", "name": "Very large file: src/pages/Conversaciones.tsx (2342 lines)", "shortDescription": {"text": "Very large file: src/pages/Conversaciones.tsx (2342 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-04e1ba50bd87ee39", "name": "Very large file: src/pages/Configuracion.tsx (1389 lines)", "shortDescription": {"text": "Very large file: src/pages/Configuracion.tsx (1389 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-af4a9a22d45d3da4", "name": "Very large file: src/pages/Vehiculos.tsx (1638 lines)", "shortDescription": {"text": "Very large file: src/pages/Vehiculos.tsx (1638 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": "3 test file(s) for 105 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 24 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 111 placeholder/mock markers across 19 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9d79c4077342a7d0", "name": "Runtime service client appears to use placeholder configuration", "shortDescription": {"text": "Runtime service client appears to use placeholder configuration"}, "fullDescription": {"text": "A runtime source file appears to wire Supabase/Firebase/AI/payment-style clients to placeholder URLs, keys, or fallback values. In the Fable corpus this often means the UI/API shape is present while the backend service is not actually configured."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci. 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-bfb70f6e38722797", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/pages/Configuracion.tsx:707", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/pages/Configuracion.tsx:707"}, "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-d28046777426a15e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/pages/Vehiculos.tsx:542", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/pages/Vehiculos.tsx:542"}, "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-fb301ef592e95061", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/edit-vehicle-image/index.ts:36", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/edit-vehicle-image/index.ts:36"}, "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-ced7cc19cc2cc1a6", "name": "Legacy-named symbol `estadosOld` in supabase/functions/gemma-proxy/index.ts:476", "shortDescription": {"text": "Legacy-named symbol `estadosOld` in supabase/functions/gemma-proxy/index.ts:476"}, "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-2e87599f54c45fff", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/gemma-proxy/index.ts:221", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/gemma-proxy/index.ts:221"}, "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-c3f0cedc0af8c68e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/meta-webhook/index.ts:176", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/meta-webhook/index.ts:176"}, "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-a0742205e617f01c", "name": "Commented-code block (5 lines) in supabase/functions/manychat-webhook/index.ts:365", "shortDescription": {"text": "Commented-code block (5 lines) in supabase/functions/manychat-webhook/index.ts:365"}, "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-5d05bd597a27d86b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/manychat-webhook/index.ts:388", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/manychat-webhook/index.ts:388"}, "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-c39c881f9a773f36", "name": "Commented-code block (6 lines) in supabase/functions/agente-egana/index.ts:497", "shortDescription": {"text": "Commented-code block (6 lines) in supabase/functions/agente-egana/index.ts:497"}, "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-2eafc3188c36bb02", "name": "3 env vars used in code but missing from .env.example", "shortDescription": {"text": "3 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `CI`, `PLAYWRIGHT_BASE_URL`, `VITE_SUPABASE_PROJECT_ID`. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0890cd7d554a8d4c", "name": "Frontend route `/crm-movil` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/crm-movil` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/24875"}, "properties": {"repository": "cesar202666/automotriz-buddy-suite", "repoUrl": "https://github.com/cesar202666/automotriz-buddy-suite", "branch": "main"}, "results": [{"ruleId": "scanner-fa1e3d6d1b7a1546", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 vite.config.ts:32"}, "properties": {"repobilityId": "ab305e17677e589d", "scanner": "scanner-primary", "fingerprint": "fa1e3d6d1b7a1546", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8f4671f66ed9211b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/main.tsx:6"}, "properties": {"repobilityId": "4879059f78ef8e58", "scanner": "scanner-primary", "fingerprint": "8f4671f66ed9211b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-aed9e63edbb65317", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/integrations/supabase/client.ts:12"}, "properties": {"repobilityId": "73a41d523262fb64", "scanner": "scanner-primary", "fingerprint": "aed9e63edbb65317", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-136f89d54f3b0f53", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/SearchableSelect.tsx:182"}, "properties": {"repobilityId": "022d10d261178c2a", "scanner": "scanner-primary", "fingerprint": "136f89d54f3b0f53", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0bf9c73e8882739c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Layout.tsx:300"}, "properties": {"repobilityId": "daab328f104c4d01", "scanner": "scanner-primary", "fingerprint": "0bf9c73e8882739c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b209c77e83b119fd", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ui/chart.tsx:70"}, "properties": {"repobilityId": "b8c68f17a4018107", "scanner": "scanner-primary", "fingerprint": "b209c77e83b119fd", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-25a5fb005b05d6fc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Conversaciones.tsx:599"}, "properties": {"repobilityId": "a206f5f312a8acfc", "scanner": "scanner-primary", "fingerprint": "25a5fb005b05d6fc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1a9834ec8595e6ca", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Administracion.tsx:591"}, "properties": {"repobilityId": "5029e78d324c7f82", "scanner": "scanner-primary", "fingerprint": "1a9834ec8595e6ca", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e01fa27e98f12a84", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Ventas.tsx:567"}, "properties": {"repobilityId": "fa62204ffc711daa", "scanner": "scanner-primary", "fingerprint": "e01fa27e98f12a84", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2b2ca35c4978e819", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Clientes.tsx:265"}, "properties": {"repobilityId": "8e68dc3a3db83614", "scanner": "scanner-primary", "fingerprint": "2b2ca35c4978e819", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6cd670ebc1af7a9a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/pages/Vehiculos.tsx:294"}, "properties": {"repobilityId": "9222ed99704ae283", "scanner": "scanner-primary", "fingerprint": "6cd670ebc1af7a9a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ed07aa0d34e5007b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Creditos.tsx:179"}, "properties": {"repobilityId": "b2b212a7da91fb55", "scanner": "scanner-primary", "fingerprint": "ed07aa0d34e5007b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d2d4545edcfc6ab5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/aiImageService.ts:137"}, "properties": {"repobilityId": "2ff0d32a6b442fc3", "scanner": "scanner-primary", "fingerprint": "d2d4545edcfc6ab5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7115d371d50e262c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/edit-vehicle-image/index.ts:34"}, "properties": {"repobilityId": "80d8f536869e2536", "scanner": "scanner-primary", "fingerprint": "7115d371d50e262c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c9f4e965014c659a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/gemma-proxy/index.ts:246"}, "properties": {"repobilityId": "0ebbaaded97c815d", "scanner": "scanner-primary", "fingerprint": "c9f4e965014c659a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ad4156c2a2917550", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/manychat-send-message/index.ts:126"}, "properties": {"repobilityId": "8d9de7315f141f6f", "scanner": "scanner-primary", "fingerprint": "ad4156c2a2917550", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2f3aa11aa0af9227", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/autored-proxy/index.ts:80"}, "properties": {"repobilityId": "525d52fcecaecdf2", "scanner": "scanner-primary", "fingerprint": "2f3aa11aa0af9227", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9cba8704d176d090", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/agente-egana/index.ts:687"}, "properties": {"repobilityId": "bd784466f1c5af68", "scanner": "scanner-primary", "fingerprint": "9cba8704d176d090", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7176e5d95d18d844", "level": "error", "message": {"text": "Runtime dotenv file present in repo: .env"}, "properties": {"repobilityId": "4b9c737a445874ba", "scanner": "scanner-primary", "fingerprint": "7176e5d95d18d844", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets", "config", "env-file", "runtime-env", "env_file_with_secret"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".env"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-346e1b43a708b263", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/main.tsx:19"}, "properties": {"repobilityId": "b309e363ef5cc0b8", "scanner": "scanner-primary", "fingerprint": "346e1b43a708b263", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/main.tsx"}, "region": {"startLine": 19}}}]}, {"ruleId": "scanner-93d0283845aa2c2d", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/ui/chart.tsx:70"}, "properties": {"repobilityId": "33f10636e53b4298", "scanner": "scanner-primary", "fingerprint": "93d0283845aa2c2d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/ui/chart.tsx"}, "region": {"startLine": 70}}}]}, {"ruleId": "scanner-97ef769a25377372", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/edit-vehicle-image/index.ts:4"}, "properties": {"repobilityId": "663e18f476b15dbf", "scanner": "scanner-primary", "fingerprint": "97ef769a25377372", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/edit-vehicle-image/index.ts"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-75e6d93d8872f6da", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/manychat-send/index.ts:4"}, "properties": {"repobilityId": "d9f78b82e43de523", "scanner": "scanner-primary", "fingerprint": "75e6d93d8872f6da", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/manychat-send/index.ts"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-1d4cc287e5ce5422", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/get-autos/index.ts:4"}, "properties": {"repobilityId": "d740ebcd28d04992", "scanner": "scanner-primary", "fingerprint": "1d4cc287e5ce5422", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/get-autos/index.ts"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-60b926d03b981e6c", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/gemma-proxy/index.ts:37"}, "properties": {"repobilityId": "df1c055345bcada9", "scanner": "scanner-primary", "fingerprint": "60b926d03b981e6c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/gemma-proxy/index.ts"}, "region": {"startLine": 37}}}]}, {"ruleId": "scanner-64a86948fc518a56", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/yapo-publish/index.ts:29"}, "properties": {"repobilityId": "16cdefee40057fac", "scanner": "scanner-primary", "fingerprint": "64a86948fc518a56", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/yapo-publish/index.ts"}, "region": {"startLine": 29}}}]}, {"ruleId": "scanner-0db1c582b11251e7", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/manychat-send-message/index.ts:4"}, "properties": {"repobilityId": "0eac5b4a9a401e06", "scanner": "scanner-primary", "fingerprint": "0db1c582b11251e7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/manychat-send-message/index.ts"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-8c95dc5feaebf808", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/meta-webhook/index.ts:4"}, "properties": {"repobilityId": "0681df6b0495f385", "scanner": "scanner-primary", "fingerprint": "8c95dc5feaebf808", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/meta-webhook/index.ts"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-55d944e8a64d4a6b", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/autored-proxy/index.ts:26"}, "properties": {"repobilityId": "fc5e82cbf96b3292", "scanner": "scanner-primary", "fingerprint": "55d944e8a64d4a6b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/autored-proxy/index.ts"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-36d4606a98a1aa62", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/manychat-webhook/index.ts:4"}, "properties": {"repobilityId": "b29a71e0e9c4a79a", "scanner": "scanner-primary", "fingerprint": "36d4606a98a1aa62", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/manychat-webhook/index.ts"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-643f194a97df37ad", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/agente-egana/index.ts:4"}, "properties": {"repobilityId": "39fa3984b217b2cf", "scanner": "scanner-primary", "fingerprint": "643f194a97df37ad", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/agente-egana/index.ts"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-2c36c8c1e3969061", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/yapo-feed/index.ts:21"}, "properties": {"repobilityId": "f5a308be88fd8d40", "scanner": "scanner-primary", "fingerprint": "2c36c8c1e3969061", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/yapo-feed/index.ts"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-3ce9d295fee5b0dd", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/backfill-whatsapp-phones/index.ts:4"}, "properties": {"repobilityId": "55bde9945b903e05", "scanner": "scanner-primary", "fingerprint": "3ce9d295fee5b0dd", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/backfill-whatsapp-phones/index.ts"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-a05396044209f164", "level": "note", "message": {"text": "Very large file: src/pages/Conversaciones.tsx (2342 lines)"}, "properties": {"repobilityId": "a30fe28dd9ebbb13", "scanner": "scanner-primary", "fingerprint": "a05396044209f164", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-04e1ba50bd87ee39", "level": "note", "message": {"text": "Very large file: src/pages/Configuracion.tsx (1389 lines)"}, "properties": {"repobilityId": "9ce87abc6c6bf32f", "scanner": "scanner-primary", "fingerprint": "04e1ba50bd87ee39", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-af4a9a22d45d3da4", "level": "note", "message": {"text": "Very large file: src/pages/Vehiculos.tsx (1638 lines)"}, "properties": {"repobilityId": "1e6c3f85f180c3f6", "scanner": "scanner-primary", "fingerprint": "af4a9a22d45d3da4", "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": "9113fe76730278dc", "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": "9404bcda8f25dc44", "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": "87dba338380f75c4", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-9d79c4077342a7d0", "level": "warning", "message": {"text": "Runtime service client appears to use placeholder configuration"}, "properties": {"repobilityId": "5182b0461ede6493", "scanner": "scanner-primary", "fingerprint": "9d79c4077342a7d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "runtime-config", "service-client", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "a45be140a5051aee", "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": "0648ac81148e66d6", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-bfb70f6e38722797", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/pages/Configuracion.tsx:707"}, "properties": {"repobilityId": "bb6dee55b7af984c", "scanner": "scanner-primary", "fingerprint": "bfb70f6e38722797", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d28046777426a15e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/pages/Vehiculos.tsx:542"}, "properties": {"repobilityId": "006810d43a21c747", "scanner": "scanner-primary", "fingerprint": "d28046777426a15e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fb301ef592e95061", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/edit-vehicle-image/index.ts:36"}, "properties": {"repobilityId": "1130aa4011b4b6bf", "scanner": "scanner-primary", "fingerprint": "fb301ef592e95061", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ced7cc19cc2cc1a6", "level": "note", "message": {"text": "Legacy-named symbol `estadosOld` in supabase/functions/gemma-proxy/index.ts:476"}, "properties": {"repobilityId": "f324300a2958a49e", "scanner": "scanner-primary", "fingerprint": "ced7cc19cc2cc1a6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-2e87599f54c45fff", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/gemma-proxy/index.ts:221"}, "properties": {"repobilityId": "0e7d160eb6c7b0fb", "scanner": "scanner-primary", "fingerprint": "2e87599f54c45fff", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c3f0cedc0af8c68e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/meta-webhook/index.ts:176"}, "properties": {"repobilityId": "b1ab9c6b805eeac6", "scanner": "scanner-primary", "fingerprint": "c3f0cedc0af8c68e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a0742205e617f01c", "level": "none", "message": {"text": "Commented-code block (5 lines) in supabase/functions/manychat-webhook/index.ts:365"}, "properties": {"repobilityId": "2c4bc7f08a496f96", "scanner": "scanner-primary", "fingerprint": "a0742205e617f01c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5d05bd597a27d86b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/manychat-webhook/index.ts:388"}, "properties": {"repobilityId": "f9753fc01467113b", "scanner": "scanner-primary", "fingerprint": "5d05bd597a27d86b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c39c881f9a773f36", "level": "none", "message": {"text": "Commented-code block (6 lines) in supabase/functions/agente-egana/index.ts:497"}, "properties": {"repobilityId": "0d89be3cce6f4ad2", "scanner": "scanner-primary", "fingerprint": "c39c881f9a773f36", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2eafc3188c36bb02", "level": "none", "message": {"text": "3 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "bd934ba112b02ffa", "scanner": "scanner-primary", "fingerprint": "2eafc3188c36bb02", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-0890cd7d554a8d4c", "level": "warning", "message": {"text": "Frontend route `/crm-movil` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "f67a1e82abcb98fc", "scanner": "scanner-primary", "fingerprint": "0890cd7d554a8d4c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}]}]}