{"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-02399fdcf3485094", "name": "Stray `console.log` in TS/JS \u2014 server.ts:38", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server.ts:38"}, "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-506be2b95088f5d3", "name": "git log failed \u2014 history analysis incomplete", "shortDescription": {"text": "git log failed \u2014 history analysis incomplete"}, "fullDescription": {"text": "fatal: not a git repository (or any parent up to mount point /data)\nStopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9710c8d059e53154", "name": "No frontend routes/components detected", "shortDescription": {"text": "No frontend routes/components detected"}, "fullDescription": {"text": "No React/Vue/Next routes were found. This is fine for backend-only repos."}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-67a8e70bfb1a27ae", "name": "Very large file: server.ts (1287 lines)", "shortDescription": {"text": "Very large file: server.ts (1287 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "0 test file(s) for 2 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 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-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-1aaa55f9a3be87a1", "name": "Commented-code block (5 lines) in server.ts:26", "shortDescription": {"text": "Commented-code block (5 lines) in server.ts:26"}, "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-022e6399d1ef2beb", "name": "12 env vars used in code but missing from .env.example", "shortDescription": {"text": "12 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `DISABLE_HMR`, `NODE_ENV`, `RENDER_EXTERNAL_URL`, `STRIPE_PRICE_PRO_ANNUAL`, `STRIPE_PRICE_PRO_MONTHLY`, `STRIPE_PRICE_ULTRA_ANNUAL`, `STRIPE_PRICE_ULTRA_MONTHLY`, `STRIPE_SECRET_KEY` + 4 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6d0964d27e8aa7b4", "name": "Dangling fetch: POST https://identitytoolkit.googleapis.com/v1/accounts:lookup?key=${apiKey} (server.ts:95)", "shortDescription": {"text": "Dangling fetch: POST https://identitytoolkit.googleapis.com/v1/accounts:lookup?key=${apiKey} (server.ts:95)"}, "fullDescription": {"text": "`server.ts:95` calls `POST https://identitytoolkit.googleapis.com/v1/accounts:lookup?key=${apiKey}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/identitytoolkit.googleapis.com/v1/accounts/<p>`\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-0f899007c0295acc", "name": "Dangling fetch: GET https://api.telegram.org/bot${process.env.TELEGRAM_BOT_TOKEN}/getWebhookInfo (server.ts:359)", "shortDescription": {"text": "Dangling fetch: GET https://api.telegram.org/bot${process.env.TELEGRAM_BOT_TOKEN}/getWebhookInfo (server.ts:359)"}, "fullDescription": {"text": "`server.ts:359` calls `GET https://api.telegram.org/bot${process.env.TELEGRAM_BOT_TOKEN}/getWebhookInfo` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/api.telegram.org/bot/<p>/getwebhookinfo`\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-19775c21b2dd7090", "name": "Dangling fetch: POST https://api.resend.com/emails (server.ts:860)", "shortDescription": {"text": "Dangling fetch: POST https://api.resend.com/emails (server.ts:860)"}, "fullDescription": {"text": "`server.ts:860` calls `POST https://api.resend.com/emails` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\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-12572e2900b758d9", "name": "Dangling fetch: POST https://api.resend.com/emails (server.ts:1047)", "shortDescription": {"text": "Dangling fetch: POST https://api.resend.com/emails (server.ts:1047)"}, "fullDescription": {"text": "`server.ts:1047` calls `POST https://api.resend.com/emails` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\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-f1a417f69db7abbf", "name": "Dangling fetch: POST https://api.telegram.org/bot${process.env.TELEGRAM_BOT_TOKEN}/setWebhook (server.ts:1268)", "shortDescription": {"text": "Dangling fetch: POST https://api.telegram.org/bot${process.env.TELEGRAM_BOT_TOKEN}/setWebhook (server.ts:1268)"}, "fullDescription": {"text": "`server.ts:1268` calls `POST https://api.telegram.org/bot${process.env.TELEGRAM_BOT_TOKEN}/setWebhook` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/api.telegram.org/bot/<p>/setwebhook`\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-ada1cfaa9e4bde21", "name": "Unused endpoint: POST /api/webhooks/stripe", "shortDescription": {"text": "Unused endpoint: POST /api/webhooks/stripe"}, "fullDescription": {"text": "`server.ts` declares `POST /api/webhooks/stripe` 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-316c43db307befc3", "name": "Unused endpoint: USE /api/ai", "shortDescription": {"text": "Unused endpoint: USE /api/ai"}, "fullDescription": {"text": "`server.ts` declares `USE /api/ai` 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-a9ad6190aec9e96c", "name": "Unused endpoint: POST /webhooks/whatsapp", "shortDescription": {"text": "Unused endpoint: POST /webhooks/whatsapp"}, "fullDescription": {"text": "`server.ts` declares `POST /webhooks/whatsapp` 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-c194971b901a1efd", "name": "Unused endpoint: POST /webhooks/telegram", "shortDescription": {"text": "Unused endpoint: POST /webhooks/telegram"}, "fullDescription": {"text": "`server.ts` declares `POST /webhooks/telegram` 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-2924bf5478af9c97", "name": "Unused endpoint: POST /api/test-ai", "shortDescription": {"text": "Unused endpoint: POST /api/test-ai"}, "fullDescription": {"text": "`server.ts` declares `POST /api/test-ai` 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-bac7fb6a6dac6df9", "name": "Unused endpoint: GET /api/telegram/webhook-info", "shortDescription": {"text": "Unused endpoint: GET /api/telegram/webhook-info"}, "fullDescription": {"text": "`server.ts` declares `GET /api/telegram/webhook-info` 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-846db8f13eeb20f4", "name": "Unused endpoint: POST /api/telegram/request-link", "shortDescription": {"text": "Unused endpoint: POST /api/telegram/request-link"}, "fullDescription": {"text": "`server.ts` declares `POST /api/telegram/request-link` 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-47fd9d939fce100b", "name": "Unused endpoint: GET /api/telegram/status", "shortDescription": {"text": "Unused endpoint: GET /api/telegram/status"}, "fullDescription": {"text": "`server.ts` declares `GET /api/telegram/status` 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-1b50807f154a59c8", "name": "Unused endpoint: POST /api/chat/execute", "shortDescription": {"text": "Unused endpoint: POST /api/chat/execute"}, "fullDescription": {"text": "`server.ts` declares `POST /api/chat/execute` 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-f699c6eea9c4f6eb", "name": "Unused endpoint: POST /api/ai/chat", "shortDescription": {"text": "Unused endpoint: POST /api/ai/chat"}, "fullDescription": {"text": "`server.ts` declares `POST /api/ai/chat` 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-8fd84c755763314d", "name": "Unused endpoint: POST /api/ai/extract-medication", "shortDescription": {"text": "Unused endpoint: POST /api/ai/extract-medication"}, "fullDescription": {"text": "`server.ts` declares `POST /api/ai/extract-medication` 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-a1ec8d81bfb6f776", "name": "Unused endpoint: POST /api/ai/check-interactions", "shortDescription": {"text": "Unused endpoint: POST /api/ai/check-interactions"}, "fullDescription": {"text": "`server.ts` declares `POST /api/ai/check-interactions` 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-b4d87f54d62a1386", "name": "Unused endpoint: GET /api/admin/users", "shortDescription": {"text": "Unused endpoint: GET /api/admin/users"}, "fullDescription": {"text": "`server.ts` declares `GET /api/admin/users` 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-df9f73946a4a78df", "name": "Unused endpoint: PUT /api/admin/users/:userId", "shortDescription": {"text": "Unused endpoint: PUT /api/admin/users/:userId"}, "fullDescription": {"text": "`server.ts` declares `PUT /api/admin/users/: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-b94d4df5e0ba6809", "name": "Unused endpoint: DELETE /api/admin/users/:userId", "shortDescription": {"text": "Unused endpoint: DELETE /api/admin/users/:userId"}, "fullDescription": {"text": "`server.ts` declares `DELETE /api/admin/users/: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-17647dac882d1164", "name": "Unused endpoint: GET /api/admin/patients", "shortDescription": {"text": "Unused endpoint: GET /api/admin/patients"}, "fullDescription": {"text": "`server.ts` declares `GET /api/admin/patients` 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-5259ff0294389c75", "name": "Unused endpoint: POST /api/admin/patients", "shortDescription": {"text": "Unused endpoint: POST /api/admin/patients"}, "fullDescription": {"text": "`server.ts` declares `POST /api/admin/patients` 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-f767925e315e606e", "name": "Unused endpoint: PUT /api/admin/patients/:patientId", "shortDescription": {"text": "Unused endpoint: PUT /api/admin/patients/:patientId"}, "fullDescription": {"text": "`server.ts` declares `PUT /api/admin/patients/:patientId` 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-7126c22e30ea3abe", "name": "Unused endpoint: DELETE /api/admin/patients/:patientId", "shortDescription": {"text": "Unused endpoint: DELETE /api/admin/patients/:patientId"}, "fullDescription": {"text": "`server.ts` declares `DELETE /api/admin/patients/:patientId` 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-83f0dd73abcc16ba", "name": "Unused endpoint: GET /api/admin/medications", "shortDescription": {"text": "Unused endpoint: GET /api/admin/medications"}, "fullDescription": {"text": "`server.ts` declares `GET /api/admin/medications` 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-9d36872da45ddffa", "name": "Unused endpoint: POST /api/admin/medications", "shortDescription": {"text": "Unused endpoint: POST /api/admin/medications"}, "fullDescription": {"text": "`server.ts` declares `POST /api/admin/medications` 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-073a204e81991e2c", "name": "Unused endpoint: PUT /api/admin/medications/:medicationId", "shortDescription": {"text": "Unused endpoint: PUT /api/admin/medications/:medicationId"}, "fullDescription": {"text": "`server.ts` declares `PUT /api/admin/medications/:medicationId` 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-42d7893990189420", "name": "Unused endpoint: DELETE /api/admin/medications/:medicationId", "shortDescription": {"text": "Unused endpoint: DELETE /api/admin/medications/:medicationId"}, "fullDescription": {"text": "`server.ts` declares `DELETE /api/admin/medications/:medicationId` 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-3dccb25698118521", "name": "Unused endpoint: GET /api/admin/reminders", "shortDescription": {"text": "Unused endpoint: GET /api/admin/reminders"}, "fullDescription": {"text": "`server.ts` declares `GET /api/admin/reminders` 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-196fac5511330382", "name": "Unused endpoint: POST /api/admin/reminders", "shortDescription": {"text": "Unused endpoint: POST /api/admin/reminders"}, "fullDescription": {"text": "`server.ts` declares `POST /api/admin/reminders` 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-7f8c77f5a8a1938b", "name": "Unused endpoint: PUT /api/admin/reminders/:reminderId", "shortDescription": {"text": "Unused endpoint: PUT /api/admin/reminders/:reminderId"}, "fullDescription": {"text": "`server.ts` declares `PUT /api/admin/reminders/:reminderId` 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-00f0a86f07c6cc59", "name": "Unused endpoint: DELETE /api/admin/reminders/:reminderId", "shortDescription": {"text": "Unused endpoint: DELETE /api/admin/reminders/:reminderId"}, "fullDescription": {"text": "`server.ts` declares `DELETE /api/admin/reminders/:reminderId` 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-5ce555900c661fbd", "name": "Unused endpoint: GET /api/admin/dose-events", "shortDescription": {"text": "Unused endpoint: GET /api/admin/dose-events"}, "fullDescription": {"text": "`server.ts` declares `GET /api/admin/dose-events` 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-da1256f291549a2d", "name": "Unused endpoint: POST /api/transcribe", "shortDescription": {"text": "Unused endpoint: POST /api/transcribe"}, "fullDescription": {"text": "`server.ts` declares `POST /api/transcribe` 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-1eca2bab76265d3a", "name": "Unused endpoint: POST /api/test-telegram", "shortDescription": {"text": "Unused endpoint: POST /api/test-telegram"}, "fullDescription": {"text": "`server.ts` declares `POST /api/test-telegram` 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-a0187bd9a7e8d0d7", "name": "Unused endpoint: GET /api/web-push/public-key", "shortDescription": {"text": "Unused endpoint: GET /api/web-push/public-key"}, "fullDescription": {"text": "`server.ts` declares `GET /api/web-push/public-key` 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-d878b6ae2fbc5982", "name": "Unused endpoint: POST /api/web-push/subscribe", "shortDescription": {"text": "Unused endpoint: POST /api/web-push/subscribe"}, "fullDescription": {"text": "`server.ts` declares `POST /api/web-push/subscribe` 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-0b0cdea9f25344c7", "name": "Unused endpoint: POST /api/web-push/test", "shortDescription": {"text": "Unused endpoint: POST /api/web-push/test"}, "fullDescription": {"text": "`server.ts` declares `POST /api/web-push/test` 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-2f65e9a5767cf6b6", "name": "Unused endpoint: POST /api/billing/checkout", "shortDescription": {"text": "Unused endpoint: POST /api/billing/checkout"}, "fullDescription": {"text": "`server.ts` declares `POST /api/billing/checkout` 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-6583515438ad9de7", "name": "Unused endpoint: POST /api/billing/portal", "shortDescription": {"text": "Unused endpoint: POST /api/billing/portal"}, "fullDescription": {"text": "`server.ts` declares `POST /api/billing/portal` 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-6b031c7630fd881a", "name": "Unused endpoint: POST /api/send-report-email", "shortDescription": {"text": "Unused endpoint: POST /api/send-report-email"}, "fullDescription": {"text": "`server.ts` declares `POST /api/send-report-email` 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-8dcb620c3f2a83ae", "name": "Unused endpoint: POST /api/send-invitation-email", "shortDescription": {"text": "Unused endpoint: POST /api/send-invitation-email"}, "fullDescription": {"text": "`server.ts` declares `POST /api/send-invitation-email` 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-1baea44b4ba42f30", "name": "Unused endpoint: GET /webhooks/whatsapp", "shortDescription": {"text": "Unused endpoint: GET /webhooks/whatsapp"}, "fullDescription": {"text": "`server.ts` declares `GET /webhooks/whatsapp` 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-f151cb4458f65983", "name": "Unused endpoint: POST /api/invites/accept", "shortDescription": {"text": "Unused endpoint: POST /api/invites/accept"}, "fullDescription": {"text": "`server.ts` declares `POST /api/invites/accept` 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-b3faf9ca55bff417", "name": "Unused endpoint: POST /api/medfriend/run", "shortDescription": {"text": "Unused endpoint: POST /api/medfriend/run"}, "fullDescription": {"text": "`server.ts` declares `POST /api/medfriend/run` 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-cd66797d4cd12c5a", "name": "Unused endpoint: POST /api/appointments/run", "shortDescription": {"text": "Unused endpoint: POST /api/appointments/run"}, "fullDescription": {"text": "`server.ts` declares `POST /api/appointments/run` 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-9364e0b26a7ff34f", "name": "Unused endpoint: POST /api/lowstock/run", "shortDescription": {"text": "Unused endpoint: POST /api/lowstock/run"}, "fullDescription": {"text": "`server.ts` declares `POST /api/lowstock/run` 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-348b5a4cd2cc7620", "name": "Unused endpoint: POST /api/proactive/run", "shortDescription": {"text": "Unused endpoint: POST /api/proactive/run"}, "fullDescription": {"text": "`server.ts` declares `POST /api/proactive/run` 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/8566"}, "properties": {"repository": "gagrosso/pillbot-claude", "repoUrl": "https://github.com/gagrosso/pillbot-claude", "branch": "main"}, "results": [{"ruleId": "scanner-02399fdcf3485094", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server.ts:38"}, "properties": {"repobilityId": "63422c4893a0b074", "scanner": "scanner-primary", "fingerprint": "02399fdcf3485094", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-506be2b95088f5d3", "level": "none", "message": {"text": "git log failed \u2014 history analysis incomplete"}, "properties": {"repobilityId": "b424308a11bb9b22", "scanner": "scanner-primary", "fingerprint": "506be2b95088f5d3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["git", "tooling"]}}, {"ruleId": "scanner-9710c8d059e53154", "level": "none", "message": {"text": "No frontend routes/components detected"}, "properties": {"repobilityId": "44ca61485762e494", "scanner": "scanner-primary", "fingerprint": "9710c8d059e53154", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-67a8e70bfb1a27ae", "level": "note", "message": {"text": "Very large file: server.ts (1287 lines)"}, "properties": {"repobilityId": "83bb4401a5276cc8", "scanner": "scanner-primary", "fingerprint": "67a8e70bfb1a27ae", "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": "48422f0f3f31aef9", "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": "c0140947aedfb68b", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-9d79c4077342a7d0", "level": "warning", "message": {"text": "Runtime service client appears to use placeholder configuration"}, "properties": {"repobilityId": "756b39103ebe3749", "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": "7d9b77e9c5b3cbf6", "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": "071062a662b74557", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-1aaa55f9a3be87a1", "level": "none", "message": {"text": "Commented-code block (5 lines) in server.ts:26"}, "properties": {"repobilityId": "9e79f0d657e82832", "scanner": "scanner-primary", "fingerprint": "1aaa55f9a3be87a1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-022e6399d1ef2beb", "level": "note", "message": {"text": "12 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "7bf4178327da75a2", "scanner": "scanner-primary", "fingerprint": "022e6399d1ef2beb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-6d0964d27e8aa7b4", "level": "error", "message": {"text": "Dangling fetch: POST https://identitytoolkit.googleapis.com/v1/accounts:lookup?key=${apiKey} (server.ts:95)"}, "properties": {"repobilityId": "0c5a43055c3f6f65", "scanner": "scanner-primary", "fingerprint": "6d0964d27e8aa7b4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-0f899007c0295acc", "level": "error", "message": {"text": "Dangling fetch: GET https://api.telegram.org/bot${process.env.TELEGRAM_BOT_TOKEN}/getWebhookInfo (server.ts:359)"}, "properties": {"repobilityId": "df10c7b691d32bf2", "scanner": "scanner-primary", "fingerprint": "0f899007c0295acc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-19775c21b2dd7090", "level": "error", "message": {"text": "Dangling fetch: POST https://api.resend.com/emails (server.ts:860)"}, "properties": {"repobilityId": "e8ce11fcf3b3d830", "scanner": "scanner-primary", "fingerprint": "19775c21b2dd7090", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-12572e2900b758d9", "level": "error", "message": {"text": "Dangling fetch: POST https://api.resend.com/emails (server.ts:1047)"}, "properties": {"repobilityId": "933e55305b722309", "scanner": "scanner-primary", "fingerprint": "12572e2900b758d9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-f1a417f69db7abbf", "level": "error", "message": {"text": "Dangling fetch: POST https://api.telegram.org/bot${process.env.TELEGRAM_BOT_TOKEN}/setWebhook (server.ts:1268)"}, "properties": {"repobilityId": "7519ab9a318e8357", "scanner": "scanner-primary", "fingerprint": "f1a417f69db7abbf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-ada1cfaa9e4bde21", "level": "note", "message": {"text": "Unused endpoint: POST /api/webhooks/stripe"}, "properties": {"repobilityId": "c7d0a8d0a351d8c1", "scanner": "scanner-primary", "fingerprint": "ada1cfaa9e4bde21", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-316c43db307befc3", "level": "note", "message": {"text": "Unused endpoint: USE /api/ai"}, "properties": {"repobilityId": "aff0cdd30c0afa7b", "scanner": "scanner-primary", "fingerprint": "316c43db307befc3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a9ad6190aec9e96c", "level": "note", "message": {"text": "Unused endpoint: POST /webhooks/whatsapp"}, "properties": {"repobilityId": "f190b061c1c6aa51", "scanner": "scanner-primary", "fingerprint": "a9ad6190aec9e96c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c194971b901a1efd", "level": "note", "message": {"text": "Unused endpoint: POST /webhooks/telegram"}, "properties": {"repobilityId": "86694356314c26e2", "scanner": "scanner-primary", "fingerprint": "c194971b901a1efd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2924bf5478af9c97", "level": "note", "message": {"text": "Unused endpoint: POST /api/test-ai"}, "properties": {"repobilityId": "5dfea39718924a3a", "scanner": "scanner-primary", "fingerprint": "2924bf5478af9c97", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bac7fb6a6dac6df9", "level": "note", "message": {"text": "Unused endpoint: GET /api/telegram/webhook-info"}, "properties": {"repobilityId": "0e3bf1f4ac817136", "scanner": "scanner-primary", "fingerprint": "bac7fb6a6dac6df9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-846db8f13eeb20f4", "level": "note", "message": {"text": "Unused endpoint: POST /api/telegram/request-link"}, "properties": {"repobilityId": "5e45db3034077f4e", "scanner": "scanner-primary", "fingerprint": "846db8f13eeb20f4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-47fd9d939fce100b", "level": "note", "message": {"text": "Unused endpoint: GET /api/telegram/status"}, "properties": {"repobilityId": "58ff3036f98bf7c1", "scanner": "scanner-primary", "fingerprint": "47fd9d939fce100b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1b50807f154a59c8", "level": "note", "message": {"text": "Unused endpoint: POST /api/chat/execute"}, "properties": {"repobilityId": "80cec0b485aac345", "scanner": "scanner-primary", "fingerprint": "1b50807f154a59c8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f699c6eea9c4f6eb", "level": "note", "message": {"text": "Unused endpoint: POST /api/ai/chat"}, "properties": {"repobilityId": "07d4ac644135fd1b", "scanner": "scanner-primary", "fingerprint": "f699c6eea9c4f6eb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8fd84c755763314d", "level": "note", "message": {"text": "Unused endpoint: POST /api/ai/extract-medication"}, "properties": {"repobilityId": "70d8c289fd03ddb3", "scanner": "scanner-primary", "fingerprint": "8fd84c755763314d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a1ec8d81bfb6f776", "level": "note", "message": {"text": "Unused endpoint: POST /api/ai/check-interactions"}, "properties": {"repobilityId": "b52327f47de0db01", "scanner": "scanner-primary", "fingerprint": "a1ec8d81bfb6f776", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b4d87f54d62a1386", "level": "note", "message": {"text": "Unused endpoint: GET /api/admin/users"}, "properties": {"repobilityId": "98804e982c591944", "scanner": "scanner-primary", "fingerprint": "b4d87f54d62a1386", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-df9f73946a4a78df", "level": "note", "message": {"text": "Unused endpoint: PUT /api/admin/users/:userId"}, "properties": {"repobilityId": "9955ed44e44c7bd2", "scanner": "scanner-primary", "fingerprint": "df9f73946a4a78df", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b94d4df5e0ba6809", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/admin/users/:userId"}, "properties": {"repobilityId": "1ad0a13d6195c970", "scanner": "scanner-primary", "fingerprint": "b94d4df5e0ba6809", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-17647dac882d1164", "level": "note", "message": {"text": "Unused endpoint: GET /api/admin/patients"}, "properties": {"repobilityId": "289b1c57d5f83870", "scanner": "scanner-primary", "fingerprint": "17647dac882d1164", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5259ff0294389c75", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/patients"}, "properties": {"repobilityId": "cd77ec190f1a5f8e", "scanner": "scanner-primary", "fingerprint": "5259ff0294389c75", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f767925e315e606e", "level": "note", "message": {"text": "Unused endpoint: PUT /api/admin/patients/:patientId"}, "properties": {"repobilityId": "dfb6802f472879e2", "scanner": "scanner-primary", "fingerprint": "f767925e315e606e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7126c22e30ea3abe", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/admin/patients/:patientId"}, "properties": {"repobilityId": "d5cef5d638da6966", "scanner": "scanner-primary", "fingerprint": "7126c22e30ea3abe", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-83f0dd73abcc16ba", "level": "note", "message": {"text": "Unused endpoint: GET /api/admin/medications"}, "properties": {"repobilityId": "0271ff6004677b02", "scanner": "scanner-primary", "fingerprint": "83f0dd73abcc16ba", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9d36872da45ddffa", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/medications"}, "properties": {"repobilityId": "af9725aa82269be4", "scanner": "scanner-primary", "fingerprint": "9d36872da45ddffa", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-073a204e81991e2c", "level": "note", "message": {"text": "Unused endpoint: PUT /api/admin/medications/:medicationId"}, "properties": {"repobilityId": "c3058ac44428de2e", "scanner": "scanner-primary", "fingerprint": "073a204e81991e2c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-42d7893990189420", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/admin/medications/:medicationId"}, "properties": {"repobilityId": "961493b6577ba421", "scanner": "scanner-primary", "fingerprint": "42d7893990189420", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3dccb25698118521", "level": "note", "message": {"text": "Unused endpoint: GET /api/admin/reminders"}, "properties": {"repobilityId": "c9e37e44f1d762e2", "scanner": "scanner-primary", "fingerprint": "3dccb25698118521", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-196fac5511330382", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/reminders"}, "properties": {"repobilityId": "df428e04ed308345", "scanner": "scanner-primary", "fingerprint": "196fac5511330382", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7f8c77f5a8a1938b", "level": "note", "message": {"text": "Unused endpoint: PUT /api/admin/reminders/:reminderId"}, "properties": {"repobilityId": "338ba1318f238d3e", "scanner": "scanner-primary", "fingerprint": "7f8c77f5a8a1938b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-00f0a86f07c6cc59", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/admin/reminders/:reminderId"}, "properties": {"repobilityId": "01e76e48826ef505", "scanner": "scanner-primary", "fingerprint": "00f0a86f07c6cc59", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5ce555900c661fbd", "level": "note", "message": {"text": "Unused endpoint: GET /api/admin/dose-events"}, "properties": {"repobilityId": "9e6e3238a570f316", "scanner": "scanner-primary", "fingerprint": "5ce555900c661fbd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-da1256f291549a2d", "level": "note", "message": {"text": "Unused endpoint: POST /api/transcribe"}, "properties": {"repobilityId": "b71a5b338c24eb5e", "scanner": "scanner-primary", "fingerprint": "da1256f291549a2d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1eca2bab76265d3a", "level": "note", "message": {"text": "Unused endpoint: POST /api/test-telegram"}, "properties": {"repobilityId": "4d2e65986770b80a", "scanner": "scanner-primary", "fingerprint": "1eca2bab76265d3a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a0187bd9a7e8d0d7", "level": "note", "message": {"text": "Unused endpoint: GET /api/web-push/public-key"}, "properties": {"repobilityId": "7a30fa1ec8e9ecf3", "scanner": "scanner-primary", "fingerprint": "a0187bd9a7e8d0d7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d878b6ae2fbc5982", "level": "note", "message": {"text": "Unused endpoint: POST /api/web-push/subscribe"}, "properties": {"repobilityId": "526a1b8889048a8a", "scanner": "scanner-primary", "fingerprint": "d878b6ae2fbc5982", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0b0cdea9f25344c7", "level": "note", "message": {"text": "Unused endpoint: POST /api/web-push/test"}, "properties": {"repobilityId": "fd75b661be4aa159", "scanner": "scanner-primary", "fingerprint": "0b0cdea9f25344c7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2f65e9a5767cf6b6", "level": "note", "message": {"text": "Unused endpoint: POST /api/billing/checkout"}, "properties": {"repobilityId": "dfa56aea47479d7b", "scanner": "scanner-primary", "fingerprint": "2f65e9a5767cf6b6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6583515438ad9de7", "level": "note", "message": {"text": "Unused endpoint: POST /api/billing/portal"}, "properties": {"repobilityId": "8970ffca2c482088", "scanner": "scanner-primary", "fingerprint": "6583515438ad9de7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6b031c7630fd881a", "level": "note", "message": {"text": "Unused endpoint: POST /api/send-report-email"}, "properties": {"repobilityId": "4868089b2690b565", "scanner": "scanner-primary", "fingerprint": "6b031c7630fd881a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8dcb620c3f2a83ae", "level": "note", "message": {"text": "Unused endpoint: POST /api/send-invitation-email"}, "properties": {"repobilityId": "99fc779f2cecaab5", "scanner": "scanner-primary", "fingerprint": "8dcb620c3f2a83ae", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1baea44b4ba42f30", "level": "note", "message": {"text": "Unused endpoint: GET /webhooks/whatsapp"}, "properties": {"repobilityId": "f3bad24a66cadb70", "scanner": "scanner-primary", "fingerprint": "1baea44b4ba42f30", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f151cb4458f65983", "level": "note", "message": {"text": "Unused endpoint: POST /api/invites/accept"}, "properties": {"repobilityId": "6b44df8d2b99fb3a", "scanner": "scanner-primary", "fingerprint": "f151cb4458f65983", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b3faf9ca55bff417", "level": "note", "message": {"text": "Unused endpoint: POST /api/medfriend/run"}, "properties": {"repobilityId": "4ff1fad017ac8794", "scanner": "scanner-primary", "fingerprint": "b3faf9ca55bff417", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cd66797d4cd12c5a", "level": "note", "message": {"text": "Unused endpoint: POST /api/appointments/run"}, "properties": {"repobilityId": "cce5c25837b8f142", "scanner": "scanner-primary", "fingerprint": "cd66797d4cd12c5a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9364e0b26a7ff34f", "level": "note", "message": {"text": "Unused endpoint: POST /api/lowstock/run"}, "properties": {"repobilityId": "79c0ea2276754b3d", "scanner": "scanner-primary", "fingerprint": "9364e0b26a7ff34f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-348b5a4cd2cc7620", "level": "note", "message": {"text": "Unused endpoint: POST /api/proactive/run"}, "properties": {"repobilityId": "dbe6dbd3153fd554", "scanner": "scanner-primary", "fingerprint": "348b5a4cd2cc7620", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}