{"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-418a0e4ee9477aea", "name": "Stray `console.log` in TS/JS \u2014 landing/api/subscribe.js:54", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 landing/api/subscribe.js:54"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-998d5016b3ef4bc7", "name": "Stray `console.log` in TS/JS \u2014 backend/app.js:79", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/app.js:79"}, "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-3b3a1540f42839b9", "name": "Stray `console.log` in TS/JS \u2014 backend/seeds/fix_constraint.js:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/seeds/fix_constraint.js:14"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8bfe37f44a1fad5b", "name": "Stray `console.log` in TS/JS \u2014 backend/seeds/run_sql.js:31", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/seeds/run_sql.js: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-8c5ba36438a1b806", "name": "Stray `console.log` in TS/JS \u2014 backend/seeds/seed_rgpd.js:106", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/seeds/seed_rgpd.js:106"}, "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-290bf0edd219986b", "name": "Stray `console.log` in TS/JS \u2014 backend/seeds/add_inactivo_estado.js:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/seeds/add_inactivo_estado.js:8"}, "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-a268f16a88cd1db4", "name": "Stray `console.log` in TS/JS \u2014 backend/seeds/setup_nuevas_features.js:61", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/seeds/setup_nuevas_features.js:61"}, "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-40a02d1a4b6ee0fa", "name": "Stray `console.log` in TS/JS \u2014 backend/routes/cron.js:79", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/routes/cron.js:79"}, "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-81bb5705e8a61723", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/calendar/MonthGrid.jsx:99", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/calendar/MonthGrid.jsx:99"}, "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-2e8c285aa8dc9fe4", "name": "Stray `console.log` in TS/JS \u2014 studio-renacer-landing/api/subscribe.js:54", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 studio-renacer-landing/api/subscribe.js:54"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-396b8485d645e454", "name": "Insecure pattern 'direct_innerhtml_assignment' in landing/index.html:863", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in landing/index.html:863"}, "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-79593b6fea9dfeea", "name": "Insecure pattern 'document_write' in frontend/src/pages/admin/Paciente.jsx:38", "shortDescription": {"text": "Insecure pattern 'document_write' in frontend/src/pages/admin/Paciente.jsx:38"}, "fullDescription": {"text": "Found a known-risky pattern (document_write). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-375f1003e4862678", "name": "Insecure pattern 'direct_innerhtml_assignment' in studio-renacer-landing/index.html:861", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in studio-renacer-landing/index.html:861"}, "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-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "0 test file(s) for 55 source file(s) (ratio 0.00). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 45 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 16 placeholder/mock markers across 7 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-11825279136b53a3", "name": "CI is configured but no tests are detected", "shortDescription": {"text": "CI is configured but no tests are detected"}, "fullDescription": {"text": "A CI pipeline exists, but the scan found no test files to gate. Opus labeled this generated-code pattern as config theater: release machinery exists, but it has little behavioral signal."}, "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, 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": "low", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, tests. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bea357a6497a2d5d", "name": "Agent authority lacks a verifier contract: CLAUDE.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: CLAUDE.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2c5f98b152cddb6d", "name": "Agent authority lacks a verifier contract: .claude/launch.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/launch.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ecb0d2c55ed6875d", "name": "Agent authority lacks a verifier contract: .claude/settings.local.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/settings.local.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7f3add4bf54b3a6a", "name": "Commented-code block (6 lines) in landing/api/subscribe.js:1", "shortDescription": {"text": "Commented-code block (6 lines) in landing/api/subscribe.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-797bc38895325c31", "name": "`fetch()` without try/.catch or AbortSignal \u2014 backend/seeds/run_sql.js:19", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 backend/seeds/run_sql.js:19"}, "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-8f64e182f0b20dfb", "name": "Commented-code block (5 lines) in backend/services/icsService.js:3", "shortDescription": {"text": "Commented-code block (5 lines) in backend/services/icsService.js: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-837965521a10be86", "name": "Commented-code block (6 lines) in backend/services/externalCalendarService.js:5", "shortDescription": {"text": "Commented-code block (6 lines) in backend/services/externalCalendarService.js: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-c462146838e6de80", "name": "Commented-code block (6 lines) in studio-renacer-landing/api/subscribe.js:1", "shortDescription": {"text": "Commented-code block (6 lines) in studio-renacer-landing/api/subscribe.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-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: `RESEND_AUDIENCE_ID`, `SUPABASE_ACCESS_TOKEN`, `SUPABASE_PUBLISHABLE_KEY`. 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-b5bbd668677cd19d", "name": "Frontend route `/activate` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `/activate` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e864cf02de4f5409", "name": "Frontend route `/reset-password` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `/reset-password` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3a6e4215b3132576", "name": "Frontend route `/admin/paciente/:id` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `/admin/paciente/:id` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3fd436b3285963a8", "name": "Dangling fetch: POST https://api.resend.com/audiences/${audId}/contacts (landing/api/subscribe.js:101)", "shortDescription": {"text": "Dangling fetch: POST https://api.resend.com/audiences/${audId}/contacts (landing/api/subscribe.js:101)"}, "fullDescription": {"text": "`landing/api/subscribe.js:101` calls `POST https://api.resend.com/audiences/${audId}/contacts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.resend.com/audiences/<p>/contacts`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6d0f3e191e86cc3f", "name": "Dangling fetch: POST https://api.resend.com/emails (landing/api/subscribe.js:127)", "shortDescription": {"text": "Dangling fetch: POST https://api.resend.com/emails (landing/api/subscribe.js:127)"}, "fullDescription": {"text": "`landing/api/subscribe.js:127` calls `POST https://api.resend.com/emails` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.resend.com/emails`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0946ab677e31143c", "name": "Dangling fetch: POST https://api.supabase.com/v1/projects/${projectRef}/database/query (backend/seeds/run_sql.js:19)", "shortDescription": {"text": "Dangling fetch: POST https://api.supabase.com/v1/projects/${projectRef}/database/query (backend/seeds/run_sql.js:19)"}, "fullDescription": {"text": "`backend/seeds/run_sql.js:19` calls `POST https://api.supabase.com/v1/projects/${projectRef}/database/query` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.supabase.com/v1/projects/<p>/database/query`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-917ad5d5839734cc", "name": "Dangling fetch: POST https://api.resend.com/audiences/${audId}/contacts (studio-renacer-landing/api/subscribe.js:101)", "shortDescription": {"text": "Dangling fetch: POST https://api.resend.com/audiences/${audId}/contacts (studio-renacer-landing/api/subscribe.js:101)"}, "fullDescription": {"text": "`studio-renacer-landing/api/subscribe.js:101` calls `POST https://api.resend.com/audiences/${audId}/contacts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.resend.com/audiences/<p>/contacts`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9acd16ddd6b5f4e2", "name": "Dangling fetch: POST https://api.resend.com/emails (studio-renacer-landing/api/subscribe.js:127)", "shortDescription": {"text": "Dangling fetch: POST https://api.resend.com/emails (studio-renacer-landing/api/subscribe.js:127)"}, "fullDescription": {"text": "`studio-renacer-landing/api/subscribe.js:127` calls `POST https://api.resend.com/emails` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.resend.com/emails`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-dde3adb27bf7eebe", "name": "Unused endpoint: USE /api", "shortDescription": {"text": "Unused endpoint: USE /api"}, "fullDescription": {"text": "`backend/app.js` declares `USE /api` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6eb452fbfb454d20", "name": "Unused endpoint: USE /api/auth", "shortDescription": {"text": "Unused endpoint: USE /api/auth"}, "fullDescription": {"text": "`backend/app.js` declares `USE /api/auth` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bf7ea1f5837325c5", "name": "Unused endpoint: USE /api/auth/2fa", "shortDescription": {"text": "Unused endpoint: USE /api/auth/2fa"}, "fullDescription": {"text": "`backend/app.js` declares `USE /api/auth/2fa` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3371ca16aeb81276", "name": "Unused endpoint: USE /api/pacientes", "shortDescription": {"text": "Unused endpoint: USE /api/pacientes"}, "fullDescription": {"text": "`backend/app.js` declares `USE /api/pacientes` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e0d5d4b4963f779a", "name": "Unused endpoint: USE /api/sesiones", "shortDescription": {"text": "Unused endpoint: USE /api/sesiones"}, "fullDescription": {"text": "`backend/app.js` declares `USE /api/sesiones` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b59575e391dbb50f", "name": "Unused endpoint: USE /api/calendarios", "shortDescription": {"text": "Unused endpoint: USE /api/calendarios"}, "fullDescription": {"text": "`backend/app.js` declares `USE /api/calendarios` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5d4b752719911acd", "name": "Unused endpoint: USE /api/packs", "shortDescription": {"text": "Unused endpoint: USE /api/packs"}, "fullDescription": {"text": "`backend/app.js` declares `USE /api/packs` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4c23480e4ef3637c", "name": "Unused endpoint: USE /api/documentos", "shortDescription": {"text": "Unused endpoint: USE /api/documentos"}, "fullDescription": {"text": "`backend/app.js` declares `USE /api/documentos` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7dd076da4a309224", "name": "Unused endpoint: USE /api/contratos", "shortDescription": {"text": "Unused endpoint: USE /api/contratos"}, "fullDescription": {"text": "`backend/app.js` declares `USE /api/contratos` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-303667a197909e9c", "name": "Unused endpoint: USE /api/cron", "shortDescription": {"text": "Unused endpoint: USE /api/cron"}, "fullDescription": {"text": "`backend/app.js` declares `USE /api/cron` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4756b4c4da7d2088", "name": "Unused endpoint: GET /api/health", "shortDescription": {"text": "Unused endpoint: GET /api/health"}, "fullDescription": {"text": "`backend/app.js` declares `GET /api/health` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2aef12731fe7296c", "name": "Unused endpoint: GET /feed-url", "shortDescription": {"text": "Unused endpoint: GET /feed-url"}, "fullDescription": {"text": "`backend/routes/calendarios.js` declares `GET /feed-url` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ccaded918e06e1df", "name": "Unused endpoint: POST /feed-url/regenerar", "shortDescription": {"text": "Unused endpoint: POST /feed-url/regenerar"}, "fullDescription": {"text": "`backend/routes/calendarios.js` declares `POST /feed-url/regenerar` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7a3f2d2c7765416c", "name": "Unused endpoint: GET /feed/:token", "shortDescription": {"text": "Unused endpoint: GET /feed/:token"}, "fullDescription": {"text": "`backend/routes/calendarios.js` declares `GET /feed/:token` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e7604815bd8207c1", "name": "Unused endpoint: GET /externos", "shortDescription": {"text": "Unused endpoint: GET /externos"}, "fullDescription": {"text": "`backend/routes/calendarios.js` declares `GET /externos` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-573c333851dab0f1", "name": "Unused endpoint: POST /externos", "shortDescription": {"text": "Unused endpoint: POST /externos"}, "fullDescription": {"text": "`backend/routes/calendarios.js` declares `POST /externos` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-597bfcca0a4be532", "name": "Unused endpoint: DELETE /externos/:id", "shortDescription": {"text": "Unused endpoint: DELETE /externos/:id"}, "fullDescription": {"text": "`backend/routes/calendarios.js` declares `DELETE /externos/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4d4de5121beb0202", "name": "Unused endpoint: GET /ocupado", "shortDescription": {"text": "Unused endpoint: GET /ocupado"}, "fullDescription": {"text": "`backend/routes/calendarios.js` declares `GET /ocupado` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-17b4955540af2db1", "name": "Unused endpoint: POST /recordatorios", "shortDescription": {"text": "Unused endpoint: POST /recordatorios"}, "fullDescription": {"text": "`backend/routes/cron.js` declares `POST /recordatorios` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-572e8bd16f9db927", "name": "Unused endpoint: GET /me/perfil", "shortDescription": {"text": "Unused endpoint: GET /me/perfil"}, "fullDescription": {"text": "`backend/routes/pacientes.js` declares `GET /me/perfil` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-88e6fa7336af5c9e", "name": "Unused endpoint: PUT /me/telefono", "shortDescription": {"text": "Unused endpoint: PUT /me/telefono"}, "fullDescription": {"text": "`backend/routes/pacientes.js` declares `PUT /me/telefono` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`backend/routes/pacientes.js` declares `GET /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ca5756175765b49d", "name": "Unused endpoint: GET /:id", "shortDescription": {"text": "Unused endpoint: GET /:id"}, "fullDescription": {"text": "`backend/routes/pacientes.js` declares `GET /:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a5ba667096fc4214", "name": "Unused endpoint: PUT /:pacienteId", "shortDescription": {"text": "Unused endpoint: PUT /:pacienteId"}, "fullDescription": {"text": "`backend/routes/pacientes.js` declares `PUT /:pacienteId` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7244774f57779581", "name": "Unused endpoint: GET /me/export", "shortDescription": {"text": "Unused endpoint: GET /me/export"}, "fullDescription": {"text": "`backend/routes/pacientes.js` declares `GET /me/export` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-abf557a422144c3e", "name": "Unused endpoint: GET /:userId/export", "shortDescription": {"text": "Unused endpoint: GET /:userId/export"}, "fullDescription": {"text": "`backend/routes/pacientes.js` declares `GET /:userId/export` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c164760d883b1d05", "name": "Unused endpoint: GET /:userId/rgpd", "shortDescription": {"text": "Unused endpoint: GET /:userId/rgpd"}, "fullDescription": {"text": "`backend/routes/pacientes.js` declares `GET /:userId/rgpd` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-135860cc0267c772", "name": "Unused endpoint: DELETE /:userId", "shortDescription": {"text": "Unused endpoint: DELETE /:userId"}, "fullDescription": {"text": "`backend/routes/pacientes.js` declares `DELETE /:userId` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f4c3cc3c3b0b0e44", "name": "Unused endpoint: GET /plantilla", "shortDescription": {"text": "Unused endpoint: GET /plantilla"}, "fullDescription": {"text": "`backend/routes/contratos.js` declares `GET /plantilla` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5814fc6aa87995ce", "name": "Unused endpoint: POST /pack/:packId/subir-paciente", "shortDescription": {"text": "Unused endpoint: POST /pack/:packId/subir-paciente"}, "fullDescription": {"text": "`backend/routes/contratos.js` declares `POST /pack/:packId/subir-paciente` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e009dd4c1d07d56e", "name": "Unused endpoint: POST /pack/:packId/subir-admin", "shortDescription": {"text": "Unused endpoint: POST /pack/:packId/subir-admin"}, "fullDescription": {"text": "`backend/routes/contratos.js` declares `POST /pack/:packId/subir-admin` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-10d6b1acc029a686", "name": "Unused endpoint: GET /pack/:packId/firmado-paciente", "shortDescription": {"text": "Unused endpoint: GET /pack/:packId/firmado-paciente"}, "fullDescription": {"text": "`backend/routes/contratos.js` declares `GET /pack/:packId/firmado-paciente` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-171e4da11a42fb6f", "name": "Unused endpoint: GET /pack/:packId/firmado-admin", "shortDescription": {"text": "Unused endpoint: GET /pack/:packId/firmado-admin"}, "fullDescription": {"text": "`backend/routes/contratos.js` declares `GET /pack/:packId/firmado-admin` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7a009b1a56794f45", "name": "Unused endpoint: POST /", "shortDescription": {"text": "Unused endpoint: POST /"}, "fullDescription": {"text": "`backend/routes/sesiones.js` declares `POST /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7ce93acd2bbc6a12", "name": "Unused endpoint: GET /disponibilidad", "shortDescription": {"text": "Unused endpoint: GET /disponibilidad"}, "fullDescription": {"text": "`backend/routes/sesiones.js` declares `GET /disponibilidad` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1bd4033d09146afc", "name": "Unused endpoint: POST /solicitar", "shortDescription": {"text": "Unused endpoint: POST /solicitar"}, "fullDescription": {"text": "`backend/routes/sesiones.js` declares `POST /solicitar` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bbb17f36d058a21d", "name": "Unused endpoint: PUT /:id/estado", "shortDescription": {"text": "Unused endpoint: PUT /:id/estado"}, "fullDescription": {"text": "`backend/routes/sesiones.js` declares `PUT /:id/estado` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-90df9d8a875336b8", "name": "Unused endpoint: PUT /:id/reagendar", "shortDescription": {"text": "Unused endpoint: PUT /:id/reagendar"}, "fullDescription": {"text": "`backend/routes/sesiones.js` declares `PUT /:id/reagendar` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-35f903201dc31b39", "name": "Unused endpoint: GET /mis-sesiones", "shortDescription": {"text": "Unused endpoint: GET /mis-sesiones"}, "fullDescription": {"text": "`backend/routes/sesiones.js` declares `GET /mis-sesiones` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-75e9bbb9ef59c327", "name": "Unused endpoint: GET /:id/ics", "shortDescription": {"text": "Unused endpoint: GET /:id/ics"}, "fullDescription": {"text": "`backend/routes/sesiones.js` declares `GET /:id/ics` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aee9168e964a3822", "name": "Unused endpoint: POST /verify", "shortDescription": {"text": "Unused endpoint: POST /verify"}, "fullDescription": {"text": "`backend/routes/twofa.js` declares `POST /verify` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-eb757797f6bd3444", "name": "Unused endpoint: POST /setup", "shortDescription": {"text": "Unused endpoint: POST /setup"}, "fullDescription": {"text": "`backend/routes/twofa.js` declares `POST /setup` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c1fa622edf221471", "name": "Unused endpoint: POST /verify-setup", "shortDescription": {"text": "Unused endpoint: POST /verify-setup"}, "fullDescription": {"text": "`backend/routes/twofa.js` declares `POST /verify-setup` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3b30f4c0994a30b4", "name": "Unused endpoint: DELETE /", "shortDescription": {"text": "Unused endpoint: DELETE /"}, "fullDescription": {"text": "`backend/routes/twofa.js` declares `DELETE /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-225b2f6f7ac478be", "name": "Unused endpoint: GET /mis-aceptaciones", "shortDescription": {"text": "Unused endpoint: GET /mis-aceptaciones"}, "fullDescription": {"text": "`backend/routes/documentos.js` declares `GET /mis-aceptaciones` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa124b4438183f78", "name": "Unused endpoint: POST /aceptar", "shortDescription": {"text": "Unused endpoint: POST /aceptar"}, "fullDescription": {"text": "`backend/routes/documentos.js` declares `POST /aceptar` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e01e92d98ae107ee", "name": "Unused endpoint: GET /paciente/:pacienteId", "shortDescription": {"text": "Unused endpoint: GET /paciente/:pacienteId"}, "fullDescription": {"text": "`backend/routes/packs.js` declares `GET /paciente/:pacienteId` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8c708049ffe9ee19", "name": "Unused endpoint: GET /mis-packs", "shortDescription": {"text": "Unused endpoint: GET /mis-packs"}, "fullDescription": {"text": "`backend/routes/packs.js` declares `GET /mis-packs` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7a61c112b611f4bb", "name": "Unused endpoint: DELETE /:id", "shortDescription": {"text": "Unused endpoint: DELETE /:id"}, "fullDescription": {"text": "`backend/routes/packs.js` declares `DELETE /:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-158288b29990d2ca", "name": "Unused endpoint: PUT /:id/pago", "shortDescription": {"text": "Unused endpoint: PUT /:id/pago"}, "fullDescription": {"text": "`backend/routes/packs.js` declares `PUT /:id/pago` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/24172"}, "properties": {"repository": "andreafernandezpsicologia/Psychology-platform-claude-AI", "repoUrl": "https://github.com/andreafernandezpsicologia/Psychology-platform-claude-AI", "branch": "main"}, "results": [{"ruleId": "scanner-418a0e4ee9477aea", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 landing/api/subscribe.js:54"}, "properties": {"repobilityId": "20b9f33b74278426", "scanner": "scanner-primary", "fingerprint": "418a0e4ee9477aea", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-998d5016b3ef4bc7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/app.js:79"}, "properties": {"repobilityId": "601108128008caa0", "scanner": "scanner-primary", "fingerprint": "998d5016b3ef4bc7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3b3a1540f42839b9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/seeds/fix_constraint.js:14"}, "properties": {"repobilityId": "9c44249e8ce43cc0", "scanner": "scanner-primary", "fingerprint": "3b3a1540f42839b9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8bfe37f44a1fad5b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/seeds/run_sql.js:31"}, "properties": {"repobilityId": "ed75a4bcb0142a2b", "scanner": "scanner-primary", "fingerprint": "8bfe37f44a1fad5b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8c5ba36438a1b806", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/seeds/seed_rgpd.js:106"}, "properties": {"repobilityId": "ff5554775ea4c02c", "scanner": "scanner-primary", "fingerprint": "8c5ba36438a1b806", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-290bf0edd219986b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/seeds/add_inactivo_estado.js:8"}, "properties": {"repobilityId": "c636f6b90de0c8b4", "scanner": "scanner-primary", "fingerprint": "290bf0edd219986b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a268f16a88cd1db4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/seeds/setup_nuevas_features.js:61"}, "properties": {"repobilityId": "4500753dd0f8629a", "scanner": "scanner-primary", "fingerprint": "a268f16a88cd1db4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-40a02d1a4b6ee0fa", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/routes/cron.js:79"}, "properties": {"repobilityId": "e54c9a06dcd37b8b", "scanner": "scanner-primary", "fingerprint": "40a02d1a4b6ee0fa", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-81bb5705e8a61723", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/calendar/MonthGrid.jsx:99"}, "properties": {"repobilityId": "b0c6760934f6044b", "scanner": "scanner-primary", "fingerprint": "81bb5705e8a61723", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2e8c285aa8dc9fe4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 studio-renacer-landing/api/subscribe.js:54"}, "properties": {"repobilityId": "ea91ac0fd171894e", "scanner": "scanner-primary", "fingerprint": "2e8c285aa8dc9fe4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-396b8485d645e454", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in landing/index.html:863"}, "properties": {"repobilityId": "e521b5b108cf58d5", "scanner": "scanner-primary", "fingerprint": "396b8485d645e454", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "landing/index.html"}, "region": {"startLine": 863}}}]}, {"ruleId": "scanner-79593b6fea9dfeea", "level": "note", "message": {"text": "Insecure pattern 'document_write' in frontend/src/pages/admin/Paciente.jsx:38"}, "properties": {"repobilityId": "7607a322291e6084", "scanner": "scanner-primary", "fingerprint": "79593b6fea9dfeea", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/pages/admin/Paciente.jsx"}, "region": {"startLine": 38}}}]}, {"ruleId": "scanner-375f1003e4862678", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in studio-renacer-landing/index.html:861"}, "properties": {"repobilityId": "f14c11e612ef4ef0", "scanner": "scanner-primary", "fingerprint": "375f1003e4862678", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "studio-renacer-landing/index.html"}, "region": {"startLine": 861}}}]}, {"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": "087bfb2528749180", "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": "83797068ad99b459", "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": "6900a49be1af8740", "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": "c9d1c11a46ce9ead", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-11825279136b53a3", "level": "warning", "message": {"text": "CI is configured but no tests are detected"}, "properties": {"repobilityId": "a2e5622217cb84de", "scanner": "scanner-primary", "fingerprint": "11825279136b53a3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "ci", "config-theater", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "07ac93bb0e9d1626", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "5a66482a79aaa997", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-bea357a6497a2d5d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: CLAUDE.md"}, "properties": {"repobilityId": "aae72df3934829ac", "scanner": "scanner-primary", "fingerprint": "bea357a6497a2d5d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "CLAUDE.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2c5f98b152cddb6d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/launch.json"}, "properties": {"repobilityId": "0de48c0f4ab303d8", "scanner": "scanner-primary", "fingerprint": "2c5f98b152cddb6d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/launch.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ecb0d2c55ed6875d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/settings.local.json"}, "properties": {"repobilityId": "d8bae33a6d517bf0", "scanner": "scanner-primary", "fingerprint": "ecb0d2c55ed6875d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/settings.local.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7f3add4bf54b3a6a", "level": "none", "message": {"text": "Commented-code block (6 lines) in landing/api/subscribe.js:1"}, "properties": {"repobilityId": "13eadf351c5f6a86", "scanner": "scanner-primary", "fingerprint": "7f3add4bf54b3a6a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-797bc38895325c31", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 backend/seeds/run_sql.js:19"}, "properties": {"repobilityId": "fd4061bd0a3f425d", "scanner": "scanner-primary", "fingerprint": "797bc38895325c31", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8f64e182f0b20dfb", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/services/icsService.js:3"}, "properties": {"repobilityId": "6455aae172469e2e", "scanner": "scanner-primary", "fingerprint": "8f64e182f0b20dfb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-837965521a10be86", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/services/externalCalendarService.js:5"}, "properties": {"repobilityId": "7a168ba90e153b91", "scanner": "scanner-primary", "fingerprint": "837965521a10be86", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c462146838e6de80", "level": "none", "message": {"text": "Commented-code block (6 lines) in studio-renacer-landing/api/subscribe.js:1"}, "properties": {"repobilityId": "f400a7debd03af4b", "scanner": "scanner-primary", "fingerprint": "c462146838e6de80", "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-b5bbd668677cd19d", "level": "warning", "message": {"text": "Frontend route `/activate` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "22cc9d9e77e94faa", "scanner": "scanner-primary", "fingerprint": "b5bbd668677cd19d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e864cf02de4f5409", "level": "warning", "message": {"text": "Frontend route `/reset-password` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "e1cae2d17f680088", "scanner": "scanner-primary", "fingerprint": "e864cf02de4f5409", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-3a6e4215b3132576", "level": "warning", "message": {"text": "Frontend route `/admin/paciente/:id` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "f991a1613304491d", "scanner": "scanner-primary", "fingerprint": "3a6e4215b3132576", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-3fd436b3285963a8", "level": "error", "message": {"text": "Dangling fetch: POST https://api.resend.com/audiences/${audId}/contacts (landing/api/subscribe.js:101)"}, "properties": {"repobilityId": "05e37d710f25ccac", "scanner": "scanner-primary", "fingerprint": "3fd436b3285963a8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6d0f3e191e86cc3f", "level": "error", "message": {"text": "Dangling fetch: POST https://api.resend.com/emails (landing/api/subscribe.js:127)"}, "properties": {"repobilityId": "3ba070bd4ffe91dd", "scanner": "scanner-primary", "fingerprint": "6d0f3e191e86cc3f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0946ab677e31143c", "level": "error", "message": {"text": "Dangling fetch: POST https://api.supabase.com/v1/projects/${projectRef}/database/query (backend/seeds/run_sql.js:19)"}, "properties": {"repobilityId": "babc228d19aace40", "scanner": "scanner-primary", "fingerprint": "0946ab677e31143c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-917ad5d5839734cc", "level": "error", "message": {"text": "Dangling fetch: POST https://api.resend.com/audiences/${audId}/contacts (studio-renacer-landing/api/subscribe.js:101)"}, "properties": {"repobilityId": "8b0287b4e0c8f663", "scanner": "scanner-primary", "fingerprint": "917ad5d5839734cc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9acd16ddd6b5f4e2", "level": "error", "message": {"text": "Dangling fetch: POST https://api.resend.com/emails (studio-renacer-landing/api/subscribe.js:127)"}, "properties": {"repobilityId": "be473e581b16c3ec", "scanner": "scanner-primary", "fingerprint": "9acd16ddd6b5f4e2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-dde3adb27bf7eebe", "level": "note", "message": {"text": "Unused endpoint: USE /api"}, "properties": {"repobilityId": "c70c4b39abbcbf3e", "scanner": "scanner-primary", "fingerprint": "dde3adb27bf7eebe", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6eb452fbfb454d20", "level": "note", "message": {"text": "Unused endpoint: USE /api/auth"}, "properties": {"repobilityId": "8a1d83061af201c3", "scanner": "scanner-primary", "fingerprint": "6eb452fbfb454d20", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bf7ea1f5837325c5", "level": "note", "message": {"text": "Unused endpoint: USE /api/auth/2fa"}, "properties": {"repobilityId": "e44a50724b25a9fa", "scanner": "scanner-primary", "fingerprint": "bf7ea1f5837325c5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3371ca16aeb81276", "level": "note", "message": {"text": "Unused endpoint: USE /api/pacientes"}, "properties": {"repobilityId": "a9d89af141aefb5f", "scanner": "scanner-primary", "fingerprint": "3371ca16aeb81276", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e0d5d4b4963f779a", "level": "note", "message": {"text": "Unused endpoint: USE /api/sesiones"}, "properties": {"repobilityId": "8318106cb1aaaec8", "scanner": "scanner-primary", "fingerprint": "e0d5d4b4963f779a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b59575e391dbb50f", "level": "note", "message": {"text": "Unused endpoint: USE /api/calendarios"}, "properties": {"repobilityId": "001627e6f3fa3cfa", "scanner": "scanner-primary", "fingerprint": "b59575e391dbb50f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5d4b752719911acd", "level": "note", "message": {"text": "Unused endpoint: USE /api/packs"}, "properties": {"repobilityId": "f7053f9424534325", "scanner": "scanner-primary", "fingerprint": "5d4b752719911acd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4c23480e4ef3637c", "level": "note", "message": {"text": "Unused endpoint: USE /api/documentos"}, "properties": {"repobilityId": "c8cd026c94877696", "scanner": "scanner-primary", "fingerprint": "4c23480e4ef3637c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7dd076da4a309224", "level": "note", "message": {"text": "Unused endpoint: USE /api/contratos"}, "properties": {"repobilityId": "2b676a87d7be04b5", "scanner": "scanner-primary", "fingerprint": "7dd076da4a309224", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-303667a197909e9c", "level": "note", "message": {"text": "Unused endpoint: USE /api/cron"}, "properties": {"repobilityId": "49a132cc10580d0a", "scanner": "scanner-primary", "fingerprint": "303667a197909e9c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4756b4c4da7d2088", "level": "note", "message": {"text": "Unused endpoint: GET /api/health"}, "properties": {"repobilityId": "01a6e5d6a3420a00", "scanner": "scanner-primary", "fingerprint": "4756b4c4da7d2088", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2aef12731fe7296c", "level": "note", "message": {"text": "Unused endpoint: GET /feed-url"}, "properties": {"repobilityId": "29db3161ae52671a", "scanner": "scanner-primary", "fingerprint": "2aef12731fe7296c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ccaded918e06e1df", "level": "note", "message": {"text": "Unused endpoint: POST /feed-url/regenerar"}, "properties": {"repobilityId": "0d4a635a42c213e6", "scanner": "scanner-primary", "fingerprint": "ccaded918e06e1df", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a3f2d2c7765416c", "level": "note", "message": {"text": "Unused endpoint: GET /feed/:token"}, "properties": {"repobilityId": "52f61025eaddaf56", "scanner": "scanner-primary", "fingerprint": "7a3f2d2c7765416c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e7604815bd8207c1", "level": "note", "message": {"text": "Unused endpoint: GET /externos"}, "properties": {"repobilityId": "384babfe225fcbff", "scanner": "scanner-primary", "fingerprint": "e7604815bd8207c1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-573c333851dab0f1", "level": "note", "message": {"text": "Unused endpoint: POST /externos"}, "properties": {"repobilityId": "3b8eef021ec8f817", "scanner": "scanner-primary", "fingerprint": "573c333851dab0f1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-597bfcca0a4be532", "level": "note", "message": {"text": "Unused endpoint: DELETE /externos/:id"}, "properties": {"repobilityId": "141bc7b3dece2582", "scanner": "scanner-primary", "fingerprint": "597bfcca0a4be532", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4d4de5121beb0202", "level": "note", "message": {"text": "Unused endpoint: GET /ocupado"}, "properties": {"repobilityId": "027a12fd277ecc9d", "scanner": "scanner-primary", "fingerprint": "4d4de5121beb0202", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-17b4955540af2db1", "level": "note", "message": {"text": "Unused endpoint: POST /recordatorios"}, "properties": {"repobilityId": "66a0578bad34d4ee", "scanner": "scanner-primary", "fingerprint": "17b4955540af2db1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-572e8bd16f9db927", "level": "note", "message": {"text": "Unused endpoint: GET /me/perfil"}, "properties": {"repobilityId": "8f13bacb06b6280f", "scanner": "scanner-primary", "fingerprint": "572e8bd16f9db927", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-88e6fa7336af5c9e", "level": "note", "message": {"text": "Unused endpoint: PUT /me/telefono"}, "properties": {"repobilityId": "5d6056ccdaba013d", "scanner": "scanner-primary", "fingerprint": "88e6fa7336af5c9e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "f98dd0d495ac21e8", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ca5756175765b49d", "level": "note", "message": {"text": "Unused endpoint: GET /:id"}, "properties": {"repobilityId": "87e26759512ea593", "scanner": "scanner-primary", "fingerprint": "ca5756175765b49d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a5ba667096fc4214", "level": "note", "message": {"text": "Unused endpoint: PUT /:pacienteId"}, "properties": {"repobilityId": "7bda9564872df65c", "scanner": "scanner-primary", "fingerprint": "a5ba667096fc4214", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7244774f57779581", "level": "note", "message": {"text": "Unused endpoint: GET /me/export"}, "properties": {"repobilityId": "6b52db7964e2d702", "scanner": "scanner-primary", "fingerprint": "7244774f57779581", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-abf557a422144c3e", "level": "note", "message": {"text": "Unused endpoint: GET /:userId/export"}, "properties": {"repobilityId": "6ff6dead9caeec79", "scanner": "scanner-primary", "fingerprint": "abf557a422144c3e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c164760d883b1d05", "level": "note", "message": {"text": "Unused endpoint: GET /:userId/rgpd"}, "properties": {"repobilityId": "67620cf449f8d47a", "scanner": "scanner-primary", "fingerprint": "c164760d883b1d05", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-135860cc0267c772", "level": "note", "message": {"text": "Unused endpoint: DELETE /:userId"}, "properties": {"repobilityId": "6f8a4967cced8ab4", "scanner": "scanner-primary", "fingerprint": "135860cc0267c772", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f4c3cc3c3b0b0e44", "level": "note", "message": {"text": "Unused endpoint: GET /plantilla"}, "properties": {"repobilityId": "91a6a186924f7dbc", "scanner": "scanner-primary", "fingerprint": "f4c3cc3c3b0b0e44", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5814fc6aa87995ce", "level": "note", "message": {"text": "Unused endpoint: POST /pack/:packId/subir-paciente"}, "properties": {"repobilityId": "2638502e151bdb8e", "scanner": "scanner-primary", "fingerprint": "5814fc6aa87995ce", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e009dd4c1d07d56e", "level": "note", "message": {"text": "Unused endpoint: POST /pack/:packId/subir-admin"}, "properties": {"repobilityId": "20ccf30bfc2c3a8f", "scanner": "scanner-primary", "fingerprint": "e009dd4c1d07d56e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-10d6b1acc029a686", "level": "note", "message": {"text": "Unused endpoint: GET /pack/:packId/firmado-paciente"}, "properties": {"repobilityId": "e801155131396408", "scanner": "scanner-primary", "fingerprint": "10d6b1acc029a686", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-171e4da11a42fb6f", "level": "note", "message": {"text": "Unused endpoint: GET /pack/:packId/firmado-admin"}, "properties": {"repobilityId": "33cafdcdcae9ca7f", "scanner": "scanner-primary", "fingerprint": "171e4da11a42fb6f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a009b1a56794f45", "level": "note", "message": {"text": "Unused endpoint: POST /"}, "properties": {"repobilityId": "d37edfed8b9750f6", "scanner": "scanner-primary", "fingerprint": "7a009b1a56794f45", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7ce93acd2bbc6a12", "level": "note", "message": {"text": "Unused endpoint: GET /disponibilidad"}, "properties": {"repobilityId": "80d65dc07bf09d67", "scanner": "scanner-primary", "fingerprint": "7ce93acd2bbc6a12", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1bd4033d09146afc", "level": "note", "message": {"text": "Unused endpoint: POST /solicitar"}, "properties": {"repobilityId": "9c822f9dc2d162ec", "scanner": "scanner-primary", "fingerprint": "1bd4033d09146afc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bbb17f36d058a21d", "level": "note", "message": {"text": "Unused endpoint: PUT /:id/estado"}, "properties": {"repobilityId": "d1a68a56242b326a", "scanner": "scanner-primary", "fingerprint": "bbb17f36d058a21d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-90df9d8a875336b8", "level": "note", "message": {"text": "Unused endpoint: PUT /:id/reagendar"}, "properties": {"repobilityId": "24451cad7b6b1f2b", "scanner": "scanner-primary", "fingerprint": "90df9d8a875336b8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-35f903201dc31b39", "level": "note", "message": {"text": "Unused endpoint: GET /mis-sesiones"}, "properties": {"repobilityId": "a97ff78bd0b2e8ae", "scanner": "scanner-primary", "fingerprint": "35f903201dc31b39", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-75e9bbb9ef59c327", "level": "note", "message": {"text": "Unused endpoint: GET /:id/ics"}, "properties": {"repobilityId": "5e19e454e768e835", "scanner": "scanner-primary", "fingerprint": "75e9bbb9ef59c327", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-aee9168e964a3822", "level": "note", "message": {"text": "Unused endpoint: POST /verify"}, "properties": {"repobilityId": "3ad9e431dee7b305", "scanner": "scanner-primary", "fingerprint": "aee9168e964a3822", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-eb757797f6bd3444", "level": "note", "message": {"text": "Unused endpoint: POST /setup"}, "properties": {"repobilityId": "9b1d18198336b34c", "scanner": "scanner-primary", "fingerprint": "eb757797f6bd3444", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c1fa622edf221471", "level": "note", "message": {"text": "Unused endpoint: POST /verify-setup"}, "properties": {"repobilityId": "1b174111f5cacbe4", "scanner": "scanner-primary", "fingerprint": "c1fa622edf221471", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3b30f4c0994a30b4", "level": "note", "message": {"text": "Unused endpoint: DELETE /"}, "properties": {"repobilityId": "99388d712bacbbda", "scanner": "scanner-primary", "fingerprint": "3b30f4c0994a30b4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-225b2f6f7ac478be", "level": "note", "message": {"text": "Unused endpoint: GET /mis-aceptaciones"}, "properties": {"repobilityId": "729f41eb7e7ae1de", "scanner": "scanner-primary", "fingerprint": "225b2f6f7ac478be", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-aa124b4438183f78", "level": "note", "message": {"text": "Unused endpoint: POST /aceptar"}, "properties": {"repobilityId": "f3b5170a83299887", "scanner": "scanner-primary", "fingerprint": "aa124b4438183f78", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e01e92d98ae107ee", "level": "note", "message": {"text": "Unused endpoint: GET /paciente/:pacienteId"}, "properties": {"repobilityId": "0d414b9f33dc98e8", "scanner": "scanner-primary", "fingerprint": "e01e92d98ae107ee", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8c708049ffe9ee19", "level": "note", "message": {"text": "Unused endpoint: GET /mis-packs"}, "properties": {"repobilityId": "f15bc4c42de605f3", "scanner": "scanner-primary", "fingerprint": "8c708049ffe9ee19", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a61c112b611f4bb", "level": "note", "message": {"text": "Unused endpoint: DELETE /:id"}, "properties": {"repobilityId": "ee9d407af2b80b0e", "scanner": "scanner-primary", "fingerprint": "7a61c112b611f4bb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-158288b29990d2ca", "level": "note", "message": {"text": "Unused endpoint: PUT /:id/pago"}, "properties": {"repobilityId": "4b6f0fd12c3948c3", "scanner": "scanner-primary", "fingerprint": "158288b29990d2ca", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}