{"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-1cfbe5acefc0e3d9", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/index.ts:129", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/index.ts:129"}, "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-27a835e4e5b1f26d", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/lib/bookingConfirmations.ts:309", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/lib/bookingConfirmations.ts:309"}, "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-9ad67aab2bd13df4", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/lib/reengagement.ts:241", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/lib/reengagement.ts:241"}, "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-c6195cf9a0b44c4d", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/lib/digest.ts:101", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/lib/digest.ts:101"}, "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-bce458db36cea724", "name": "Icon-only button without accessible name \u2014 apps/web/src/pages/Contacts.tsx:238", "shortDescription": {"text": "Icon-only button without accessible name \u2014 apps/web/src/pages/Contacts.tsx:238"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fa3b6a3bebdfbe06", "name": "Icon-only button without accessible name \u2014 apps/web/src/pages/Calls.tsx:140", "shortDescription": {"text": "Icon-only button without accessible name \u2014 apps/web/src/pages/Calls.tsx:140"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a24d9359171dad34", "name": "TODO/FIXME marker in shipping code \u2014 apps/web/src/pages/Dashboard.tsx:189", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 apps/web/src/pages/Dashboard.tsx:189"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d9980d9104825b19", "name": "Dockerfile runs as root: apps/api/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: apps/api/Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3d70dcd36b57a39a", "name": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7673561931a5dd33", "name": "Dockerfile runs as root: apps/web/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: apps/web/Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-74e2e2316f173b7a", "name": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-269c7fe40d68b752", "name": "Docker base image is tag-pinned but not digest-pinned: nginx:stable-alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: nginx:stable-alpine"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-062304691b772f2f", "name": "Dockerfile runs as root: apps/landing/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: apps/landing/Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c92eed8be7bac2c7", "name": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7ee4d008349d0895", "name": "Docker base image is tag-pinned but not digest-pinned: nginx:stable-alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: nginx:stable-alpine"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4fb36dbab70d82f6", "name": "Dockerfile runs as root: services/rag/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: services/rag/Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7d83d77ad0a1314c", "name": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "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-e0cc87970e5641e6", "name": "Very large file: apps/web/src/pages/WhatsApp.tsx (949 lines)", "shortDescription": {"text": "Very large file: apps/web/src/pages/WhatsApp.tsx (949 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "1 test file(s) for 147 source file(s) (ratio 0.01). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b06b8d86f24c77f9", "name": "Node manifest has dependencies but no lockfile: apps/api/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: apps/api/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4a9eb7dc7c6e3880", "name": "Node manifest has dependencies but no lockfile: apps/web/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: apps/web/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d1a5df321f3fd57b", "name": "Node manifest has dependencies but no lockfile: apps/landing/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: apps/landing/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2699d5f16ae11282", "name": "Node manifest has dependencies but no lockfile: packages/shared/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: packages/shared/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "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 11 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 87 placeholder/mock markers across 31 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9d79c4077342a7d0", "name": "Runtime service client appears to use placeholder configuration", "shortDescription": {"text": "Runtime service client appears to use placeholder configuration"}, "fullDescription": {"text": "A runtime source file appears to wire Supabase/Firebase/AI/payment-style clients to placeholder URLs, keys, or fallback values. In the Fable corpus this often means the UI/API shape is present while the backend service is not actually configured."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci, tests, lockfile. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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, ci, tests, lockfile. 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-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bdf2ed834e43e4b9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/email.ts:61", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/email.ts:61"}, "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-5c2121dd56baad8f", "name": "Commented-code block (6 lines) in apps/api/src/lib/siniTree.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/src/lib/siniTree.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-04bc29b65571cefe", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/scraper.ts:31", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/scraper.ts:31"}, "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-b2bd96c90f75d37c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/agentSuggestion.ts:40", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/agentSuggestion.ts:40"}, "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-7486a72e1baac6cd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/billing.ts:135", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/billing.ts:135"}, "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-0ad1dab9439833fd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/callIntelligence.ts:59", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/callIntelligence.ts:59"}, "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-c73fe884aea8bf52", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/googleApi.ts:27", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/googleApi.ts:27"}, "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-e631ac3b5a9d819e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/rag.ts:18", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/rag.ts:18"}, "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-3bb4a6d6d0c5dcba", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/agentCreator.ts:68", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/agentCreator.ts:68"}, "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-90732eefbe3102f1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/googleOAuth.ts:78", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/googleOAuth.ts:78"}, "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-e0534e6d6d809e85", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/whatsappRuntime.ts:150", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/whatsappRuntime.ts:150"}, "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-aa8125be54930700", "name": "Commented-code block (5 lines) in apps/api/src/lib/reengagement.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/lib/reengagement.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7e4ffd80735e6d61", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/channelRuntime.ts:185", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/channelRuntime.ts:185"}, "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-bde9d5ea74d2da5d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/elevenlabs.ts:112", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/elevenlabs.ts:112"}, "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-fb5fd7e34e88d14a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/deepgram.ts:103", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/deepgram.ts:103"}, "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-617893a43041b326", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/assistantLlm.ts:18", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/assistantLlm.ts:18"}, "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-206d1a5aacf4b6af", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/twilioApi.ts:63", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/twilioApi.ts:63"}, "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-17a25ca9e4d7cb0f", "name": "Commented-code block (5 lines) in apps/api/src/routes/callerId.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/routes/callerId.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-33ed0684e8772966", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/routes/knowledge.ts:106", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/routes/knowledge.ts:106"}, "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-f89627be0938c0d1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/routes/agents.ts:757", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/routes/agents.ts:757"}, "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-bb6bbd6cd3276a73", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/routes/channels.ts:94", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/routes/channels.ts:94"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-62a8b03b954fbb64", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/components/agent-builder/ActionsSection.tsx:169", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/components/agent-builder/ActionsSection.tsx:169"}, "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-608b4dffe45334eb", "name": "Commented-code block (7 lines) in apps/web/src/components/sini/Sini.tsx:3", "shortDescription": {"text": "Commented-code block (7 lines) in apps/web/src/components/sini/Sini.tsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a85d3398419857f4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/components/sini/Sini.tsx:257", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/components/sini/Sini.tsx:257"}, "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-7ddb90ea6b95570e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/pages/Contacts.tsx:301", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/pages/Contacts.tsx:301"}, "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-e96916524f24bc02", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/pages/AuthCallback.tsx:42", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/pages/AuthCallback.tsx:42"}, "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-fa3546144c4c8522", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/pages/WhatsApp.tsx:214", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/pages/WhatsApp.tsx:214"}, "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-ee668078216faf6f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/pages/Dashboard.tsx:49", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/pages/Dashboard.tsx:49"}, "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-c5f23c3ad24ad4ee", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/pages/Bookings.tsx:143", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/pages/Bookings.tsx:143"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7b0da33a9dbcf9f7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/pages/SiniPage.tsx:155", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/pages/SiniPage.tsx:155"}, "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-c5f3daa799a66721", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/pages/Onboarding.tsx:620", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/pages/Onboarding.tsx:620"}, "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-4a7e5ccb3d0adf05", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/pages/Knowledge.tsx:147", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/pages/Knowledge.tsx:147"}, "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-28e79d9ef15f095e", "name": "Commented-code block (5 lines) in packages/shared/src/index.ts:282", "shortDescription": {"text": "Commented-code block (5 lines) in packages/shared/src/index.ts:282"}, "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: `LANG_FORCE`, `SUPABASE_INSERT_BATCH_SIZE`, `VITE_APP_URL`. 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-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nservices/rag/main.py:ingest_text, services/rag/main.py:ingest\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4cc3795b990cf904", "name": "Frontend route `/reset-password` has no Link/navigate to it \u2014 apps/web/src/App.tsx", "shortDescription": {"text": "Frontend route `/reset-password` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c8f78389ed9d5f00", "name": "Frontend route `/integrations` has no Link/navigate to it \u2014 apps/web/src/App.tsx", "shortDescription": {"text": "Frontend route `/integrations` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-75f3bcb3204c8bfa", "name": "FastAPI POST `ingest` without auth dependency \u2014 services/rag/main.py:303", "shortDescription": {"text": "FastAPI POST `ingest` without auth dependency \u2014 services/rag/main.py:303"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-198caf662fb90185", "name": "FastAPI POST `ingest_file` without auth dependency \u2014 services/rag/main.py:308", "shortDescription": {"text": "FastAPI POST `ingest_file` without auth dependency \u2014 services/rag/main.py:308"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-825dbe190fefcec8", "name": "FastAPI POST `retrieve` without auth dependency \u2014 services/rag/main.py:329", "shortDescription": {"text": "FastAPI POST `retrieve` without auth dependency \u2014 services/rag/main.py:329"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b7fb6a6ff0c756a2", "name": "Dangling fetch: POST https://comms.twilio.com/v1/Emails (apps/api/src/lib/email.ts:61)", "shortDescription": {"text": "Dangling fetch: POST https://comms.twilio.com/v1/Emails (apps/api/src/lib/email.ts:61)"}, "fullDescription": {"text": "`apps/api/src/lib/email.ts:61` calls `POST https://comms.twilio.com/v1/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:/comms.twilio.com/v1/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-9d403b1e1f31c50f", "name": "Dangling fetch: GET https://r.jina.ai/${url} (apps/api/src/lib/scraper.ts:31)", "shortDescription": {"text": "Dangling fetch: GET https://r.jina.ai/${url} (apps/api/src/lib/scraper.ts:31)"}, "fullDescription": {"text": "`apps/api/src/lib/scraper.ts:31` calls `GET https://r.jina.ai/${url}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/r.jina.ai/<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-3277bc992ee7d33d", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (apps/api/src/lib/agentSuggestion.ts:40)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (apps/api/src/lib/agentSuggestion.ts:40)"}, "fullDescription": {"text": "`apps/api/src/lib/agentSuggestion.ts:40` calls `POST https://api.openai.com/v1/chat/completions` 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.openai.com/v1/chat/completions`\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-7e0a90573b152c0b", "name": "Dangling fetch: GET https://api.mercadopago.com${path} (apps/api/src/lib/billing.ts:135)", "shortDescription": {"text": "Dangling fetch: GET https://api.mercadopago.com${path} (apps/api/src/lib/billing.ts:135)"}, "fullDescription": {"text": "`apps/api/src/lib/billing.ts:135` calls `GET https://api.mercadopago.com${path}` 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.mercadopago.com/<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-c19db197de201c54", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (apps/api/src/lib/callIntelligence.ts:59)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (apps/api/src/lib/callIntelligence.ts:59)"}, "fullDescription": {"text": "`apps/api/src/lib/callIntelligence.ts:59` calls `POST https://api.openai.com/v1/chat/completions` 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.openai.com/v1/chat/completions`\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-85221c89c82b8a32", "name": "Dangling fetch: POST https://oauth2.googleapis.com/token (apps/api/src/lib/googleApi.ts:27)", "shortDescription": {"text": "Dangling fetch: POST https://oauth2.googleapis.com/token (apps/api/src/lib/googleApi.ts:27)"}, "fullDescription": {"text": "`apps/api/src/lib/googleApi.ts:27` calls `POST https://oauth2.googleapis.com/token` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/oauth2.googleapis.com/token`\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-1c746b1ad0dcb1f5", "name": "Dangling fetch: POST https://www.googleapis.com/calendar/v3/calendars/primary/events (apps/api/src/lib/googleApi.ts:148)", "shortDescription": {"text": "Dangling fetch: POST https://www.googleapis.com/calendar/v3/calendars/primary/events (apps/api/src/lib/googleApi.ts:148)"}, "fullDescription": {"text": "`apps/api/src/lib/googleApi.ts:148` calls `POST https://www.googleapis.com/calendar/v3/calendars/primary/events` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/www.googleapis.com/calendar/v3/calendars/primary/events`\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-d80716eb84cfc278", "name": "Dangling fetch: GET https://www.googleapis.com/calendar/v3/calendars/primary/events?${params.toString()} (apps/api/src/l", "shortDescription": {"text": "Dangling fetch: GET https://www.googleapis.com/calendar/v3/calendars/primary/events?${params.toString()} (apps/api/src/lib/googleApi.ts:177)"}, "fullDescription": {"text": "`apps/api/src/lib/googleApi.ts:177` calls `GET https://www.googleapis.com/calendar/v3/calendars/primary/events?${params.toString()}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/www.googleapis.com/calendar/v3/calendars/primary/events`\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-c34386b50f7ffb45", "name": "Dangling fetch: PATCH https://www.googleapis.com/calendar/v3/calendars/primary/events/${encodeURIComponent(eventId)} (ap", "shortDescription": {"text": "Dangling fetch: PATCH https://www.googleapis.com/calendar/v3/calendars/primary/events/${encodeURIComponent(eventId)} (apps/api/src/lib/googleApi.ts:208)"}, "fullDescription": {"text": "`apps/api/src/lib/googleApi.ts:208` calls `PATCH https://www.googleapis.com/calendar/v3/calendars/primary/events/${encodeURIComponent(eventId)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/www.googleapis.com/calendar/v3/calendars/primary/events/<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-3141a3c65ce7a11e", "name": "Dangling fetch: DELETE https://www.googleapis.com/calendar/v3/calendars/primary/events/${encodeURIComponent(eventId)} (a", "shortDescription": {"text": "Dangling fetch: DELETE https://www.googleapis.com/calendar/v3/calendars/primary/events/${encodeURIComponent(eventId)} (apps/api/src/lib/googleApi.ts:225)"}, "fullDescription": {"text": "`apps/api/src/lib/googleApi.ts:225` calls `DELETE https://www.googleapis.com/calendar/v3/calendars/primary/events/${encodeURIComponent(eventId)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/www.googleapis.com/calendar/v3/calendars/primary/events/<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-50f6007c05ac891b", "name": "Dangling fetch: POST https://sheets.googleapis.com/v4/spreadsheets/${input.spreadsheetId}/values/${encodeURIComponent(ra", "shortDescription": {"text": "Dangling fetch: POST https://sheets.googleapis.com/v4/spreadsheets/${input.spreadsheetId}/values/${encodeURIComponent(range)}:append?valueInputOption=USER_ENTERED (apps/api/src/lib/googleApi.ts:248)"}, "fullDescription": {"text": "`apps/api/src/lib/googleApi.ts:248` calls `POST https://sheets.googleapis.com/v4/spreadsheets/${input.spreadsheetId}/values/${encodeURIComponent(range)}:append?valueInputOption=USER_ENTERED` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/sheets.googleapis.com/v4/spreadsheets/<p>/values/<p>/<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-60dccce7296412a3", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (apps/api/src/lib/agentCreator.ts:68)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (apps/api/src/lib/agentCreator.ts:68)"}, "fullDescription": {"text": "`apps/api/src/lib/agentCreator.ts:68` calls `POST https://api.openai.com/v1/chat/completions` 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.openai.com/v1/chat/completions`\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-b2f3d077d1c8c559", "name": "Dangling fetch: POST https://generativelanguage.googleapis.com/v1beta/models/${GEMINI_MODEL}:generateContent?key=${apiKe", "shortDescription": {"text": "Dangling fetch: POST https://generativelanguage.googleapis.com/v1beta/models/${GEMINI_MODEL}:generateContent?key=${apiKey} (apps/api/src/lib/whatsappRuntime.ts:490)"}, "fullDescription": {"text": "`apps/api/src/lib/whatsappRuntime.ts:490` calls `POST https://generativelanguage.googleapis.com/v1beta/models/${GEMINI_MODEL}:generateContent?key=${apiKey}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/generativelanguage.googleapis.com/v1beta/models/<p>/<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-37b5cb35066c5089", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (apps/api/src/lib/whatsappRuntime.ts:527)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (apps/api/src/lib/whatsappRuntime.ts:527)"}, "fullDescription": {"text": "`apps/api/src/lib/whatsappRuntime.ts:527` calls `POST https://api.openai.com/v1/chat/completions` 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.openai.com/v1/chat/completions`\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-e037b65bf3ccac20", "name": "Dangling fetch: POST https://generativelanguage.googleapis.com/v1beta/models/${GEMINI_MODEL}:generateContent?key=${apiKe", "shortDescription": {"text": "Dangling fetch: POST https://generativelanguage.googleapis.com/v1beta/models/${GEMINI_MODEL}:generateContent?key=${apiKey} (apps/api/src/lib/whatsappRuntime.ts:986)"}, "fullDescription": {"text": "`apps/api/src/lib/whatsappRuntime.ts:986` calls `POST https://generativelanguage.googleapis.com/v1beta/models/${GEMINI_MODEL}:generateContent?key=${apiKey}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/generativelanguage.googleapis.com/v1beta/models/<p>/<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-c44c602749339723", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (apps/api/src/lib/channelRuntime.ts:365)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (apps/api/src/lib/channelRuntime.ts:365)"}, "fullDescription": {"text": "`apps/api/src/lib/channelRuntime.ts:365` calls `POST https://api.openai.com/v1/chat/completions` 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.openai.com/v1/chat/completions`\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-2b0b55bee596e1a9", "name": "Dangling fetch: POST https://generativelanguage.googleapis.com/v1beta/models/${GEMINI_MODEL}:generateContent?key=${apiKe", "shortDescription": {"text": "Dangling fetch: POST https://generativelanguage.googleapis.com/v1beta/models/${GEMINI_MODEL}:generateContent?key=${apiKey} (apps/api/src/lib/channelRuntime.ts:400)"}, "fullDescription": {"text": "`apps/api/src/lib/channelRuntime.ts:400` calls `POST https://generativelanguage.googleapis.com/v1beta/models/${GEMINI_MODEL}:generateContent?key=${apiKey}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/generativelanguage.googleapis.com/v1beta/models/<p>/<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-67f436a79f1210c8", "name": "Dangling fetch: POST https://api.telegram.org/bot${input.token}/sendMessage (apps/api/src/lib/channelRuntime.ts:766)", "shortDescription": {"text": "Dangling fetch: POST https://api.telegram.org/bot${input.token}/sendMessage (apps/api/src/lib/channelRuntime.ts:766)"}, "fullDescription": {"text": "`apps/api/src/lib/channelRuntime.ts:766` calls `POST https://api.telegram.org/bot${input.token}/sendMessage` 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.telegram.org/bot/<p>/sendmessage`\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-4e686d01a88d9847", "name": "Dangling fetch: POST https://graph.facebook.com/v20.0/${input.instagramAccountId}/messages (apps/api/src/lib/channelRunt", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/v20.0/${input.instagramAccountId}/messages (apps/api/src/lib/channelRuntime.ts:787)"}, "fullDescription": {"text": "`apps/api/src/lib/channelRuntime.ts:787` calls `POST https://graph.facebook.com/v20.0/${input.instagramAccountId}/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/graph.facebook.com/v20.0/<p>/messages`\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-dbf9118c1346fbcb", "name": "Dangling fetch: GET https://api.telegram.org/bot${token}/getMe (apps/api/src/lib/channelRuntime.ts:1238)", "shortDescription": {"text": "Dangling fetch: GET https://api.telegram.org/bot${token}/getMe (apps/api/src/lib/channelRuntime.ts:1238)"}, "fullDescription": {"text": "`apps/api/src/lib/channelRuntime.ts:1238` calls `GET https://api.telegram.org/bot${token}/getMe` 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.telegram.org/bot/<p>/getme`\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-1ab76f63ec2ed89e", "name": "Dangling fetch: POST https://api.telegram.org/bot${input.token}/setWebhook (apps/api/src/lib/channelRuntime.ts:1269)", "shortDescription": {"text": "Dangling fetch: POST https://api.telegram.org/bot${input.token}/setWebhook (apps/api/src/lib/channelRuntime.ts:1269)"}, "fullDescription": {"text": "`apps/api/src/lib/channelRuntime.ts:1269` calls `POST https://api.telegram.org/bot${input.token}/setWebhook` 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.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-383c6a1858e0d864", "name": "Dangling fetch: PATCH https://api.elevenlabs.io/v1/convai/agents/${agentId} (apps/api/src/lib/elevenlabs.ts:112)", "shortDescription": {"text": "Dangling fetch: PATCH https://api.elevenlabs.io/v1/convai/agents/${agentId} (apps/api/src/lib/elevenlabs.ts:112)"}, "fullDescription": {"text": "`apps/api/src/lib/elevenlabs.ts:112` calls `PATCH https://api.elevenlabs.io/v1/convai/agents/${agentId}` 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.elevenlabs.io/v1/convai/agents/<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-e19e3ab2cd5aa720", "name": "Dangling fetch: POST https://api.elevenlabs.io/v1/convai/twilio/register-call (apps/api/src/lib/elevenlabs.ts:153)", "shortDescription": {"text": "Dangling fetch: POST https://api.elevenlabs.io/v1/convai/twilio/register-call (apps/api/src/lib/elevenlabs.ts:153)"}, "fullDescription": {"text": "`apps/api/src/lib/elevenlabs.ts:153` calls `POST https://api.elevenlabs.io/v1/convai/twilio/register-call` 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.elevenlabs.io/v1/convai/twilio/register-call`\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-8d55abdde19a90c1", "name": "Dangling fetch: POST https://api.elevenlabs.io/v1/convai/agents/${input.sourceAgentId}/duplicate (apps/api/src/lib/eleve", "shortDescription": {"text": "Dangling fetch: POST https://api.elevenlabs.io/v1/convai/agents/${input.sourceAgentId}/duplicate (apps/api/src/lib/elevenlabs.ts:191)"}, "fullDescription": {"text": "`apps/api/src/lib/elevenlabs.ts:191` calls `POST https://api.elevenlabs.io/v1/convai/agents/${input.sourceAgentId}/duplicate` 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.elevenlabs.io/v1/convai/agents/<p>/duplicate`\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-f18ceb8699983d75", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (apps/api/src/lib/assistantLlm.ts:37)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (apps/api/src/lib/assistantLlm.ts:37)"}, "fullDescription": {"text": "`apps/api/src/lib/assistantLlm.ts:37` calls `POST https://api.openai.com/v1/chat/completions` 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.openai.com/v1/chat/completions`\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-ba3a23315519ff77", "name": "Dangling fetch: POST https://generativelanguage.googleapis.com/v1beta/models/${GEMINI_MODEL}:generateContent?key=${apiKe", "shortDescription": {"text": "Dangling fetch: POST https://generativelanguage.googleapis.com/v1beta/models/${GEMINI_MODEL}:generateContent?key=${apiKey} (apps/api/src/lib/assistantLlm.ts:60)"}, "fullDescription": {"text": "`apps/api/src/lib/assistantLlm.ts:60` calls `POST https://generativelanguage.googleapis.com/v1beta/models/${GEMINI_MODEL}:generateContent?key=${apiKey}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/generativelanguage.googleapis.com/v1beta/models/<p>/<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-a205654be0ac30bd", "name": "Dangling fetch: POST https://api.twilio.com/2010-04-01/Accounts/${credentials.accountSid}/IncomingPhoneNumbers/${incomin", "shortDescription": {"text": "Dangling fetch: POST https://api.twilio.com/2010-04-01/Accounts/${credentials.accountSid}/IncomingPhoneNumbers/${incomingPhoneNumberSid}.json (apps/api/src/lib/twilioApi.ts:96)"}, "fullDescription": {"text": "`apps/api/src/lib/twilioApi.ts:96` calls `POST https://api.twilio.com/2010-04-01/Accounts/${credentials.accountSid}/IncomingPhoneNumbers/${incomingPhoneNumberSid}.json` 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.twilio.com/2010-04-01/accounts/<p>/incomingphonenumbers/<p>.json`\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-b1fb25cc38360e23", "name": "Dangling fetch: POST https://api.twilio.com/2010-04-01/Accounts/${credentials.accountSid}/IncomingPhoneNumbers.json (app", "shortDescription": {"text": "Dangling fetch: POST https://api.twilio.com/2010-04-01/Accounts/${credentials.accountSid}/IncomingPhoneNumbers.json (apps/api/src/lib/twilioApi.ts:163)"}, "fullDescription": {"text": "`apps/api/src/lib/twilioApi.ts:163` calls `POST https://api.twilio.com/2010-04-01/Accounts/${credentials.accountSid}/IncomingPhoneNumbers.json` 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.twilio.com/2010-04-01/accounts/<p>/incomingphonenumbers.json`\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-07a035f2cb7f443a", "name": "Dangling fetch: POST https://api.twilio.com/2010-04-01/Accounts/${credentials.accountSid}/Messages.json (apps/api/src/li", "shortDescription": {"text": "Dangling fetch: POST https://api.twilio.com/2010-04-01/Accounts/${credentials.accountSid}/Messages.json (apps/api/src/lib/twilioApi.ts:206)"}, "fullDescription": {"text": "`apps/api/src/lib/twilioApi.ts:206` calls `POST https://api.twilio.com/2010-04-01/Accounts/${credentials.accountSid}/Messages.json` 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.twilio.com/2010-04-01/accounts/<p>/messages.json`\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-921b223d11c5b162", "name": "Dangling fetch: POST https://api.twilio.com/2010-04-01/Accounts/${credentials.accountSid}/Messages.json (apps/api/src/li", "shortDescription": {"text": "Dangling fetch: POST https://api.twilio.com/2010-04-01/Accounts/${credentials.accountSid}/Messages.json (apps/api/src/lib/twilioApi.ts:260)"}, "fullDescription": {"text": "`apps/api/src/lib/twilioApi.ts:260` calls `POST https://api.twilio.com/2010-04-01/Accounts/${credentials.accountSid}/Messages.json` 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.twilio.com/2010-04-01/accounts/<p>/messages.json`\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-0818cc05ffcfa61d", "name": "Dangling fetch: POST https://api.twilio.com/2010-04-01/Accounts/${credentials.accountSid}/Messages.json (apps/api/src/li", "shortDescription": {"text": "Dangling fetch: POST https://api.twilio.com/2010-04-01/Accounts/${credentials.accountSid}/Messages.json (apps/api/src/lib/twilioApi.ts:294)"}, "fullDescription": {"text": "`apps/api/src/lib/twilioApi.ts:294` calls `POST https://api.twilio.com/2010-04-01/Accounts/${credentials.accountSid}/Messages.json` 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.twilio.com/2010-04-01/accounts/<p>/messages.json`\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-04b04428a2a02b5a", "name": "Dangling fetch: POST https://api.twilio.com/2010-04-01/Accounts/${credentials.accountSid}/Calls.json (apps/api/src/lib/t", "shortDescription": {"text": "Dangling fetch: POST https://api.twilio.com/2010-04-01/Accounts/${credentials.accountSid}/Calls.json (apps/api/src/lib/twilioApi.ts:330)"}, "fullDescription": {"text": "`apps/api/src/lib/twilioApi.ts:330` calls `POST https://api.twilio.com/2010-04-01/Accounts/${credentials.accountSid}/Calls.json` 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.twilio.com/2010-04-01/accounts/<p>/calls.json`\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-3b5bee2814be2653", "name": "Dangling fetch: POST https://api.twilio.com/2010-04-01/Accounts/${credentials.accountSid}/OutgoingCallerIds.json (apps/a", "shortDescription": {"text": "Dangling fetch: POST https://api.twilio.com/2010-04-01/Accounts/${credentials.accountSid}/OutgoingCallerIds.json (apps/api/src/lib/twilioApi.ts:373)"}, "fullDescription": {"text": "`apps/api/src/lib/twilioApi.ts:373` calls `POST https://api.twilio.com/2010-04-01/Accounts/${credentials.accountSid}/OutgoingCallerIds.json` 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.twilio.com/2010-04-01/accounts/<p>/outgoingcallerids.json`\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-a971f455abf0f467", "name": "Dangling fetch: GET https://api.twilio.com/2010-04-01/Accounts/${credentials.accountSid}/OutgoingCallerIds.json?${params", "shortDescription": {"text": "Dangling fetch: GET https://api.twilio.com/2010-04-01/Accounts/${credentials.accountSid}/OutgoingCallerIds.json?${params} (apps/api/src/lib/twilioApi.ts:403)"}, "fullDescription": {"text": "`apps/api/src/lib/twilioApi.ts:403` calls `GET https://api.twilio.com/2010-04-01/Accounts/${credentials.accountSid}/OutgoingCallerIds.json?${params}` 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.twilio.com/2010-04-01/accounts/<p>/outgoingcallerids.json`\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-0c26aed1d6683a0d", "name": "Dangling fetch: DELETE https://api.twilio.com/2010-04-01/Accounts/${credentials.accountSid}/OutgoingCallerIds/${existing", "shortDescription": {"text": "Dangling fetch: DELETE https://api.twilio.com/2010-04-01/Accounts/${credentials.accountSid}/OutgoingCallerIds/${existing.sid}.json (apps/api/src/lib/twilioApi.ts:428)"}, "fullDescription": {"text": "`apps/api/src/lib/twilioApi.ts:428` calls `DELETE https://api.twilio.com/2010-04-01/Accounts/${credentials.accountSid}/OutgoingCallerIds/${existing.sid}.json` 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.twilio.com/2010-04-01/accounts/<p>/outgoingcallerids/<p>.json`\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-951326f871c7d12d", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (apps/api/src/routes/ai.ts:45)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (apps/api/src/routes/ai.ts:45)"}, "fullDescription": {"text": "`apps/api/src/routes/ai.ts:45` calls `POST https://api.openai.com/v1/chat/completions` 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.openai.com/v1/chat/completions`\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-65a667bcc38fb792", "name": "Unused endpoint: POST /ingest", "shortDescription": {"text": "Unused endpoint: POST /ingest"}, "fullDescription": {"text": "`services/rag/main.py` declares `POST /ingest` 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-e1e11dcc6687c8ae", "name": "Unused endpoint: POST /ingest-file", "shortDescription": {"text": "Unused endpoint: POST /ingest-file"}, "fullDescription": {"text": "`services/rag/main.py` declares `POST /ingest-file` 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-f4b620a3a92ab4af", "name": "Unused endpoint: POST /retrieve", "shortDescription": {"text": "Unused endpoint: POST /retrieve"}, "fullDescription": {"text": "`services/rag/main.py` declares `POST /retrieve` 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-fcf2f086be292af2", "name": "Unused endpoint: USE /agents", "shortDescription": {"text": "Unused endpoint: USE /agents"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /agents` 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-92971b0c3e2623ca", "name": "Unused endpoint: USE /leads", "shortDescription": {"text": "Unused endpoint: USE /leads"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /leads` 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-5de532c8657fd2b3", "name": "Unused endpoint: USE /calls", "shortDescription": {"text": "Unused endpoint: USE /calls"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /calls` 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-7cf5d93546ad6a38", "name": "Unused endpoint: USE /knowledge", "shortDescription": {"text": "Unused endpoint: USE /knowledge"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /knowledge` 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-0ad8505b0a2b17ef", "name": "Unused endpoint: USE /bookings", "shortDescription": {"text": "Unused endpoint: USE /bookings"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /bookings` 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-952e8de0b138e835", "name": "Unused endpoint: USE /contacts", "shortDescription": {"text": "Unused endpoint: USE /contacts"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /contacts` 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-e1bfcfeccbb4f1ff", "name": "Unused endpoint: USE /usage", "shortDescription": {"text": "Unused endpoint: USE /usage"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /usage` 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-a41c87a0ed92a0fd", "name": "Unused endpoint: USE /billing", "shortDescription": {"text": "Unused endpoint: USE /billing"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /billing` 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-199bea4e2fc20107", "name": "Unused endpoint: USE /conversations", "shortDescription": {"text": "Unused endpoint: USE /conversations"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /conversations` 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-17b022de3e693398", "name": "Unused endpoint: USE /whatsapp", "shortDescription": {"text": "Unused endpoint: USE /whatsapp"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /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-52c7ea5eb5570860", "name": "Unused endpoint: USE /channels", "shortDescription": {"text": "Unused endpoint: USE /channels"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /channels` 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-fd458eb13d1de46b", "name": "Unused endpoint: USE /integrations", "shortDescription": {"text": "Unused endpoint: USE /integrations"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /integrations` 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-800d9e1d607a2d70", "name": "Unused endpoint: USE /tenant", "shortDescription": {"text": "Unused endpoint: USE /tenant"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /tenant` 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-812ffd875e31460d", "name": "Unused endpoint: USE /catalog", "shortDescription": {"text": "Unused endpoint: USE /catalog"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /catalog` 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-b19641c975bab74e", "name": "Unused endpoint: USE /assistant", "shortDescription": {"text": "Unused endpoint: USE /assistant"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /assistant` 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-c9e2f0ba1838be2c", "name": "Unused endpoint: USE /composio", "shortDescription": {"text": "Unused endpoint: USE /composio"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /composio` 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-d80629752210b855", "name": "Unused endpoint: USE /notifications", "shortDescription": {"text": "Unused endpoint: USE /notifications"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /notifications` 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-6bdcbf2073dfa768", "name": "Unused endpoint: USE /ai", "shortDescription": {"text": "Unused endpoint: USE /ai"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /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-e85d4bdf5a374098", "name": "Unused endpoint: USE /provision", "shortDescription": {"text": "Unused endpoint: USE /provision"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /provision` 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-1e05ba1cd37b6101", "name": "Unused endpoint: USE /webhooks", "shortDescription": {"text": "Unused endpoint: USE /webhooks"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /webhooks` 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-f1084bc3b7a4f4bb", "name": "Unused endpoint: GET /products", "shortDescription": {"text": "Unused endpoint: GET /products"}, "fullDescription": {"text": "`apps/api/src/routes/catalog.ts` declares `GET /products` 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-cca7583916efd86a", "name": "Unused endpoint: POST /products", "shortDescription": {"text": "Unused endpoint: POST /products"}, "fullDescription": {"text": "`apps/api/src/routes/catalog.ts` declares `POST /products` 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-3312ed671532b931", "name": "Unused endpoint: PUT /products/:id", "shortDescription": {"text": "Unused endpoint: PUT /products/:id"}, "fullDescription": {"text": "`apps/api/src/routes/catalog.ts` declares `PUT /products/: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-631d58d0d714102a", "name": "Unused endpoint: DELETE /products/:id", "shortDescription": {"text": "Unused endpoint: DELETE /products/:id"}, "fullDescription": {"text": "`apps/api/src/routes/catalog.ts` declares `DELETE /products/: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-0328e9bdbb61fa68", "name": "Unused endpoint: GET /orders", "shortDescription": {"text": "Unused endpoint: GET /orders"}, "fullDescription": {"text": "`apps/api/src/routes/catalog.ts` declares `GET /orders` 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-bd29745abb69000e", "name": "Unused endpoint: POST /generate-pitch-block", "shortDescription": {"text": "Unused endpoint: POST /generate-pitch-block"}, "fullDescription": {"text": "`apps/api/src/routes/ai.ts` declares `POST /generate-pitch-block` 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-2083a87719497893", "name": "Unused endpoint: POST /stripe", "shortDescription": {"text": "Unused endpoint: POST /stripe"}, "fullDescription": {"text": "`apps/api/src/routes/webhooks.ts` declares `POST /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-d1ed0c52d54341af", "name": "Unused endpoint: POST /mercadopago", "shortDescription": {"text": "Unused endpoint: POST /mercadopago"}, "fullDescription": {"text": "`apps/api/src/routes/webhooks.ts` declares `POST /mercadopago` 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-ae27a3f09c47aead", "name": "Unused endpoint: POST /twilio/status", "shortDescription": {"text": "Unused endpoint: POST /twilio/status"}, "fullDescription": {"text": "`apps/api/src/routes/webhooks.ts` declares `POST /twilio/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-ef00178afbf31ab6", "name": "Unused endpoint: POST /twilio/voice", "shortDescription": {"text": "Unused endpoint: POST /twilio/voice"}, "fullDescription": {"text": "`apps/api/src/routes/webhooks.ts` declares `POST /twilio/voice` 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-b48e2c9415c8c62b", "name": "Unused endpoint: POST /twilio/whatsapp", "shortDescription": {"text": "Unused endpoint: POST /twilio/whatsapp"}, "fullDescription": {"text": "`apps/api/src/routes/webhooks.ts` declares `POST /twilio/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-2f5307cadbafb707", "name": "Unused endpoint: POST /telegram/:connectionId", "shortDescription": {"text": "Unused endpoint: POST /telegram/:connectionId"}, "fullDescription": {"text": "`apps/api/src/routes/webhooks.ts` declares `POST /telegram/:connectionId` 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-833edacd3634c902", "name": "Unused endpoint: GET /meta", "shortDescription": {"text": "Unused endpoint: GET /meta"}, "fullDescription": {"text": "`apps/api/src/routes/webhooks.ts` declares `GET /meta` 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-ffe2534796f5e574", "name": "Unused endpoint: POST /meta", "shortDescription": {"text": "Unused endpoint: POST /meta"}, "fullDescription": {"text": "`apps/api/src/routes/webhooks.ts` declares `POST /meta` 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-1e409e685d02044f", "name": "Unused endpoint: POST /property-inbox/:connectionId", "shortDescription": {"text": "Unused endpoint: POST /property-inbox/:connectionId"}, "fullDescription": {"text": "`apps/api/src/routes/webhooks.ts` declares `POST /property-inbox/:connectionId` 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-758dd96c1b239862", "name": "Unused endpoint: POST /elevenlabs/tool", "shortDescription": {"text": "Unused endpoint: POST /elevenlabs/tool"}, "fullDescription": {"text": "`apps/api/src/routes/webhooks.ts` declares `POST /elevenlabs/tool` 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-04a405bb6e5292b6", "name": "Unused endpoint: POST /elevenlabs/post-call", "shortDescription": {"text": "Unused endpoint: POST /elevenlabs/post-call"}, "fullDescription": {"text": "`apps/api/src/routes/webhooks.ts` declares `POST /elevenlabs/post-call` 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-d66620f80b8de740", "name": "Unused endpoint: GET /connections", "shortDescription": {"text": "Unused endpoint: GET /connections"}, "fullDescription": {"text": "`apps/api/src/routes/composio.ts` declares `GET /connections` 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-2e3e6122851ea1cb", "name": "Unused endpoint: GET /actions", "shortDescription": {"text": "Unused endpoint: GET /actions"}, "fullDescription": {"text": "`apps/api/src/routes/composio.ts` declares `GET /actions` 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-8664e7608b8880ea", "name": "Unused endpoint: POST /connect", "shortDescription": {"text": "Unused endpoint: POST /connect"}, "fullDescription": {"text": "`apps/api/src/routes/composio.ts` declares `POST /connect` 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-8bb35cd3435ea080", "name": "Unused endpoint: POST /create-checkout", "shortDescription": {"text": "Unused endpoint: POST /create-checkout"}, "fullDescription": {"text": "`apps/api/src/routes/billing.ts` declares `POST /create-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-1ec7e423e24778e4", "name": "Unused endpoint: POST /portal", "shortDescription": {"text": "Unused endpoint: POST /portal"}, "fullDescription": {"text": "`apps/api/src/routes/billing.ts` declares `POST /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-c67ddea3c17528d6", "name": "Unused endpoint: GET /subscription", "shortDescription": {"text": "Unused endpoint: GET /subscription"}, "fullDescription": {"text": "`apps/api/src/routes/billing.ts` declares `GET /subscription` 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-cff8da5fbc19c76d", "name": "Unused endpoint: POST /chat", "shortDescription": {"text": "Unused endpoint: POST /chat"}, "fullDescription": {"text": "`apps/api/src/routes/assistant.ts` declares `POST /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-85f7f661f5ff7ac4", "name": "Unused endpoint: POST /draft/apply", "shortDescription": {"text": "Unused endpoint: POST /draft/apply"}, "fullDescription": {"text": "`apps/api/src/routes/assistant.ts` declares `POST /draft/apply` 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": "`apps/api/src/routes/callerId.ts` 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-a13a7e97aeacf55f", "name": "Unused endpoint: POST /start", "shortDescription": {"text": "Unused endpoint: POST /start"}, "fullDescription": {"text": "`apps/api/src/routes/callerId.ts` declares `POST /start` 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/19714"}, "properties": {"repository": "sinapsioia/NEW-SINAPSIO", "repoUrl": "https://github.com/sinapsioia/NEW-SINAPSIO", "branch": "main"}, "results": [{"ruleId": "scanner-1cfbe5acefc0e3d9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/index.ts:129"}, "properties": {"repobilityId": "a178156af585d748", "scanner": "scanner-primary", "fingerprint": "1cfbe5acefc0e3d9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-27a835e4e5b1f26d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/lib/bookingConfirmations.ts:309"}, "properties": {"repobilityId": "2ea5799ac3194a6d", "scanner": "scanner-primary", "fingerprint": "27a835e4e5b1f26d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9ad67aab2bd13df4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/lib/reengagement.ts:241"}, "properties": {"repobilityId": "e190a04fda3c09aa", "scanner": "scanner-primary", "fingerprint": "9ad67aab2bd13df4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c6195cf9a0b44c4d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/lib/digest.ts:101"}, "properties": {"repobilityId": "dd8327f2c1733377", "scanner": "scanner-primary", "fingerprint": "c6195cf9a0b44c4d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bce458db36cea724", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 apps/web/src/pages/Contacts.tsx:238"}, "properties": {"repobilityId": "9ecb31b4ed6906d6", "scanner": "scanner-primary", "fingerprint": "bce458db36cea724", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-fa3b6a3bebdfbe06", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 apps/web/src/pages/Calls.tsx:140"}, "properties": {"repobilityId": "4acae84aa05f318c", "scanner": "scanner-primary", "fingerprint": "fa3b6a3bebdfbe06", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-a24d9359171dad34", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 apps/web/src/pages/Dashboard.tsx:189"}, "properties": {"repobilityId": "4edc72b249be1d41", "scanner": "scanner-primary", "fingerprint": "a24d9359171dad34", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-d9980d9104825b19", "level": "warning", "message": {"text": "Dockerfile runs as root: apps/api/Dockerfile"}, "properties": {"repobilityId": "e591b11d8a0c1fe7", "scanner": "scanner-primary", "fingerprint": "d9980d9104825b19", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-3d70dcd36b57a39a", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "properties": {"repobilityId": "71f0b8ed23d852bf", "scanner": "scanner-primary", "fingerprint": "3d70dcd36b57a39a", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3d70dcd36b57a39a", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "properties": {"repobilityId": "40224a4ab777abb9", "scanner": "scanner-primary", "fingerprint": "3d70dcd36b57a39a", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/Dockerfile"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-7673561931a5dd33", "level": "warning", "message": {"text": "Dockerfile runs as root: apps/web/Dockerfile"}, "properties": {"repobilityId": "d68d7937b96d047d", "scanner": "scanner-primary", "fingerprint": "7673561931a5dd33", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-74e2e2316f173b7a", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "properties": {"repobilityId": "a06183a8193bac3e", "scanner": "scanner-primary", "fingerprint": "74e2e2316f173b7a", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-269c7fe40d68b752", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: nginx:stable-alpine"}, "properties": {"repobilityId": "674333ef53825cb4", "scanner": "scanner-primary", "fingerprint": "269c7fe40d68b752", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/Dockerfile"}, "region": {"startLine": 30}}}]}, {"ruleId": "scanner-062304691b772f2f", "level": "warning", "message": {"text": "Dockerfile runs as root: apps/landing/Dockerfile"}, "properties": {"repobilityId": "221fb8e9b279190d", "scanner": "scanner-primary", "fingerprint": "062304691b772f2f", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-c92eed8be7bac2c7", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "properties": {"repobilityId": "5a94aa558f6f9d5b", "scanner": "scanner-primary", "fingerprint": "c92eed8be7bac2c7", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/landing/Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7ee4d008349d0895", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: nginx:stable-alpine"}, "properties": {"repobilityId": "fb7fc1487cd2d46d", "scanner": "scanner-primary", "fingerprint": "7ee4d008349d0895", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/landing/Dockerfile"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-4fb36dbab70d82f6", "level": "warning", "message": {"text": "Dockerfile runs as root: services/rag/Dockerfile"}, "properties": {"repobilityId": "9c7509db35266a20", "scanner": "scanner-primary", "fingerprint": "4fb36dbab70d82f6", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-7d83d77ad0a1314c", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim"}, "properties": {"repobilityId": "bc5802f040f1fbae", "scanner": "scanner-primary", "fingerprint": "7d83d77ad0a1314c", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/rag/Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"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-e0cc87970e5641e6", "level": "note", "message": {"text": "Very large file: apps/web/src/pages/WhatsApp.tsx (949 lines)"}, "properties": {"repobilityId": "6460aed9db47fe61", "scanner": "scanner-primary", "fingerprint": "e0cc87970e5641e6", "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": "393aba29531215e1", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-b06b8d86f24c77f9", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: apps/api/package.json"}, "properties": {"repobilityId": "ce77cd34ed0306d4", "scanner": "scanner-primary", "fingerprint": "b06b8d86f24c77f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4a9eb7dc7c6e3880", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: apps/web/package.json"}, "properties": {"repobilityId": "6c1704bf24cf19ac", "scanner": "scanner-primary", "fingerprint": "4a9eb7dc7c6e3880", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d1a5df321f3fd57b", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: apps/landing/package.json"}, "properties": {"repobilityId": "19b930b9f218b418", "scanner": "scanner-primary", "fingerprint": "d1a5df321f3fd57b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/landing/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2699d5f16ae11282", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: packages/shared/package.json"}, "properties": {"repobilityId": "37ac218a4ef9b430", "scanner": "scanner-primary", "fingerprint": "2699d5f16ae11282", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/shared/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "17464b73645bb84c", "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": "e99b01b3543979ae", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-9d79c4077342a7d0", "level": "warning", "message": {"text": "Runtime service client appears to use placeholder configuration"}, "properties": {"repobilityId": "824310ef5b0da486", "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": "6ef86a19c72349ad", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "8bfe541a115c2f2c", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "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": "b541fa367594b092", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "349a29f9f4f4c8c9", "scanner": "scanner-primary", "fingerprint": "ea8f3013f588db25", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-8424db9c75e04ba4", "level": "none", "message": {"text": "Very short observed git history"}, "properties": {"repobilityId": "c0de980c0d7920bc", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-bdf2ed834e43e4b9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/email.ts:61"}, "properties": {"repobilityId": "f887a1e1cb9c30cb", "scanner": "scanner-primary", "fingerprint": "bdf2ed834e43e4b9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5c2121dd56baad8f", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/src/lib/siniTree.ts:3"}, "properties": {"repobilityId": "3c80ba40102b0997", "scanner": "scanner-primary", "fingerprint": "5c2121dd56baad8f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-04bc29b65571cefe", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/scraper.ts:31"}, "properties": {"repobilityId": "bdbf9aa75388d28d", "scanner": "scanner-primary", "fingerprint": "04bc29b65571cefe", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b2bd96c90f75d37c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/agentSuggestion.ts:40"}, "properties": {"repobilityId": "f45c0f38fccb06af", "scanner": "scanner-primary", "fingerprint": "b2bd96c90f75d37c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7486a72e1baac6cd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/billing.ts:135"}, "properties": {"repobilityId": "e796acedc63d1788", "scanner": "scanner-primary", "fingerprint": "7486a72e1baac6cd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0ad1dab9439833fd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/callIntelligence.ts:59"}, "properties": {"repobilityId": "5bece88b23487c65", "scanner": "scanner-primary", "fingerprint": "0ad1dab9439833fd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c73fe884aea8bf52", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/googleApi.ts:27"}, "properties": {"repobilityId": "43fd9b8a966db01c", "scanner": "scanner-primary", "fingerprint": "c73fe884aea8bf52", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e631ac3b5a9d819e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/rag.ts:18"}, "properties": {"repobilityId": "e8b295f2fbe6ad35", "scanner": "scanner-primary", "fingerprint": "e631ac3b5a9d819e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3bb4a6d6d0c5dcba", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/agentCreator.ts:68"}, "properties": {"repobilityId": "f95783e8fbbf18cb", "scanner": "scanner-primary", "fingerprint": "3bb4a6d6d0c5dcba", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-90732eefbe3102f1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/googleOAuth.ts:78"}, "properties": {"repobilityId": "8b54fadc27dcee44", "scanner": "scanner-primary", "fingerprint": "90732eefbe3102f1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e0534e6d6d809e85", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/whatsappRuntime.ts:150"}, "properties": {"repobilityId": "b7380af759960c4e", "scanner": "scanner-primary", "fingerprint": "e0534e6d6d809e85", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-aa8125be54930700", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/lib/reengagement.ts:3"}, "properties": {"repobilityId": "a9543fb5a8cd92c0", "scanner": "scanner-primary", "fingerprint": "aa8125be54930700", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7e4ffd80735e6d61", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/channelRuntime.ts:185"}, "properties": {"repobilityId": "eff2c3464f8daa3c", "scanner": "scanner-primary", "fingerprint": "7e4ffd80735e6d61", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bde9d5ea74d2da5d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/elevenlabs.ts:112"}, "properties": {"repobilityId": "1fda469980be4879", "scanner": "scanner-primary", "fingerprint": "bde9d5ea74d2da5d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fb5fd7e34e88d14a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/deepgram.ts:103"}, "properties": {"repobilityId": "6e18bf6ba3e5d70d", "scanner": "scanner-primary", "fingerprint": "fb5fd7e34e88d14a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-617893a43041b326", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/assistantLlm.ts:18"}, "properties": {"repobilityId": "d62304bc3571c5c8", "scanner": "scanner-primary", "fingerprint": "617893a43041b326", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-206d1a5aacf4b6af", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/twilioApi.ts:63"}, "properties": {"repobilityId": "969e3b1601b48d96", "scanner": "scanner-primary", "fingerprint": "206d1a5aacf4b6af", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-17a25ca9e4d7cb0f", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/routes/callerId.ts:1"}, "properties": {"repobilityId": "1535087835138c07", "scanner": "scanner-primary", "fingerprint": "17a25ca9e4d7cb0f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-33ed0684e8772966", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/routes/knowledge.ts:106"}, "properties": {"repobilityId": "d5f613ab1be6b568", "scanner": "scanner-primary", "fingerprint": "33ed0684e8772966", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f89627be0938c0d1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/routes/agents.ts:757"}, "properties": {"repobilityId": "1c0273d481c1a842", "scanner": "scanner-primary", "fingerprint": "f89627be0938c0d1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bb6bbd6cd3276a73", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/routes/channels.ts:94"}, "properties": {"repobilityId": "cd6b5677526a90d2", "scanner": "scanner-primary", "fingerprint": "bb6bbd6cd3276a73", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-62a8b03b954fbb64", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/components/agent-builder/ActionsSection.tsx:169"}, "properties": {"repobilityId": "55e711352d881f40", "scanner": "scanner-primary", "fingerprint": "62a8b03b954fbb64", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-608b4dffe45334eb", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/web/src/components/sini/Sini.tsx:3"}, "properties": {"repobilityId": "2e85bf43e137dfee", "scanner": "scanner-primary", "fingerprint": "608b4dffe45334eb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a85d3398419857f4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/components/sini/Sini.tsx:257"}, "properties": {"repobilityId": "1a9fc3ec1398e561", "scanner": "scanner-primary", "fingerprint": "a85d3398419857f4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7ddb90ea6b95570e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/pages/Contacts.tsx:301"}, "properties": {"repobilityId": "2487dbf4778908ff", "scanner": "scanner-primary", "fingerprint": "7ddb90ea6b95570e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e96916524f24bc02", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/pages/AuthCallback.tsx:42"}, "properties": {"repobilityId": "1959e1f64b37a51b", "scanner": "scanner-primary", "fingerprint": "e96916524f24bc02", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fa3546144c4c8522", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/pages/WhatsApp.tsx:214"}, "properties": {"repobilityId": "2a7341ddcc3910e7", "scanner": "scanner-primary", "fingerprint": "fa3546144c4c8522", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ee668078216faf6f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/pages/Dashboard.tsx:49"}, "properties": {"repobilityId": "afd7344b47ea14f1", "scanner": "scanner-primary", "fingerprint": "ee668078216faf6f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c5f23c3ad24ad4ee", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/pages/Bookings.tsx:143"}, "properties": {"repobilityId": "080589277e4e1f50", "scanner": "scanner-primary", "fingerprint": "c5f23c3ad24ad4ee", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7b0da33a9dbcf9f7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/pages/SiniPage.tsx:155"}, "properties": {"repobilityId": "220b1eaab189676a", "scanner": "scanner-primary", "fingerprint": "7b0da33a9dbcf9f7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c5f3daa799a66721", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/pages/Onboarding.tsx:620"}, "properties": {"repobilityId": "f611bdee95fbcaff", "scanner": "scanner-primary", "fingerprint": "c5f3daa799a66721", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4a7e5ccb3d0adf05", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/pages/Knowledge.tsx:147"}, "properties": {"repobilityId": "31a9032ce5738513", "scanner": "scanner-primary", "fingerprint": "4a7e5ccb3d0adf05", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-28e79d9ef15f095e", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/shared/src/index.ts:282"}, "properties": {"repobilityId": "6f586319e6d4334f", "scanner": "scanner-primary", "fingerprint": "28e79d9ef15f095e", "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-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "1a5750e1c1833340", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-4cc3795b990cf904", "level": "warning", "message": {"text": "Frontend route `/reset-password` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "properties": {"repobilityId": "57214da4f98acb65", "scanner": "scanner-primary", "fingerprint": "4cc3795b990cf904", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c8f78389ed9d5f00", "level": "warning", "message": {"text": "Frontend route `/integrations` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "properties": {"repobilityId": "e845df029579443b", "scanner": "scanner-primary", "fingerprint": "c8f78389ed9d5f00", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-75f3bcb3204c8bfa", "level": "error", "message": {"text": "FastAPI POST `ingest` without auth dependency \u2014 services/rag/main.py:303"}, "properties": {"repobilityId": "4ae8c7d5984d57bb", "scanner": "scanner-primary", "fingerprint": "75f3bcb3204c8bfa", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/rag/main.py"}, "region": {"startLine": 303}}}]}, {"ruleId": "scanner-198caf662fb90185", "level": "error", "message": {"text": "FastAPI POST `ingest_file` without auth dependency \u2014 services/rag/main.py:308"}, "properties": {"repobilityId": "f6761311580557d3", "scanner": "scanner-primary", "fingerprint": "198caf662fb90185", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/rag/main.py"}, "region": {"startLine": 308}}}]}, {"ruleId": "scanner-825dbe190fefcec8", "level": "error", "message": {"text": "FastAPI POST `retrieve` without auth dependency \u2014 services/rag/main.py:329"}, "properties": {"repobilityId": "c2ba3bd5e2efac7f", "scanner": "scanner-primary", "fingerprint": "825dbe190fefcec8", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/rag/main.py"}, "region": {"startLine": 329}}}]}, {"ruleId": "scanner-b7fb6a6ff0c756a2", "level": "error", "message": {"text": "Dangling fetch: POST https://comms.twilio.com/v1/Emails (apps/api/src/lib/email.ts:61)"}, "properties": {"repobilityId": "31be5c0095f301e7", "scanner": "scanner-primary", "fingerprint": "b7fb6a6ff0c756a2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9d403b1e1f31c50f", "level": "error", "message": {"text": "Dangling fetch: GET https://r.jina.ai/${url} (apps/api/src/lib/scraper.ts:31)"}, "properties": {"repobilityId": "749c012a1ead3265", "scanner": "scanner-primary", "fingerprint": "9d403b1e1f31c50f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3277bc992ee7d33d", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (apps/api/src/lib/agentSuggestion.ts:40)"}, "properties": {"repobilityId": "3c6a9b980d9412f9", "scanner": "scanner-primary", "fingerprint": "3277bc992ee7d33d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7e0a90573b152c0b", "level": "error", "message": {"text": "Dangling fetch: GET https://api.mercadopago.com${path} (apps/api/src/lib/billing.ts:135)"}, "properties": {"repobilityId": "b628db50a6012d60", "scanner": "scanner-primary", "fingerprint": "7e0a90573b152c0b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c19db197de201c54", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (apps/api/src/lib/callIntelligence.ts:59)"}, "properties": {"repobilityId": "9b731c2d51bdff22", "scanner": "scanner-primary", "fingerprint": "c19db197de201c54", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-85221c89c82b8a32", "level": "error", "message": {"text": "Dangling fetch: POST https://oauth2.googleapis.com/token (apps/api/src/lib/googleApi.ts:27)"}, "properties": {"repobilityId": "e438d1f2d087c400", "scanner": "scanner-primary", "fingerprint": "85221c89c82b8a32", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1c746b1ad0dcb1f5", "level": "error", "message": {"text": "Dangling fetch: POST https://www.googleapis.com/calendar/v3/calendars/primary/events (apps/api/src/lib/googleApi.ts:148)"}, "properties": {"repobilityId": "463909522ad61000", "scanner": "scanner-primary", "fingerprint": "1c746b1ad0dcb1f5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d80716eb84cfc278", "level": "error", "message": {"text": "Dangling fetch: GET https://www.googleapis.com/calendar/v3/calendars/primary/events?${params.toString()} (apps/api/src/lib/googleApi.ts:177)"}, "properties": {"repobilityId": "0da775840b04b7e4", "scanner": "scanner-primary", "fingerprint": "d80716eb84cfc278", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c34386b50f7ffb45", "level": "error", "message": {"text": "Dangling fetch: PATCH https://www.googleapis.com/calendar/v3/calendars/primary/events/${encodeURIComponent(eventId)} (apps/api/src/lib/googleApi.ts:208)"}, "properties": {"repobilityId": "66080b8a32a00314", "scanner": "scanner-primary", "fingerprint": "c34386b50f7ffb45", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3141a3c65ce7a11e", "level": "error", "message": {"text": "Dangling fetch: DELETE https://www.googleapis.com/calendar/v3/calendars/primary/events/${encodeURIComponent(eventId)} (apps/api/src/lib/googleApi.ts:225)"}, "properties": {"repobilityId": "4e72e9e89556025b", "scanner": "scanner-primary", "fingerprint": "3141a3c65ce7a11e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-50f6007c05ac891b", "level": "error", "message": {"text": "Dangling fetch: POST https://sheets.googleapis.com/v4/spreadsheets/${input.spreadsheetId}/values/${encodeURIComponent(range)}:append?valueInputOption=USER_ENTERED (apps/api/src/lib/googleApi.ts:248)"}, "properties": {"repobilityId": "ca2a8d1dc0bc6a0c", "scanner": "scanner-primary", "fingerprint": "50f6007c05ac891b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-60dccce7296412a3", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (apps/api/src/lib/agentCreator.ts:68)"}, "properties": {"repobilityId": "ff4ef1c442473b75", "scanner": "scanner-primary", "fingerprint": "60dccce7296412a3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b2f3d077d1c8c559", "level": "error", "message": {"text": "Dangling fetch: POST https://generativelanguage.googleapis.com/v1beta/models/${GEMINI_MODEL}:generateContent?key=${apiKey} (apps/api/src/lib/whatsappRuntime.ts:490)"}, "properties": {"repobilityId": "cf5a3df2d496f930", "scanner": "scanner-primary", "fingerprint": "b2f3d077d1c8c559", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-37b5cb35066c5089", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (apps/api/src/lib/whatsappRuntime.ts:527)"}, "properties": {"repobilityId": "f73e33515c390551", "scanner": "scanner-primary", "fingerprint": "37b5cb35066c5089", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e037b65bf3ccac20", "level": "error", "message": {"text": "Dangling fetch: POST https://generativelanguage.googleapis.com/v1beta/models/${GEMINI_MODEL}:generateContent?key=${apiKey} (apps/api/src/lib/whatsappRuntime.ts:986)"}, "properties": {"repobilityId": "6af3fba14bd11d21", "scanner": "scanner-primary", "fingerprint": "e037b65bf3ccac20", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c44c602749339723", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (apps/api/src/lib/channelRuntime.ts:365)"}, "properties": {"repobilityId": "2351496b3d9d5ba0", "scanner": "scanner-primary", "fingerprint": "c44c602749339723", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2b0b55bee596e1a9", "level": "error", "message": {"text": "Dangling fetch: POST https://generativelanguage.googleapis.com/v1beta/models/${GEMINI_MODEL}:generateContent?key=${apiKey} (apps/api/src/lib/channelRuntime.ts:400)"}, "properties": {"repobilityId": "4efb73402557c9c3", "scanner": "scanner-primary", "fingerprint": "2b0b55bee596e1a9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-67f436a79f1210c8", "level": "error", "message": {"text": "Dangling fetch: POST https://api.telegram.org/bot${input.token}/sendMessage (apps/api/src/lib/channelRuntime.ts:766)"}, "properties": {"repobilityId": "eb689d70fb074759", "scanner": "scanner-primary", "fingerprint": "67f436a79f1210c8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4e686d01a88d9847", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/v20.0/${input.instagramAccountId}/messages (apps/api/src/lib/channelRuntime.ts:787)"}, "properties": {"repobilityId": "8765b1f09978af16", "scanner": "scanner-primary", "fingerprint": "4e686d01a88d9847", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-dbf9118c1346fbcb", "level": "error", "message": {"text": "Dangling fetch: GET https://api.telegram.org/bot${token}/getMe (apps/api/src/lib/channelRuntime.ts:1238)"}, "properties": {"repobilityId": "b8f393e9ca951e5f", "scanner": "scanner-primary", "fingerprint": "dbf9118c1346fbcb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1ab76f63ec2ed89e", "level": "error", "message": {"text": "Dangling fetch: POST https://api.telegram.org/bot${input.token}/setWebhook (apps/api/src/lib/channelRuntime.ts:1269)"}, "properties": {"repobilityId": "6b018ef044a9e152", "scanner": "scanner-primary", "fingerprint": "1ab76f63ec2ed89e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-383c6a1858e0d864", "level": "error", "message": {"text": "Dangling fetch: PATCH https://api.elevenlabs.io/v1/convai/agents/${agentId} (apps/api/src/lib/elevenlabs.ts:112)"}, "properties": {"repobilityId": "dbf5e9b61fdbaf27", "scanner": "scanner-primary", "fingerprint": "383c6a1858e0d864", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e19e3ab2cd5aa720", "level": "error", "message": {"text": "Dangling fetch: POST https://api.elevenlabs.io/v1/convai/twilio/register-call (apps/api/src/lib/elevenlabs.ts:153)"}, "properties": {"repobilityId": "147e0194eb2956c2", "scanner": "scanner-primary", "fingerprint": "e19e3ab2cd5aa720", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8d55abdde19a90c1", "level": "error", "message": {"text": "Dangling fetch: POST https://api.elevenlabs.io/v1/convai/agents/${input.sourceAgentId}/duplicate (apps/api/src/lib/elevenlabs.ts:191)"}, "properties": {"repobilityId": "ce29b1e812b7c6b0", "scanner": "scanner-primary", "fingerprint": "8d55abdde19a90c1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f18ceb8699983d75", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (apps/api/src/lib/assistantLlm.ts:37)"}, "properties": {"repobilityId": "b742ffd95613c9a2", "scanner": "scanner-primary", "fingerprint": "f18ceb8699983d75", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ba3a23315519ff77", "level": "error", "message": {"text": "Dangling fetch: POST https://generativelanguage.googleapis.com/v1beta/models/${GEMINI_MODEL}:generateContent?key=${apiKey} (apps/api/src/lib/assistantLlm.ts:60)"}, "properties": {"repobilityId": "f182124e93df5030", "scanner": "scanner-primary", "fingerprint": "ba3a23315519ff77", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a205654be0ac30bd", "level": "error", "message": {"text": "Dangling fetch: POST https://api.twilio.com/2010-04-01/Accounts/${credentials.accountSid}/IncomingPhoneNumbers/${incomingPhoneNumberSid}.json (apps/api/src/lib/twilioApi.ts:96)"}, "properties": {"repobilityId": "fb3166eca7e1030a", "scanner": "scanner-primary", "fingerprint": "a205654be0ac30bd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b1fb25cc38360e23", "level": "error", "message": {"text": "Dangling fetch: POST https://api.twilio.com/2010-04-01/Accounts/${credentials.accountSid}/IncomingPhoneNumbers.json (apps/api/src/lib/twilioApi.ts:163)"}, "properties": {"repobilityId": "0f42a298220b3138", "scanner": "scanner-primary", "fingerprint": "b1fb25cc38360e23", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-07a035f2cb7f443a", "level": "error", "message": {"text": "Dangling fetch: POST https://api.twilio.com/2010-04-01/Accounts/${credentials.accountSid}/Messages.json (apps/api/src/lib/twilioApi.ts:206)"}, "properties": {"repobilityId": "092ca8ba63cf204d", "scanner": "scanner-primary", "fingerprint": "07a035f2cb7f443a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-921b223d11c5b162", "level": "error", "message": {"text": "Dangling fetch: POST https://api.twilio.com/2010-04-01/Accounts/${credentials.accountSid}/Messages.json (apps/api/src/lib/twilioApi.ts:260)"}, "properties": {"repobilityId": "3ba0dcc5910dba3b", "scanner": "scanner-primary", "fingerprint": "921b223d11c5b162", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0818cc05ffcfa61d", "level": "error", "message": {"text": "Dangling fetch: POST https://api.twilio.com/2010-04-01/Accounts/${credentials.accountSid}/Messages.json (apps/api/src/lib/twilioApi.ts:294)"}, "properties": {"repobilityId": "9d009a76571c3ac9", "scanner": "scanner-primary", "fingerprint": "0818cc05ffcfa61d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-04b04428a2a02b5a", "level": "error", "message": {"text": "Dangling fetch: POST https://api.twilio.com/2010-04-01/Accounts/${credentials.accountSid}/Calls.json (apps/api/src/lib/twilioApi.ts:330)"}, "properties": {"repobilityId": "9eb417a053c8c2ce", "scanner": "scanner-primary", "fingerprint": "04b04428a2a02b5a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3b5bee2814be2653", "level": "error", "message": {"text": "Dangling fetch: POST https://api.twilio.com/2010-04-01/Accounts/${credentials.accountSid}/OutgoingCallerIds.json (apps/api/src/lib/twilioApi.ts:373)"}, "properties": {"repobilityId": "8b1c466721255da7", "scanner": "scanner-primary", "fingerprint": "3b5bee2814be2653", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a971f455abf0f467", "level": "error", "message": {"text": "Dangling fetch: GET https://api.twilio.com/2010-04-01/Accounts/${credentials.accountSid}/OutgoingCallerIds.json?${params} (apps/api/src/lib/twilioApi.ts:403)"}, "properties": {"repobilityId": "2f21eb86a22b1521", "scanner": "scanner-primary", "fingerprint": "a971f455abf0f467", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0c26aed1d6683a0d", "level": "error", "message": {"text": "Dangling fetch: DELETE https://api.twilio.com/2010-04-01/Accounts/${credentials.accountSid}/OutgoingCallerIds/${existing.sid}.json (apps/api/src/lib/twilioApi.ts:428)"}, "properties": {"repobilityId": "8c7769bfc049ff7e", "scanner": "scanner-primary", "fingerprint": "0c26aed1d6683a0d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-951326f871c7d12d", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (apps/api/src/routes/ai.ts:45)"}, "properties": {"repobilityId": "c055a90214ffca77", "scanner": "scanner-primary", "fingerprint": "951326f871c7d12d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-65a667bcc38fb792", "level": "note", "message": {"text": "Unused endpoint: POST /ingest"}, "properties": {"repobilityId": "56d7233cdf631137", "scanner": "scanner-primary", "fingerprint": "65a667bcc38fb792", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e1e11dcc6687c8ae", "level": "note", "message": {"text": "Unused endpoint: POST /ingest-file"}, "properties": {"repobilityId": "d718ab5573408299", "scanner": "scanner-primary", "fingerprint": "e1e11dcc6687c8ae", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f4b620a3a92ab4af", "level": "note", "message": {"text": "Unused endpoint: POST /retrieve"}, "properties": {"repobilityId": "7ef017f552ee4443", "scanner": "scanner-primary", "fingerprint": "f4b620a3a92ab4af", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fcf2f086be292af2", "level": "note", "message": {"text": "Unused endpoint: USE /agents"}, "properties": {"repobilityId": "2febcc21448a9ad3", "scanner": "scanner-primary", "fingerprint": "fcf2f086be292af2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-92971b0c3e2623ca", "level": "note", "message": {"text": "Unused endpoint: USE /leads"}, "properties": {"repobilityId": "ecd01411987030e8", "scanner": "scanner-primary", "fingerprint": "92971b0c3e2623ca", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5de532c8657fd2b3", "level": "note", "message": {"text": "Unused endpoint: USE /calls"}, "properties": {"repobilityId": "f323b97be91db053", "scanner": "scanner-primary", "fingerprint": "5de532c8657fd2b3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7cf5d93546ad6a38", "level": "note", "message": {"text": "Unused endpoint: USE /knowledge"}, "properties": {"repobilityId": "7ee6d95643614dcf", "scanner": "scanner-primary", "fingerprint": "7cf5d93546ad6a38", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0ad8505b0a2b17ef", "level": "note", "message": {"text": "Unused endpoint: USE /bookings"}, "properties": {"repobilityId": "4a6dcfedc06779d1", "scanner": "scanner-primary", "fingerprint": "0ad8505b0a2b17ef", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-952e8de0b138e835", "level": "note", "message": {"text": "Unused endpoint: USE /contacts"}, "properties": {"repobilityId": "37d289eac365a10c", "scanner": "scanner-primary", "fingerprint": "952e8de0b138e835", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e1bfcfeccbb4f1ff", "level": "note", "message": {"text": "Unused endpoint: USE /usage"}, "properties": {"repobilityId": "b7406927c8785e49", "scanner": "scanner-primary", "fingerprint": "e1bfcfeccbb4f1ff", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a41c87a0ed92a0fd", "level": "note", "message": {"text": "Unused endpoint: USE /billing"}, "properties": {"repobilityId": "b3ffd5efde2a591f", "scanner": "scanner-primary", "fingerprint": "a41c87a0ed92a0fd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-199bea4e2fc20107", "level": "note", "message": {"text": "Unused endpoint: USE /conversations"}, "properties": {"repobilityId": "47c7b20038af7d95", "scanner": "scanner-primary", "fingerprint": "199bea4e2fc20107", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-17b022de3e693398", "level": "note", "message": {"text": "Unused endpoint: USE /whatsapp"}, "properties": {"repobilityId": "b9d02d79c6f08ba9", "scanner": "scanner-primary", "fingerprint": "17b022de3e693398", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-52c7ea5eb5570860", "level": "note", "message": {"text": "Unused endpoint: USE /channels"}, "properties": {"repobilityId": "8c2a2fe66946cb27", "scanner": "scanner-primary", "fingerprint": "52c7ea5eb5570860", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fd458eb13d1de46b", "level": "note", "message": {"text": "Unused endpoint: USE /integrations"}, "properties": {"repobilityId": "af197be385db8430", "scanner": "scanner-primary", "fingerprint": "fd458eb13d1de46b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-800d9e1d607a2d70", "level": "note", "message": {"text": "Unused endpoint: USE /tenant"}, "properties": {"repobilityId": "8aaff207b2055324", "scanner": "scanner-primary", "fingerprint": "800d9e1d607a2d70", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-812ffd875e31460d", "level": "note", "message": {"text": "Unused endpoint: USE /catalog"}, "properties": {"repobilityId": "fba288e6470d47ab", "scanner": "scanner-primary", "fingerprint": "812ffd875e31460d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b19641c975bab74e", "level": "note", "message": {"text": "Unused endpoint: USE /assistant"}, "properties": {"repobilityId": "71b80ad3098676ed", "scanner": "scanner-primary", "fingerprint": "b19641c975bab74e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c9e2f0ba1838be2c", "level": "note", "message": {"text": "Unused endpoint: USE /composio"}, "properties": {"repobilityId": "93f9250200aeb70b", "scanner": "scanner-primary", "fingerprint": "c9e2f0ba1838be2c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d80629752210b855", "level": "note", "message": {"text": "Unused endpoint: USE /notifications"}, "properties": {"repobilityId": "183a7977ce216a8b", "scanner": "scanner-primary", "fingerprint": "d80629752210b855", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6bdcbf2073dfa768", "level": "note", "message": {"text": "Unused endpoint: USE /ai"}, "properties": {"repobilityId": "781acfa026f1ea9b", "scanner": "scanner-primary", "fingerprint": "6bdcbf2073dfa768", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e85d4bdf5a374098", "level": "note", "message": {"text": "Unused endpoint: USE /provision"}, "properties": {"repobilityId": "4fae4971c4f2679f", "scanner": "scanner-primary", "fingerprint": "e85d4bdf5a374098", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1e05ba1cd37b6101", "level": "note", "message": {"text": "Unused endpoint: USE /webhooks"}, "properties": {"repobilityId": "0bf420d919badc71", "scanner": "scanner-primary", "fingerprint": "1e05ba1cd37b6101", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f1084bc3b7a4f4bb", "level": "note", "message": {"text": "Unused endpoint: GET /products"}, "properties": {"repobilityId": "63f5aa5d345d1812", "scanner": "scanner-primary", "fingerprint": "f1084bc3b7a4f4bb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cca7583916efd86a", "level": "note", "message": {"text": "Unused endpoint: POST /products"}, "properties": {"repobilityId": "885eb5e3c01e7d9d", "scanner": "scanner-primary", "fingerprint": "cca7583916efd86a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3312ed671532b931", "level": "note", "message": {"text": "Unused endpoint: PUT /products/:id"}, "properties": {"repobilityId": "ee57a34c4fc94864", "scanner": "scanner-primary", "fingerprint": "3312ed671532b931", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-631d58d0d714102a", "level": "note", "message": {"text": "Unused endpoint: DELETE /products/:id"}, "properties": {"repobilityId": "4d5ee24fbe73a919", "scanner": "scanner-primary", "fingerprint": "631d58d0d714102a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0328e9bdbb61fa68", "level": "note", "message": {"text": "Unused endpoint: GET /orders"}, "properties": {"repobilityId": "c1ca90f17f55203e", "scanner": "scanner-primary", "fingerprint": "0328e9bdbb61fa68", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bd29745abb69000e", "level": "note", "message": {"text": "Unused endpoint: POST /generate-pitch-block"}, "properties": {"repobilityId": "615b26dd44a26b0a", "scanner": "scanner-primary", "fingerprint": "bd29745abb69000e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2083a87719497893", "level": "note", "message": {"text": "Unused endpoint: POST /stripe"}, "properties": {"repobilityId": "cbab846b21e57764", "scanner": "scanner-primary", "fingerprint": "2083a87719497893", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d1ed0c52d54341af", "level": "note", "message": {"text": "Unused endpoint: POST /mercadopago"}, "properties": {"repobilityId": "e78d2221d4fb3d07", "scanner": "scanner-primary", "fingerprint": "d1ed0c52d54341af", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ae27a3f09c47aead", "level": "note", "message": {"text": "Unused endpoint: POST /twilio/status"}, "properties": {"repobilityId": "ace57a973dc91cea", "scanner": "scanner-primary", "fingerprint": "ae27a3f09c47aead", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ef00178afbf31ab6", "level": "note", "message": {"text": "Unused endpoint: POST /twilio/voice"}, "properties": {"repobilityId": "ecbb599852a6c305", "scanner": "scanner-primary", "fingerprint": "ef00178afbf31ab6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b48e2c9415c8c62b", "level": "note", "message": {"text": "Unused endpoint: POST /twilio/whatsapp"}, "properties": {"repobilityId": "8f351d53722e6b72", "scanner": "scanner-primary", "fingerprint": "b48e2c9415c8c62b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2f5307cadbafb707", "level": "note", "message": {"text": "Unused endpoint: POST /telegram/:connectionId"}, "properties": {"repobilityId": "d1e9509604ce574d", "scanner": "scanner-primary", "fingerprint": "2f5307cadbafb707", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-833edacd3634c902", "level": "note", "message": {"text": "Unused endpoint: GET /meta"}, "properties": {"repobilityId": "b46689f9f5079671", "scanner": "scanner-primary", "fingerprint": "833edacd3634c902", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ffe2534796f5e574", "level": "note", "message": {"text": "Unused endpoint: POST /meta"}, "properties": {"repobilityId": "aab3add52b6afea3", "scanner": "scanner-primary", "fingerprint": "ffe2534796f5e574", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1e409e685d02044f", "level": "note", "message": {"text": "Unused endpoint: POST /property-inbox/:connectionId"}, "properties": {"repobilityId": "3a7a21a6f091c891", "scanner": "scanner-primary", "fingerprint": "1e409e685d02044f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-758dd96c1b239862", "level": "note", "message": {"text": "Unused endpoint: POST /elevenlabs/tool"}, "properties": {"repobilityId": "429d28524ce33bf3", "scanner": "scanner-primary", "fingerprint": "758dd96c1b239862", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-04a405bb6e5292b6", "level": "note", "message": {"text": "Unused endpoint: POST /elevenlabs/post-call"}, "properties": {"repobilityId": "ececafe6c544c08b", "scanner": "scanner-primary", "fingerprint": "04a405bb6e5292b6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d66620f80b8de740", "level": "note", "message": {"text": "Unused endpoint: GET /connections"}, "properties": {"repobilityId": "eba0fd454df3b362", "scanner": "scanner-primary", "fingerprint": "d66620f80b8de740", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2e3e6122851ea1cb", "level": "note", "message": {"text": "Unused endpoint: GET /actions"}, "properties": {"repobilityId": "242d4e090769e34c", "scanner": "scanner-primary", "fingerprint": "2e3e6122851ea1cb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8664e7608b8880ea", "level": "note", "message": {"text": "Unused endpoint: POST /connect"}, "properties": {"repobilityId": "dbda85e6bdee48f5", "scanner": "scanner-primary", "fingerprint": "8664e7608b8880ea", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8bb35cd3435ea080", "level": "note", "message": {"text": "Unused endpoint: POST /create-checkout"}, "properties": {"repobilityId": "3884fd5b7325e600", "scanner": "scanner-primary", "fingerprint": "8bb35cd3435ea080", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1ec7e423e24778e4", "level": "note", "message": {"text": "Unused endpoint: POST /portal"}, "properties": {"repobilityId": "592567c8bb7d88e5", "scanner": "scanner-primary", "fingerprint": "1ec7e423e24778e4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c67ddea3c17528d6", "level": "note", "message": {"text": "Unused endpoint: GET /subscription"}, "properties": {"repobilityId": "d6a20710d8059655", "scanner": "scanner-primary", "fingerprint": "c67ddea3c17528d6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cff8da5fbc19c76d", "level": "note", "message": {"text": "Unused endpoint: POST /chat"}, "properties": {"repobilityId": "ddcac54af527bc4e", "scanner": "scanner-primary", "fingerprint": "cff8da5fbc19c76d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-85f7f661f5ff7ac4", "level": "note", "message": {"text": "Unused endpoint: POST /draft/apply"}, "properties": {"repobilityId": "e669f648db974276", "scanner": "scanner-primary", "fingerprint": "85f7f661f5ff7ac4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "f478f669c34bb193", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a13a7e97aeacf55f", "level": "note", "message": {"text": "Unused endpoint: POST /start"}, "properties": {"repobilityId": "5b143de614d0a223", "scanner": "scanner-primary", "fingerprint": "a13a7e97aeacf55f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}