{"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-c70c72f9ecab68d7", "name": "Stray `console.log` in TS/JS \u2014 server/index.ts:63", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/index.ts:63"}, "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-e90dc66354181a68", "name": "Stray `console.log` in TS/JS \u2014 server/lib/gemini.ts:197", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/lib/gemini.ts:197"}, "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-ff42b59602058e59", "name": "Stray `console.log` in TS/JS \u2014 server/lib/agent-memory.ts:39", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/lib/agent-memory.ts:39"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-402fbb348c35cdb4", "name": "Stray `console.log` in TS/JS \u2014 server/lib/wa-retry.ts:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/lib/wa-retry.ts:20"}, "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-dc4b4f7fd0b098d8", "name": "Stray `console.log` in TS/JS \u2014 server/lib/automation.ts:34", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/lib/automation.ts:34"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3cb965d4bda11d3a", "name": "Stray `console.log` in TS/JS \u2014 server/lib/reminder-scheduler.ts:59", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/lib/reminder-scheduler.ts:59"}, "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-dcf9a06d63f479a6", "name": "Stray `console.log` in TS/JS \u2014 server/lib/broadcast-sender.ts:58", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/lib/broadcast-sender.ts:58"}, "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-fb2343aef3bfd56d", "name": "Stray `console.log` in TS/JS \u2014 server/routes/webhooks.ts:163", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/routes/webhooks.ts:163"}, "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-8508202dedc6a878", "name": "Stray `console.log` in TS/JS \u2014 server/routes/billing.ts:141", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/routes/billing.ts:141"}, "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-5823f358a38faf58", "name": "Stray `console.log` in TS/JS \u2014 server/routes/copilot.ts:687", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/routes/copilot.ts:687"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-64678ea4d324e387", "name": "Stray `console.log` in TS/JS \u2014 server/routes/business.ts:190", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/routes/business.ts:190"}, "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-a2ff307e7d95fa44", "name": "Stray `console.log` in TS/JS \u2014 server/channels/whatsapp.adapter.ts:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/channels/whatsapp.adapter.ts:20"}, "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-c8e649b8ef82d40b", "name": "Stray `console.log` in TS/JS \u2014 server/channels/instagram.adapter.ts:7", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/channels/instagram.adapter.ts:7"}, "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-d0cc53ba0b78408b", "name": "Stray `console.log` in TS/JS \u2014 server/db/seed.ts:3", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/db/seed.ts:3"}, "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-a42409550a08c782", "name": "Stray `console.log` in TS/JS \u2014 server/db/seed_user.ts:29", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/db/seed_user.ts:29"}, "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-6a70a4b4056fad34", "name": "Stray `console.log` in TS/JS \u2014 server/db/database.ts:332", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/db/database.ts:332"}, "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-f20217e6c33534fd", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/TopBar.tsx:143", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/TopBar.tsx:143"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c696eb1f01645568", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/Sidebar.tsx:178", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/Sidebar.tsx:178"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3b9d9adb6ad04010", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/appointments/AppointmentBlock.tsx:75", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/appointments/AppointmentBlock.tsx:75"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-15de90cd33d8ed87", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ContactsPage.tsx:330", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ContactsPage.tsx:330"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a58626b90f319d31", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/AppointmentsPage.tsx:500", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/AppointmentsPage.tsx:500"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-47ba160d3fccb5f7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/InboxPage.tsx:411", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/InboxPage.tsx:411"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6093a3dafb480e27", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/PipelinePage.tsx:86", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/PipelinePage.tsx:86"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-090fe0694b374cbe", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/SettingsPage.tsx:677", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/SettingsPage.tsx:677"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-773aad54b0c39a9b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/BroadcastPage.tsx:372", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/BroadcastPage.tsx:372"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-69efeafe1fc5bd84", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ReportsPage.tsx:263", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ReportsPage.tsx:263"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-96e829b7dd112e93", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/DashboardPage.tsx:100", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/DashboardPage.tsx:100"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-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-caa395488e4a496f", "name": "Very large file: src/pages/ContactsPage.tsx (976 lines)", "shortDescription": {"text": "Very large file: src/pages/ContactsPage.tsx (976 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-720fae52bd85a6e7", "name": "Very large file: src/pages/InboxPage.tsx (1525 lines)", "shortDescription": {"text": "Very large file: src/pages/InboxPage.tsx (1525 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-2b05f1976629287a", "name": "Very large file: src/pages/SettingsPage.tsx (1722 lines)", "shortDescription": {"text": "Very large file: src/pages/SettingsPage.tsx (1722 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 95 source file(s) (ratio 0.01). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 43 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 64 placeholder/mock markers across 16 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9d79c4077342a7d0", "name": "Runtime service client appears to use placeholder configuration", "shortDescription": {"text": "Runtime service client appears to use placeholder configuration"}, "fullDescription": {"text": "A runtime source file appears to wire Supabase/Firebase/AI/payment-style clients to placeholder URLs, keys, or fallback values. In the Fable corpus this often means the UI/API shape is present while the backend service is not actually configured."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-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. 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-f3cc89c2755fbb1e", "name": "Commented-code block (6 lines) in tests/app.spec.ts:27", "shortDescription": {"text": "Commented-code block (6 lines) in tests/app.spec.ts:27"}, "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-b06872a8fa17c922", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server/lib/gemini.ts:32", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/lib/gemini.ts:32"}, "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-e342c58f45792519", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server/lib/meta-media.ts:36", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/lib/meta-media.ts:36"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e87afd5c67d29b36", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server/routes/business.ts:129", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/routes/business.ts:129"}, "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-55e00bbba1661958", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server/channels/whatsapp.adapter.ts:189", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/channels/whatsapp.adapter.ts:189"}, "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-bbb945e2355c90cb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/dashboard/AIInsightsPanel.tsx:40", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/dashboard/AIInsightsPanel.tsx: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-c7bb20bc89ab23f3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/api.ts:70", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/api.ts:70"}, "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-bcce3787591f1d10", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/pages/BookingPage.tsx:45", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/pages/BookingPage.tsx:45"}, "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-cc0f9d8e41b33b0e", "name": "11 env vars used in code but missing from .env.example", "shortDescription": {"text": "11 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `CI`, `DISABLE_HMR`, `MODE`, `PORT`, `POSTGRES_URL`, `SENTRY_DSN`, `STRIPE_PRICE_BASE`, `SUPABASE_SERVICE_ROLE_KEY` + 3 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-250f15d809026909", "name": "Frontend route `/register` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/register` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9a0b99730ac89264", "name": "Frontend route `/book/:slug` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/book/:slug` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d0522f6760df0394", "name": "Frontend route `inbox` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `inbox` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-12e52466b0abfd1e", "name": "Frontend route `inbox/:conversationId` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `inbox/:conversationId` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-15b9288cde0b54ac", "name": "Frontend route `contacts` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `contacts` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-76880027ca7a4bdd", "name": "Frontend route `contacts/:contactId` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `contacts/:contactId` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2558aec0e7ff57ce", "name": "Frontend route `pipeline` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `pipeline` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6ebc3abb02dfbca3", "name": "Frontend route `tasks` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `tasks` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-46b6afd7e3907927", "name": "Frontend route `appointments` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `appointments` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d2153e1710f15466", "name": "Frontend route `reports` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `reports` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f11b5ad45ae76d49", "name": "Frontend route `broadcast` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `broadcast` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0626b4c2e4efcb82", "name": "Frontend route `settings` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `settings` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dc73f0342699743f", "name": "Frontend route `/inbox/:id` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/inbox/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-94030d33c8aee0f1", "name": "Frontend route `/dashboard` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/dashboard` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4c96500179de8117", "name": "Frontend route `/settings` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/settings` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-84beb094e45e0074", "name": "Dangling fetch: GET https://graph.facebook.com/v19.0/${mediaId} (server/lib/meta-media.ts:36)", "shortDescription": {"text": "Dangling fetch: GET https://graph.facebook.com/v19.0/${mediaId} (server/lib/meta-media.ts:36)"}, "fullDescription": {"text": "`server/lib/meta-media.ts:36` calls `GET https://graph.facebook.com/v19.0/${mediaId}` 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/v19.0/<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-738805042f65a300", "name": "Dangling fetch: POST https://graph.facebook.com/v19.0/${waba_id}/subscribed_apps (server/routes/business.ts:169)", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/v19.0/${waba_id}/subscribed_apps (server/routes/business.ts:169)"}, "fullDescription": {"text": "`server/routes/business.ts:169` calls `POST https://graph.facebook.com/v19.0/${waba_id}/subscribed_apps` 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/v19.0/<p>/subscribed_apps`\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-e84da8d8698d1077", "name": "Dangling fetch: POST https://graph.facebook.com/v19.0/${phoneId}/messages (server/channels/whatsapp.adapter.ts:31)", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/v19.0/${phoneId}/messages (server/channels/whatsapp.adapter.ts:31)"}, "fullDescription": {"text": "`server/channels/whatsapp.adapter.ts:31` calls `POST https://graph.facebook.com/v19.0/${phoneId}/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/v19.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-677083bec36f87a2", "name": "Dangling fetch: POST https://graph.facebook.com/v19.0/${phoneId}/messages (server/channels/whatsapp.adapter.ts:189)", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/v19.0/${phoneId}/messages (server/channels/whatsapp.adapter.ts:189)"}, "fullDescription": {"text": "`server/channels/whatsapp.adapter.ts:189` calls `POST https://graph.facebook.com/v19.0/${phoneId}/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/v19.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-65d57eb9f37fb97a", "name": "Dangling fetch: GET /business (src/lib/api.ts:77)", "shortDescription": {"text": "Dangling fetch: GET /business (src/lib/api.ts:77)"}, "fullDescription": {"text": "`src/lib/api.ts:77` calls `GET /business` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/business`\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-b59ef9033c5110d7", "name": "Dangling fetch: GET /business/${id ?? _activeBusinessId} (src/lib/api.ts:79)", "shortDescription": {"text": "Dangling fetch: GET /business/${id ?? _activeBusinessId} (src/lib/api.ts:79)"}, "fullDescription": {"text": "`src/lib/api.ts:79` calls `GET /business/${id ?? _activeBusinessId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/business/${id `\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-60b600378e05ec97", "name": "Dangling fetch: POST /business (src/lib/api.ts:81)", "shortDescription": {"text": "Dangling fetch: POST /business (src/lib/api.ts:81)"}, "fullDescription": {"text": "`src/lib/api.ts:81` calls `POST /business` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/business`\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-deaa0e5d7ca621e3", "name": "Dangling fetch: PUT /business/${id} (src/lib/api.ts:83)", "shortDescription": {"text": "Dangling fetch: PUT /business/${id} (src/lib/api.ts:83)"}, "fullDescription": {"text": "`src/lib/api.ts:83` calls `PUT /business/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/business/<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-a16f84eb5bca4902", "name": "Dangling fetch: PATCH /business/booking-slug (src/lib/api.ts:85)", "shortDescription": {"text": "Dangling fetch: PATCH /business/booking-slug (src/lib/api.ts:85)"}, "fullDescription": {"text": "`src/lib/api.ts:85` calls `PATCH /business/booking-slug` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/business/booking-slug`\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-46ee2405acc7250e", "name": "Dangling fetch: GET /contacts?${qs} (src/lib/api.ts:96)", "shortDescription": {"text": "Dangling fetch: GET /contacts?${qs} (src/lib/api.ts:96)"}, "fullDescription": {"text": "`src/lib/api.ts:96` calls `GET /contacts?${qs}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/contacts`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-40edeeb288eccdff", "name": "Dangling fetch: GET /contacts/${id} (src/lib/api.ts:98)", "shortDescription": {"text": "Dangling fetch: GET /contacts/${id} (src/lib/api.ts:98)"}, "fullDescription": {"text": "`src/lib/api.ts:98` calls `GET /contacts/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/contacts/<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-a045fac453b78229", "name": "Dangling fetch: POST /contacts (src/lib/api.ts:100)", "shortDescription": {"text": "Dangling fetch: POST /contacts (src/lib/api.ts:100)"}, "fullDescription": {"text": "`src/lib/api.ts:100` calls `POST /contacts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/contacts`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-36492a4798b43f8b", "name": "Dangling fetch: PUT /contacts/${id} (src/lib/api.ts:102)", "shortDescription": {"text": "Dangling fetch: PUT /contacts/${id} (src/lib/api.ts:102)"}, "fullDescription": {"text": "`src/lib/api.ts:102` calls `PUT /contacts/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/contacts/<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-fdb5b499c1e992e4", "name": "Dangling fetch: PATCH /contacts/${id}/stage (src/lib/api.ts:104)", "shortDescription": {"text": "Dangling fetch: PATCH /contacts/${id}/stage (src/lib/api.ts:104)"}, "fullDescription": {"text": "`src/lib/api.ts:104` calls `PATCH /contacts/${id}/stage` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/contacts/<p>/stage`\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-741acfafc8472866", "name": "Dangling fetch: DELETE /contacts/${id} (src/lib/api.ts:106)", "shortDescription": {"text": "Dangling fetch: DELETE /contacts/${id} (src/lib/api.ts:106)"}, "fullDescription": {"text": "`src/lib/api.ts:106` calls `DELETE /contacts/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/contacts/<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-ccb48f663b0cb2b7", "name": "Dangling fetch: POST /contacts/import (src/lib/api.ts:117)", "shortDescription": {"text": "Dangling fetch: POST /contacts/import (src/lib/api.ts:117)"}, "fullDescription": {"text": "`src/lib/api.ts:117` calls `POST /contacts/import` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/contacts/import`\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-3b8c847a4dde932e", "name": "Dangling fetch: GET /conversations/unread-count (src/lib/api.ts:122)", "shortDescription": {"text": "Dangling fetch: GET /conversations/unread-count (src/lib/api.ts:122)"}, "fullDescription": {"text": "`src/lib/api.ts:122` calls `GET /conversations/unread-count` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/conversations/unread-count`\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-34836723a5ea55b0", "name": "Dangling fetch: GET /conversations?${qs} (src/lib/api.ts:126)", "shortDescription": {"text": "Dangling fetch: GET /conversations?${qs} (src/lib/api.ts:126)"}, "fullDescription": {"text": "`src/lib/api.ts:126` calls `GET /conversations?${qs}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/conversations`\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-ac53624f757afaa4", "name": "Dangling fetch: GET /conversations/${id} (src/lib/api.ts:128)", "shortDescription": {"text": "Dangling fetch: GET /conversations/${id} (src/lib/api.ts:128)"}, "fullDescription": {"text": "`src/lib/api.ts:128` calls `GET /conversations/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/conversations/<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-7aa7c0568e7c94a1", "name": "Dangling fetch: POST /conversations (src/lib/api.ts:130)", "shortDescription": {"text": "Dangling fetch: POST /conversations (src/lib/api.ts:130)"}, "fullDescription": {"text": "`src/lib/api.ts:130` calls `POST /conversations` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/conversations`\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-72efc43f392fb6d4", "name": "Dangling fetch: PATCH /conversations/${id}/status (src/lib/api.ts:132)", "shortDescription": {"text": "Dangling fetch: PATCH /conversations/${id}/status (src/lib/api.ts:132)"}, "fullDescription": {"text": "`src/lib/api.ts:132` calls `PATCH /conversations/${id}/status` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/conversations/<p>/status`\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-c67b34f88de5f65d", "name": "Dangling fetch: PATCH /conversations/${id}/read (src/lib/api.ts:134)", "shortDescription": {"text": "Dangling fetch: PATCH /conversations/${id}/read (src/lib/api.ts:134)"}, "fullDescription": {"text": "`src/lib/api.ts:134` calls `PATCH /conversations/${id}/read` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/conversations/<p>/read`\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-20f5140d42d82bc6", "name": "Dangling fetch: PATCH /conversations/${id}/unread (src/lib/api.ts:136)", "shortDescription": {"text": "Dangling fetch: PATCH /conversations/${id}/unread (src/lib/api.ts:136)"}, "fullDescription": {"text": "`src/lib/api.ts:136` calls `PATCH /conversations/${id}/unread` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/conversations/<p>/unread`\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-ec8a875b7be4a8bd", "name": "Dangling fetch: DELETE /conversations/${id} (src/lib/api.ts:138)", "shortDescription": {"text": "Dangling fetch: DELETE /conversations/${id} (src/lib/api.ts:138)"}, "fullDescription": {"text": "`src/lib/api.ts:138` calls `DELETE /conversations/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/conversations/<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-1723ad16e937a1b0", "name": "Dangling fetch: PATCH /conversations/${id}/assign (src/lib/api.ts:140)", "shortDescription": {"text": "Dangling fetch: PATCH /conversations/${id}/assign (src/lib/api.ts:140)"}, "fullDescription": {"text": "`src/lib/api.ts:140` calls `PATCH /conversations/${id}/assign` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/conversations/<p>/assign`\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-5fb287e409f70017", "name": "Dangling fetch: PATCH /conversations/${id}/intent (src/lib/api.ts:142)", "shortDescription": {"text": "Dangling fetch: PATCH /conversations/${id}/intent (src/lib/api.ts:142)"}, "fullDescription": {"text": "`src/lib/api.ts:142` calls `PATCH /conversations/${id}/intent` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/conversations/<p>/intent`\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-f26c6f366022be6a", "name": "Dangling fetch: POST /conversations/${id}/detect-intent (src/lib/api.ts:144)", "shortDescription": {"text": "Dangling fetch: POST /conversations/${id}/detect-intent (src/lib/api.ts:144)"}, "fullDescription": {"text": "`src/lib/api.ts:144` calls `POST /conversations/${id}/detect-intent` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/conversations/<p>/detect-intent`\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-45ad38a7c650646e", "name": "Dangling fetch: GET /conversations/follow-up?hours=${hours} (src/lib/api.ts:146)", "shortDescription": {"text": "Dangling fetch: GET /conversations/follow-up?hours=${hours} (src/lib/api.ts:146)"}, "fullDescription": {"text": "`src/lib/api.ts:146` calls `GET /conversations/follow-up?hours=${hours}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/conversations/follow-up`\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-e655ab55d1147cb8", "name": "Dangling fetch: POST /ai/generate-followup (src/lib/api.ts:148)", "shortDescription": {"text": "Dangling fetch: POST /ai/generate-followup (src/lib/api.ts:148)"}, "fullDescription": {"text": "`src/lib/api.ts:148` calls `POST /ai/generate-followup` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/ai/generate-followup`\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-75b7e3a718681058", "name": "Dangling fetch: GET /messages?conversation_id=${conversationId} (src/lib/api.ts:155)", "shortDescription": {"text": "Dangling fetch: GET /messages?conversation_id=${conversationId} (src/lib/api.ts:155)"}, "fullDescription": {"text": "`src/lib/api.ts:155` calls `GET /messages?conversation_id=${conversationId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/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-7cea53e91e904269", "name": "Dangling fetch: POST /messages (src/lib/api.ts:157)", "shortDescription": {"text": "Dangling fetch: POST /messages (src/lib/api.ts:157)"}, "fullDescription": {"text": "`src/lib/api.ts:157` calls `POST /messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/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-0a7c95189ccefd61", "name": "Dangling fetch: POST /messages (src/lib/api.ts:170)", "shortDescription": {"text": "Dangling fetch: POST /messages (src/lib/api.ts:170)"}, "fullDescription": {"text": "`src/lib/api.ts:170` calls `POST /messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/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-db6e07429a68dba8", "name": "Dangling fetch: GET /pipeline?business_id=${_activeBusinessId} (src/lib/api.ts:194)", "shortDescription": {"text": "Dangling fetch: GET /pipeline?business_id=${_activeBusinessId} (src/lib/api.ts:194)"}, "fullDescription": {"text": "`src/lib/api.ts:194` calls `GET /pipeline?business_id=${_activeBusinessId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/pipeline`\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-debfe213d3ddab16", "name": "Dangling fetch: POST /pipeline (src/lib/api.ts:196)", "shortDescription": {"text": "Dangling fetch: POST /pipeline (src/lib/api.ts:196)"}, "fullDescription": {"text": "`src/lib/api.ts:196` calls `POST /pipeline` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/pipeline`\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-0a862e049d9e7ca5", "name": "Dangling fetch: PATCH /pipeline/${id}/stage (src/lib/api.ts:198)", "shortDescription": {"text": "Dangling fetch: PATCH /pipeline/${id}/stage (src/lib/api.ts:198)"}, "fullDescription": {"text": "`src/lib/api.ts:198` calls `PATCH /pipeline/${id}/stage` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/pipeline/<p>/stage`\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-f2f0b9e8dde18e0f", "name": "Dangling fetch: PUT /pipeline/${id} (src/lib/api.ts:200)", "shortDescription": {"text": "Dangling fetch: PUT /pipeline/${id} (src/lib/api.ts:200)"}, "fullDescription": {"text": "`src/lib/api.ts:200` calls `PUT /pipeline/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/pipeline/<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-37c2f5717ffa50c0", "name": "Dangling fetch: DELETE /pipeline/${id} (src/lib/api.ts:202)", "shortDescription": {"text": "Dangling fetch: DELETE /pipeline/${id} (src/lib/api.ts:202)"}, "fullDescription": {"text": "`src/lib/api.ts:202` calls `DELETE /pipeline/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/pipeline/<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-725825223d6e11db", "name": "Dangling fetch: GET /tasks?${qs} (src/lib/api.ts:208)", "shortDescription": {"text": "Dangling fetch: GET /tasks?${qs} (src/lib/api.ts:208)"}, "fullDescription": {"text": "`src/lib/api.ts:208` calls `GET /tasks?${qs}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/tasks`\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-aafcaf390cbf0dea", "name": "Dangling fetch: POST /tasks (src/lib/api.ts:211)", "shortDescription": {"text": "Dangling fetch: POST /tasks (src/lib/api.ts:211)"}, "fullDescription": {"text": "`src/lib/api.ts:211` calls `POST /tasks` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/tasks`\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-190bf8fdbf0e3130", "name": "Dangling fetch: PATCH /tasks/${id}/done (src/lib/api.ts:213)", "shortDescription": {"text": "Dangling fetch: PATCH /tasks/${id}/done (src/lib/api.ts:213)"}, "fullDescription": {"text": "`src/lib/api.ts:213` calls `PATCH /tasks/${id}/done` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/tasks/<p>/done`\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-e4b9b22567282f25", "name": "Dangling fetch: DELETE /tasks/${id} (src/lib/api.ts:215)", "shortDescription": {"text": "Dangling fetch: DELETE /tasks/${id} (src/lib/api.ts:215)"}, "fullDescription": {"text": "`src/lib/api.ts:215` calls `DELETE /tasks/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/tasks/<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-6d8302b670dce108", "name": "Dangling fetch: GET /stats?business_id=${_activeBusinessId} (src/lib/api.ts:218)", "shortDescription": {"text": "Dangling fetch: GET /stats?business_id=${_activeBusinessId} (src/lib/api.ts:218)"}, "fullDescription": {"text": "`src/lib/api.ts:218` calls `GET /stats?business_id=${_activeBusinessId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/stats`\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-bc2335cc9df14f65", "name": "Dangling fetch: GET /quick-replies?${qs} (src/lib/api.ts:224)", "shortDescription": {"text": "Dangling fetch: GET /quick-replies?${qs} (src/lib/api.ts:224)"}, "fullDescription": {"text": "`src/lib/api.ts:224` calls `GET /quick-replies?${qs}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/quick-replies`\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-c417624d9882e27c", "name": "Dangling fetch: POST /quick-replies/presets (src/lib/api.ts:227)", "shortDescription": {"text": "Dangling fetch: POST /quick-replies/presets (src/lib/api.ts:227)"}, "fullDescription": {"text": "`src/lib/api.ts:227` calls `POST /quick-replies/presets` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/quick-replies/presets`\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-6423e3a1257d8778", "name": "Dangling fetch: POST /quick-replies (src/lib/api.ts:229)", "shortDescription": {"text": "Dangling fetch: POST /quick-replies (src/lib/api.ts:229)"}, "fullDescription": {"text": "`src/lib/api.ts:229` calls `POST /quick-replies` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/quick-replies`\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-aa0f81755f290c0b", "name": "Dangling fetch: PUT /quick-replies/${id} (src/lib/api.ts:231)", "shortDescription": {"text": "Dangling fetch: PUT /quick-replies/${id} (src/lib/api.ts:231)"}, "fullDescription": {"text": "`src/lib/api.ts:231` calls `PUT /quick-replies/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/quick-replies/<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-53152c7ba37f420b", "name": "Dangling fetch: DELETE /quick-replies/${id} (src/lib/api.ts:233)", "shortDescription": {"text": "Dangling fetch: DELETE /quick-replies/${id} (src/lib/api.ts:233)"}, "fullDescription": {"text": "`src/lib/api.ts:233` calls `DELETE /quick-replies/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/quick-replies/<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-97733913083b0e49", "name": "Dangling fetch: POST /ai/suggest (src/lib/api.ts:237)", "shortDescription": {"text": "Dangling fetch: POST /ai/suggest (src/lib/api.ts:237)"}, "fullDescription": {"text": "`src/lib/api.ts:237` calls `POST /ai/suggest` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/ai/suggest`\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-96ea566f476ce18d", "name": "Dangling fetch: GET /ai/status (src/lib/api.ts:238)", "shortDescription": {"text": "Dangling fetch: GET /ai/status (src/lib/api.ts:238)"}, "fullDescription": {"text": "`src/lib/api.ts:238` calls `GET /ai/status` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/ai/status`\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-724191127d8f1b71", "name": "Dangling fetch: GET /ai/logs?business_id=${_activeBusinessId} (src/lib/api.ts:239)", "shortDescription": {"text": "Dangling fetch: GET /ai/logs?business_id=${_activeBusinessId} (src/lib/api.ts:239)"}, "fullDescription": {"text": "`src/lib/api.ts:239` calls `GET /ai/logs?business_id=${_activeBusinessId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/ai/logs`\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-64d7773105a3a49d", "name": "Dangling fetch: POST /ai/extract-task (src/lib/api.ts:241)", "shortDescription": {"text": "Dangling fetch: POST /ai/extract-task (src/lib/api.ts:241)"}, "fullDescription": {"text": "`src/lib/api.ts:241` calls `POST /ai/extract-task` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/ai/extract-task`\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-338f3e7a585876b0", "name": "Dangling fetch: POST /ai/analyze-chats (src/lib/api.ts:246)", "shortDescription": {"text": "Dangling fetch: POST /ai/analyze-chats (src/lib/api.ts:246)"}, "fullDescription": {"text": "`src/lib/api.ts:246` calls `POST /ai/analyze-chats` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/ai/analyze-chats`\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-5cb34ab4ae4ca2e7", "name": "Dangling fetch: POST /business/channels (src/lib/api.ts:257)", "shortDescription": {"text": "Dangling fetch: POST /business/channels (src/lib/api.ts:257)"}, "fullDescription": {"text": "`src/lib/api.ts:257` calls `POST /business/channels` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/business/channels`\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-50898fb60ef35c03", "name": "Dangling fetch: DELETE /business/channels/${id} (src/lib/api.ts:262)", "shortDescription": {"text": "Dangling fetch: DELETE /business/channels/${id} (src/lib/api.ts:262)"}, "fullDescription": {"text": "`src/lib/api.ts:262` calls `DELETE /business/channels/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/business/channels/<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-028fb75e9424b637", "name": "Dangling fetch: POST /business/channels/whatsapp/connect (src/lib/api.ts:264)", "shortDescription": {"text": "Dangling fetch: POST /business/channels/whatsapp/connect (src/lib/api.ts:264)"}, "fullDescription": {"text": "`src/lib/api.ts:264` calls `POST /business/channels/whatsapp/connect` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/business/channels/whatsapp/connect`\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-f3b225c14089da50", "name": "Dangling fetch: POST /ai/copilot (src/lib/api.ts:271)", "shortDescription": {"text": "Dangling fetch: POST /ai/copilot (src/lib/api.ts:271)"}, "fullDescription": {"text": "`src/lib/api.ts:271` calls `POST /ai/copilot` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/ai/copilot`\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-8bb8dc4bbf94481f", "name": "Dangling fetch: POST /ai/setup-assistant/chat (src/lib/api.ts:372)", "shortDescription": {"text": "Dangling fetch: POST /ai/setup-assistant/chat (src/lib/api.ts:372)"}, "fullDescription": {"text": "`src/lib/api.ts:372` calls `POST /ai/setup-assistant/chat` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/ai/setup-assistant/chat`\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-9a7a818ad4438ae6", "name": "Dangling fetch: POST /ai/setup-assistant/finalize (src/lib/api.ts:377)", "shortDescription": {"text": "Dangling fetch: POST /ai/setup-assistant/finalize (src/lib/api.ts:377)"}, "fullDescription": {"text": "`src/lib/api.ts:377` calls `POST /ai/setup-assistant/finalize` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/ai/setup-assistant/finalize`\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-d3f0fe43a6dfa8db", "name": "Dangling fetch: GET /notes?contact_id=${contactId} (src/lib/api.ts:384)", "shortDescription": {"text": "Dangling fetch: GET /notes?contact_id=${contactId} (src/lib/api.ts:384)"}, "fullDescription": {"text": "`src/lib/api.ts:384` calls `GET /notes?contact_id=${contactId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/notes`\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-ec03746106090eb8", "name": "Dangling fetch: POST /notes (src/lib/api.ts:386)", "shortDescription": {"text": "Dangling fetch: POST /notes (src/lib/api.ts:386)"}, "fullDescription": {"text": "`src/lib/api.ts:386` calls `POST /notes` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/notes`\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-21a48e16bed2ecb5", "name": "Dangling fetch: DELETE /notes/${id} (src/lib/api.ts:388)", "shortDescription": {"text": "Dangling fetch: DELETE /notes/${id} (src/lib/api.ts:388)"}, "fullDescription": {"text": "`src/lib/api.ts:388` calls `DELETE /notes/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/notes/<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-47a9f7cc160fc485", "name": "Dangling fetch: GET /search?q=${encodeURIComponent(q)} (src/lib/api.ts:392)", "shortDescription": {"text": "Dangling fetch: GET /search?q=${encodeURIComponent(q)} (src/lib/api.ts:392)"}, "fullDescription": {"text": "`src/lib/api.ts:392` calls `GET /search?q=${encodeURIComponent(q)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/search`\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-a070796220b481b6", "name": "Dangling fetch: GET /reports?${qs} (src/lib/api.ts:399)", "shortDescription": {"text": "Dangling fetch: GET /reports?${qs} (src/lib/api.ts:399)"}, "fullDescription": {"text": "`src/lib/api.ts:399` calls `GET /reports?${qs}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/reports`\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-a7eb1386f3cb9426", "name": "Dangling fetch: GET /activity${qs} (src/lib/api.ts:405)", "shortDescription": {"text": "Dangling fetch: GET /activity${qs} (src/lib/api.ts:405)"}, "fullDescription": {"text": "`src/lib/api.ts:405` calls `GET /activity${qs}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/activity/<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-7cf3fdf350173937", "name": "Dangling fetch: GET /pipeline?contact_id=${contactId} (src/lib/api.ts:410)", "shortDescription": {"text": "Dangling fetch: GET /pipeline?contact_id=${contactId} (src/lib/api.ts:410)"}, "fullDescription": {"text": "`src/lib/api.ts:410` calls `GET /pipeline?contact_id=${contactId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/pipeline`\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-516da19a28e9ac18", "name": "Dangling fetch: GET /conversations?contact_id=${contactId} (src/lib/api.ts:412)", "shortDescription": {"text": "Dangling fetch: GET /conversations?contact_id=${contactId} (src/lib/api.ts:412)"}, "fullDescription": {"text": "`src/lib/api.ts:412` calls `GET /conversations?contact_id=${contactId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/conversations`\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-e92e20469640cc21", "name": "Dangling fetch: GET /tasks?contact_id=${contactId} (src/lib/api.ts:414)", "shortDescription": {"text": "Dangling fetch: GET /tasks?contact_id=${contactId} (src/lib/api.ts:414)"}, "fullDescription": {"text": "`src/lib/api.ts:414` calls `GET /tasks?contact_id=${contactId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/tasks`\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-bcd5778d3f94dfc2", "name": "Dangling fetch: GET /appointments?${qs} (src/lib/api.ts:421)", "shortDescription": {"text": "Dangling fetch: GET /appointments?${qs} (src/lib/api.ts:421)"}, "fullDescription": {"text": "`src/lib/api.ts:421` calls `GET /appointments?${qs}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/appointments`\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-c8ba42ca27b675f6", "name": "Dangling fetch: GET /appointments/slots?date=${date}&duration=${duration} (src/lib/api.ts:424)", "shortDescription": {"text": "Dangling fetch: GET /appointments/slots?date=${date}&duration=${duration} (src/lib/api.ts:424)"}, "fullDescription": {"text": "`src/lib/api.ts:424` calls `GET /appointments/slots?date=${date}&duration=${duration}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/appointments/slots`\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-8fcd5192972bf2a9", "name": "Dangling fetch: POST /appointments (src/lib/api.ts:426)", "shortDescription": {"text": "Dangling fetch: POST /appointments (src/lib/api.ts:426)"}, "fullDescription": {"text": "`src/lib/api.ts:426` calls `POST /appointments` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/appointments`\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-706bebdc0bc6d477", "name": "Dangling fetch: PUT /appointments/${id} (src/lib/api.ts:428)", "shortDescription": {"text": "Dangling fetch: PUT /appointments/${id} (src/lib/api.ts:428)"}, "fullDescription": {"text": "`src/lib/api.ts:428` calls `PUT /appointments/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/appointments/<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-1b43f15a54d76735", "name": "Dangling fetch: PATCH /appointments/${id}/status (src/lib/api.ts:430)", "shortDescription": {"text": "Dangling fetch: PATCH /appointments/${id}/status (src/lib/api.ts:430)"}, "fullDescription": {"text": "`src/lib/api.ts:430` calls `PATCH /appointments/${id}/status` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/appointments/<p>/status`\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-14a1f56e5504e70a", "name": "Dangling fetch: DELETE /appointments/${id} (src/lib/api.ts:432)", "shortDescription": {"text": "Dangling fetch: DELETE /appointments/${id} (src/lib/api.ts:432)"}, "fullDescription": {"text": "`src/lib/api.ts:432` calls `DELETE /appointments/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/appointments/<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-5e21b3b89c48ba7f", "name": "Dangling fetch: POST /appointments/${id}/remind (src/lib/api.ts:434)", "shortDescription": {"text": "Dangling fetch: POST /appointments/${id}/remind (src/lib/api.ts:434)"}, "fullDescription": {"text": "`src/lib/api.ts:434` calls `POST /appointments/${id}/remind` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/appointments/<p>/remind`\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-4a00d06c1b43318c", "name": "Dangling fetch: GET /services (src/lib/api.ts:439)", "shortDescription": {"text": "Dangling fetch: GET /services (src/lib/api.ts:439)"}, "fullDescription": {"text": "`src/lib/api.ts:439` calls `GET /services` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/services`\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-d0f187e79478f10c", "name": "Dangling fetch: POST /services (src/lib/api.ts:441)", "shortDescription": {"text": "Dangling fetch: POST /services (src/lib/api.ts:441)"}, "fullDescription": {"text": "`src/lib/api.ts:441` calls `POST /services` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/services`\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-8f6de3ef50066f85", "name": "Dangling fetch: PUT /services/${id} (src/lib/api.ts:443)", "shortDescription": {"text": "Dangling fetch: PUT /services/${id} (src/lib/api.ts:443)"}, "fullDescription": {"text": "`src/lib/api.ts:443` calls `PUT /services/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/services/<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-5f91b2bea4a5dea3", "name": "Dangling fetch: DELETE /services/${id} (src/lib/api.ts:445)", "shortDescription": {"text": "Dangling fetch: DELETE /services/${id} (src/lib/api.ts:445)"}, "fullDescription": {"text": "`src/lib/api.ts:445` calls `DELETE /services/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/services/<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-34d4efb0f3d6c7be", "name": "Dangling fetch: GET /memories (src/lib/api.ts:449)", "shortDescription": {"text": "Dangling fetch: GET /memories (src/lib/api.ts:449)"}, "fullDescription": {"text": "`src/lib/api.ts:449` calls `GET /memories` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/memories`\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-9def7ed9582af2df", "name": "Dangling fetch: POST /memories (src/lib/api.ts:451)", "shortDescription": {"text": "Dangling fetch: POST /memories (src/lib/api.ts:451)"}, "fullDescription": {"text": "`src/lib/api.ts:451` calls `POST /memories` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/memories`\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-06ea491367b4882f", "name": "Dangling fetch: PATCH /memories/${id} (src/lib/api.ts:453)", "shortDescription": {"text": "Dangling fetch: PATCH /memories/${id} (src/lib/api.ts:453)"}, "fullDescription": {"text": "`src/lib/api.ts:453` calls `PATCH /memories/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/memories/<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-d07fc3f99bdaaf6f", "name": "Dangling fetch: DELETE /memories/${id} (src/lib/api.ts:455)", "shortDescription": {"text": "Dangling fetch: DELETE /memories/${id} (src/lib/api.ts:455)"}, "fullDescription": {"text": "`src/lib/api.ts:455` calls `DELETE /memories/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/memories/<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-fe78859da9e1470a", "name": "Dangling fetch: GET /broadcasts (src/lib/api.ts:458)", "shortDescription": {"text": "Dangling fetch: GET /broadcasts (src/lib/api.ts:458)"}, "fullDescription": {"text": "`src/lib/api.ts:458` calls `GET /broadcasts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/broadcasts`\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-d3509a9a5676afbe", "name": "Dangling fetch: GET /broadcasts/${id} (src/lib/api.ts:459)", "shortDescription": {"text": "Dangling fetch: GET /broadcasts/${id} (src/lib/api.ts:459)"}, "fullDescription": {"text": "`src/lib/api.ts:459` calls `GET /broadcasts/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/broadcasts/<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-41ad28adc3e597aa", "name": "Dangling fetch: GET /broadcasts/preview/count?${qs} (src/lib/api.ts:463)", "shortDescription": {"text": "Dangling fetch: GET /broadcasts/preview/count?${qs} (src/lib/api.ts:463)"}, "fullDescription": {"text": "`src/lib/api.ts:463` calls `GET /broadcasts/preview/count?${qs}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/broadcasts/preview/count`\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-ff14051528f82962", "name": "Dangling fetch: POST /broadcasts (src/lib/api.ts:466)", "shortDescription": {"text": "Dangling fetch: POST /broadcasts (src/lib/api.ts:466)"}, "fullDescription": {"text": "`src/lib/api.ts:466` calls `POST /broadcasts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/broadcasts`\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-ed66e8875ece737b", "name": "Dangling fetch: POST /broadcasts/${id}/send (src/lib/api.ts:468)", "shortDescription": {"text": "Dangling fetch: POST /broadcasts/${id}/send (src/lib/api.ts:468)"}, "fullDescription": {"text": "`src/lib/api.ts:468` calls `POST /broadcasts/${id}/send` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/broadcasts/<p>/send`\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-edbfc7ca98b4d818", "name": "Dangling fetch: DELETE /broadcasts/${id} (src/lib/api.ts:470)", "shortDescription": {"text": "Dangling fetch: DELETE /broadcasts/${id} (src/lib/api.ts:470)"}, "fullDescription": {"text": "`src/lib/api.ts:470` calls `DELETE /broadcasts/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/broadcasts/<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-de295af58272766e", "name": "Dangling fetch: GET /team (src/lib/api.ts:474)", "shortDescription": {"text": "Dangling fetch: GET /team (src/lib/api.ts:474)"}, "fullDescription": {"text": "`src/lib/api.ts:474` calls `GET /team` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/team`\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-d19541ca07dfd4b4", "name": "Dangling fetch: GET /team/invitations (src/lib/api.ts:476)", "shortDescription": {"text": "Dangling fetch: GET /team/invitations (src/lib/api.ts:476)"}, "fullDescription": {"text": "`src/lib/api.ts:476` calls `GET /team/invitations` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/team/invitations`\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-ce63e5b5610cb38d", "name": "Dangling fetch: GET /team/join/${token} (src/lib/api.ts:478)", "shortDescription": {"text": "Dangling fetch: GET /team/join/${token} (src/lib/api.ts:478)"}, "fullDescription": {"text": "`src/lib/api.ts:478` calls `GET /team/join/${token}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/team/join/<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-5c1edde6650cf529", "name": "Dangling fetch: POST /team/invite (src/lib/api.ts:480)", "shortDescription": {"text": "Dangling fetch: POST /team/invite (src/lib/api.ts:480)"}, "fullDescription": {"text": "`src/lib/api.ts:480` calls `POST /team/invite` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/team/invite`\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-04f7f47bc277f854", "name": "Dangling fetch: POST /team/join (src/lib/api.ts:485)", "shortDescription": {"text": "Dangling fetch: POST /team/join (src/lib/api.ts:485)"}, "fullDescription": {"text": "`src/lib/api.ts:485` calls `POST /team/join` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/team/join`\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-dd0be9377ae5f7f8", "name": "Dangling fetch: DELETE /team/invitations/${id} (src/lib/api.ts:490)", "shortDescription": {"text": "Dangling fetch: DELETE /team/invitations/${id} (src/lib/api.ts:490)"}, "fullDescription": {"text": "`src/lib/api.ts:490` calls `DELETE /team/invitations/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/team/invitations/<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-ae331781d77992b9", "name": "Dangling fetch: PATCH /team/${memberId}/role (src/lib/api.ts:492)", "shortDescription": {"text": "Dangling fetch: PATCH /team/${memberId}/role (src/lib/api.ts:492)"}, "fullDescription": {"text": "`src/lib/api.ts:492` calls `PATCH /team/${memberId}/role` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/team/<p>/role`\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-46dbd5519dd84deb", "name": "Dangling fetch: DELETE /team/${memberId} (src/lib/api.ts:497)", "shortDescription": {"text": "Dangling fetch: DELETE /team/${memberId} (src/lib/api.ts:497)"}, "fullDescription": {"text": "`src/lib/api.ts:497` calls `DELETE /team/${memberId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/team/<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-4756b4c4da7d2088", "name": "Unused endpoint: GET /api/health", "shortDescription": {"text": "Unused endpoint: GET /api/health"}, "fullDescription": {"text": "`server/index.ts` declares `GET /api/health` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-203ec659ed8ada77", "name": "Unused endpoint: USE /api/webhooks", "shortDescription": {"text": "Unused endpoint: USE /api/webhooks"}, "fullDescription": {"text": "`server/index.ts` declares `USE /api/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-83203709e066fa32", "name": "Unused endpoint: USE /api/public/book", "shortDescription": {"text": "Unused endpoint: USE /api/public/book"}, "fullDescription": {"text": "`server/index.ts` declares `USE /api/public/book` 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-c1b288117a6e8a7a", "name": "Unused endpoint: USE /api/business", "shortDescription": {"text": "Unused endpoint: USE /api/business"}, "fullDescription": {"text": "`server/index.ts` declares `USE /api/business` 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-70583fbeefb962c2", "name": "Unused endpoint: USE /api/contacts", "shortDescription": {"text": "Unused endpoint: USE /api/contacts"}, "fullDescription": {"text": "`server/index.ts` declares `USE /api/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-c73e8bea8e1d1368", "name": "Unused endpoint: USE /api/conversations", "shortDescription": {"text": "Unused endpoint: USE /api/conversations"}, "fullDescription": {"text": "`server/index.ts` declares `USE /api/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-9a300508c4edb651", "name": "Unused endpoint: USE /api/messages", "shortDescription": {"text": "Unused endpoint: USE /api/messages"}, "fullDescription": {"text": "`server/index.ts` declares `USE /api/messages` 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-0ab055a45f0b96b6", "name": "Unused endpoint: USE /api/pipeline", "shortDescription": {"text": "Unused endpoint: USE /api/pipeline"}, "fullDescription": {"text": "`server/index.ts` declares `USE /api/pipeline` 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-6330b0c4a0a152d3", "name": "Unused endpoint: USE /api/tasks", "shortDescription": {"text": "Unused endpoint: USE /api/tasks"}, "fullDescription": {"text": "`server/index.ts` declares `USE /api/tasks` 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-06c88a2e2dc65557", "name": "Unused endpoint: USE /api/stats", "shortDescription": {"text": "Unused endpoint: USE /api/stats"}, "fullDescription": {"text": "`server/index.ts` declares `USE /api/stats` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-316c43db307befc3", "name": "Unused endpoint: USE /api/ai", "shortDescription": {"text": "Unused endpoint: USE /api/ai"}, "fullDescription": {"text": "`server/index.ts` declares `USE /api/ai` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e804f3fe26cb30d9", "name": "Unused endpoint: USE /api/quick-replies", "shortDescription": {"text": "Unused endpoint: USE /api/quick-replies"}, "fullDescription": {"text": "`server/index.ts` declares `USE /api/quick-replies` 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-4dc6237d07348713", "name": "Unused endpoint: USE /api/memories", "shortDescription": {"text": "Unused endpoint: USE /api/memories"}, "fullDescription": {"text": "`server/index.ts` declares `USE /api/memories` 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-058eab53385fceec", "name": "Unused endpoint: USE /api/ai/insights", "shortDescription": {"text": "Unused endpoint: USE /api/ai/insights"}, "fullDescription": {"text": "`server/index.ts` declares `USE /api/ai/insights` 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-188d2a5d9a7fddd9", "name": "Unused endpoint: USE /api/ai/setup-assistant", "shortDescription": {"text": "Unused endpoint: USE /api/ai/setup-assistant"}, "fullDescription": {"text": "`server/index.ts` declares `USE /api/ai/setup-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-e932839200aed5ac", "name": "Unused endpoint: USE /api/ai/copilot", "shortDescription": {"text": "Unused endpoint: USE /api/ai/copilot"}, "fullDescription": {"text": "`server/index.ts` declares `USE /api/ai/copilot` 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-1b6c609850c719b2", "name": "Unused endpoint: USE /api/notes", "shortDescription": {"text": "Unused endpoint: USE /api/notes"}, "fullDescription": {"text": "`server/index.ts` declares `USE /api/notes` 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-a74449cc5d561bad", "name": "Unused endpoint: USE /api/search", "shortDescription": {"text": "Unused endpoint: USE /api/search"}, "fullDescription": {"text": "`server/index.ts` declares `USE /api/search` 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-2a06e6d401449b82", "name": "Unused endpoint: USE /api/reports", "shortDescription": {"text": "Unused endpoint: USE /api/reports"}, "fullDescription": {"text": "`server/index.ts` declares `USE /api/reports` 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-70d1dce5c086c6b4", "name": "Unused endpoint: USE /api/activity", "shortDescription": {"text": "Unused endpoint: USE /api/activity"}, "fullDescription": {"text": "`server/index.ts` declares `USE /api/activity` 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-2f94b4c7d983f1df", "name": "Unused endpoint: USE /api/appointments", "shortDescription": {"text": "Unused endpoint: USE /api/appointments"}, "fullDescription": {"text": "`server/index.ts` declares `USE /api/appointments` 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-10484ff622717d30", "name": "Unused endpoint: USE /api/services", "shortDescription": {"text": "Unused endpoint: USE /api/services"}, "fullDescription": {"text": "`server/index.ts` declares `USE /api/services` 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-da48c098aa00614d", "name": "Unused endpoint: USE /api/broadcasts", "shortDescription": {"text": "Unused endpoint: USE /api/broadcasts"}, "fullDescription": {"text": "`server/index.ts` declares `USE /api/broadcasts` 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-c7472eefab50d274", "name": "Unused endpoint: USE /api/team", "shortDescription": {"text": "Unused endpoint: USE /api/team"}, "fullDescription": {"text": "`server/index.ts` declares `USE /api/team` 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-946dc627de4f272d", "name": "Unused endpoint: USE /api/billing", "shortDescription": {"text": "Unused endpoint: USE /api/billing"}, "fullDescription": {"text": "`server/index.ts` declares `USE /api/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-ab91e694dc0e7551", "name": "Unused endpoint: USE /api/media", "shortDescription": {"text": "Unused endpoint: USE /api/media"}, "fullDescription": {"text": "`server/index.ts` declares `USE /api/media` 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-27cc2bb73ad635b3", "name": "Unused endpoint: POST /suggest", "shortDescription": {"text": "Unused endpoint: POST /suggest"}, "fullDescription": {"text": "`server/routes/ai.ts` declares `POST /suggest` 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-72f99d58636b648b", "name": "Unused endpoint: GET /logs", "shortDescription": {"text": "Unused endpoint: GET /logs"}, "fullDescription": {"text": "`server/routes/ai.ts` declares `GET /logs` 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-a44480977487ac0a", "name": "Unused endpoint: POST /extract-task", "shortDescription": {"text": "Unused endpoint: POST /extract-task"}, "fullDescription": {"text": "`server/routes/ai.ts` declares `POST /extract-task` 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-01f033b16ef714bc", "name": "Unused endpoint: POST /analyze-chats", "shortDescription": {"text": "Unused endpoint: POST /analyze-chats"}, "fullDescription": {"text": "`server/routes/ai.ts` declares `POST /analyze-chats` 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-3c441e631a953f58", "name": "Unused endpoint: POST /generate-followup", "shortDescription": {"text": "Unused endpoint: POST /generate-followup"}, "fullDescription": {"text": "`server/routes/ai.ts` declares `POST /generate-followup` 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-c42bba47518b038a", "name": "Unused endpoint: GET /meta/whatsapp", "shortDescription": {"text": "Unused endpoint: GET /meta/whatsapp"}, "fullDescription": {"text": "`server/routes/webhooks.ts` declares `GET /meta/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-656758dd8b27b402", "name": "Unused endpoint: POST /meta/whatsapp", "shortDescription": {"text": "Unused endpoint: POST /meta/whatsapp"}, "fullDescription": {"text": "`server/routes/webhooks.ts` declares `POST /meta/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-6236b283b79811b8", "name": "Unused endpoint: POST /upload", "shortDescription": {"text": "Unused endpoint: POST /upload"}, "fullDescription": {"text": "`server/routes/media.ts` declares `POST /upload` 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": "`server/routes/stats.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-7a009b1a56794f45", "name": "Unused endpoint: POST /", "shortDescription": {"text": "Unused endpoint: POST /"}, "fullDescription": {"text": "`server/routes/messages.ts` declares `POST /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-86f4172afb1b0ad5", "name": "Unused endpoint: POST /create-checkout-session", "shortDescription": {"text": "Unused endpoint: POST /create-checkout-session"}, "fullDescription": {"text": "`server/routes/billing.ts` declares `POST /create-checkout-session` 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": "`server/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-0ae38010c60493f1", "name": "Unused endpoint: POST /webhook", "shortDescription": {"text": "Unused endpoint: POST /webhook"}, "fullDescription": {"text": "`server/routes/billing.ts` declares `POST /webhook` 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-bd645cc6653a585b", "name": "Unused endpoint: PATCH /:id/done", "shortDescription": {"text": "Unused endpoint: PATCH /:id/done"}, "fullDescription": {"text": "`server/routes/tasks.ts` declares `PATCH /:id/done` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7a61c112b611f4bb", "name": "Unused endpoint: DELETE /:id", "shortDescription": {"text": "Unused endpoint: DELETE /:id"}, "fullDescription": {"text": "`server/routes/tasks.ts` declares `DELETE /:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a6f226130b2c66e7", "name": "Unused endpoint: GET /invitations", "shortDescription": {"text": "Unused endpoint: GET /invitations"}, "fullDescription": {"text": "`server/routes/team.ts` declares `GET /invitations` 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-ec0e5cdfd38ef5d1", "name": "Unused endpoint: GET /join/:token", "shortDescription": {"text": "Unused endpoint: GET /join/:token"}, "fullDescription": {"text": "`server/routes/team.ts` declares `GET /join/:token` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-46eb93a4accdc83b", "name": "Unused endpoint: POST /invite", "shortDescription": {"text": "Unused endpoint: POST /invite"}, "fullDescription": {"text": "`server/routes/team.ts` declares `POST /invite` 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-633d0a653ebbf1bf", "name": "Unused endpoint: POST /join", "shortDescription": {"text": "Unused endpoint: POST /join"}, "fullDescription": {"text": "`server/routes/team.ts` declares `POST /join` 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-1fe337c480ef3344", "name": "Unused endpoint: DELETE /invitations/:id", "shortDescription": {"text": "Unused endpoint: DELETE /invitations/:id"}, "fullDescription": {"text": "`server/routes/team.ts` declares `DELETE /invitations/: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-8840c97805835143", "name": "Unused endpoint: PATCH /:memberId/role", "shortDescription": {"text": "Unused endpoint: PATCH /:memberId/role"}, "fullDescription": {"text": "`server/routes/team.ts` declares `PATCH /:memberId/role` 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-1de30ab94408364d", "name": "Unused endpoint: DELETE /:memberId", "shortDescription": {"text": "Unused endpoint: DELETE /:memberId"}, "fullDescription": {"text": "`server/routes/team.ts` declares `DELETE /:memberId` 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-5f4ee569e1562771", "name": "Unused endpoint: POST /stream", "shortDescription": {"text": "Unused endpoint: POST /stream"}, "fullDescription": {"text": "`server/routes/copilot.ts` declares `POST /stream` 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-dd71dfa1d0356c5b", "name": "Unused endpoint: GET /:slug", "shortDescription": {"text": "Unused endpoint: GET /:slug"}, "fullDescription": {"text": "`server/routes/publicBook.ts` declares `GET /:slug` 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/17720"}, "properties": {"repository": "rafaelsanz9696-coder/clienteloop", "repoUrl": "https://github.com/rafaelsanz9696-coder/clienteloop", "branch": "main"}, "results": [{"ruleId": "scanner-c70c72f9ecab68d7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/index.ts:63"}, "properties": {"repobilityId": "b4961a877930fd2f", "scanner": "scanner-primary", "fingerprint": "c70c72f9ecab68d7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e90dc66354181a68", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/lib/gemini.ts:197"}, "properties": {"repobilityId": "454525b75f45eead", "scanner": "scanner-primary", "fingerprint": "e90dc66354181a68", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ff42b59602058e59", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/lib/agent-memory.ts:39"}, "properties": {"repobilityId": "48f0d5ba6812cd79", "scanner": "scanner-primary", "fingerprint": "ff42b59602058e59", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-402fbb348c35cdb4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/lib/wa-retry.ts:20"}, "properties": {"repobilityId": "550872f417c3730b", "scanner": "scanner-primary", "fingerprint": "402fbb348c35cdb4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-dc4b4f7fd0b098d8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/lib/automation.ts:34"}, "properties": {"repobilityId": "403d193da2a8899e", "scanner": "scanner-primary", "fingerprint": "dc4b4f7fd0b098d8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3cb965d4bda11d3a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/lib/reminder-scheduler.ts:59"}, "properties": {"repobilityId": "84c03ddfc1284205", "scanner": "scanner-primary", "fingerprint": "3cb965d4bda11d3a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-dcf9a06d63f479a6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/lib/broadcast-sender.ts:58"}, "properties": {"repobilityId": "e5677e9618df3c63", "scanner": "scanner-primary", "fingerprint": "dcf9a06d63f479a6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fb2343aef3bfd56d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/routes/webhooks.ts:163"}, "properties": {"repobilityId": "eb5c2c1ae4faa75c", "scanner": "scanner-primary", "fingerprint": "fb2343aef3bfd56d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8508202dedc6a878", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/routes/billing.ts:141"}, "properties": {"repobilityId": "9cc127787e588130", "scanner": "scanner-primary", "fingerprint": "8508202dedc6a878", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5823f358a38faf58", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/routes/copilot.ts:687"}, "properties": {"repobilityId": "ab7a1cf7296b16d3", "scanner": "scanner-primary", "fingerprint": "5823f358a38faf58", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-64678ea4d324e387", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/routes/business.ts:190"}, "properties": {"repobilityId": "782a74e24a08e23b", "scanner": "scanner-primary", "fingerprint": "64678ea4d324e387", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a2ff307e7d95fa44", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/channels/whatsapp.adapter.ts:20"}, "properties": {"repobilityId": "6d5dc31aaa14062a", "scanner": "scanner-primary", "fingerprint": "a2ff307e7d95fa44", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c8e649b8ef82d40b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/channels/instagram.adapter.ts:7"}, "properties": {"repobilityId": "7fc106bc753871a1", "scanner": "scanner-primary", "fingerprint": "c8e649b8ef82d40b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d0cc53ba0b78408b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/db/seed.ts:3"}, "properties": {"repobilityId": "42a377a874d37b13", "scanner": "scanner-primary", "fingerprint": "d0cc53ba0b78408b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a42409550a08c782", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/db/seed_user.ts:29"}, "properties": {"repobilityId": "68c5320587c902cb", "scanner": "scanner-primary", "fingerprint": "a42409550a08c782", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6a70a4b4056fad34", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/db/database.ts:332"}, "properties": {"repobilityId": "1c848d2ce4eb7350", "scanner": "scanner-primary", "fingerprint": "6a70a4b4056fad34", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f20217e6c33534fd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/TopBar.tsx:143"}, "properties": {"repobilityId": "79fccb9b9fb1717f", "scanner": "scanner-primary", "fingerprint": "f20217e6c33534fd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c696eb1f01645568", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/Sidebar.tsx:178"}, "properties": {"repobilityId": "be1152cdf47927a8", "scanner": "scanner-primary", "fingerprint": "c696eb1f01645568", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3b9d9adb6ad04010", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/appointments/AppointmentBlock.tsx:75"}, "properties": {"repobilityId": "d5a9b01cafb346b1", "scanner": "scanner-primary", "fingerprint": "3b9d9adb6ad04010", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-15de90cd33d8ed87", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ContactsPage.tsx:330"}, "properties": {"repobilityId": "67e0f38be97acfa3", "scanner": "scanner-primary", "fingerprint": "15de90cd33d8ed87", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a58626b90f319d31", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/AppointmentsPage.tsx:500"}, "properties": {"repobilityId": "b4cadf859016f3f4", "scanner": "scanner-primary", "fingerprint": "a58626b90f319d31", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-47ba160d3fccb5f7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/InboxPage.tsx:411"}, "properties": {"repobilityId": "d7bbf58f91c89866", "scanner": "scanner-primary", "fingerprint": "47ba160d3fccb5f7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6093a3dafb480e27", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/PipelinePage.tsx:86"}, "properties": {"repobilityId": "487c150dec8f9319", "scanner": "scanner-primary", "fingerprint": "6093a3dafb480e27", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-090fe0694b374cbe", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/SettingsPage.tsx:677"}, "properties": {"repobilityId": "add0522bc3d8f17c", "scanner": "scanner-primary", "fingerprint": "090fe0694b374cbe", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-773aad54b0c39a9b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/BroadcastPage.tsx:372"}, "properties": {"repobilityId": "838a86e645390f4f", "scanner": "scanner-primary", "fingerprint": "773aad54b0c39a9b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-69efeafe1fc5bd84", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ReportsPage.tsx:263"}, "properties": {"repobilityId": "69686394452cbf79", "scanner": "scanner-primary", "fingerprint": "69efeafe1fc5bd84", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-96e829b7dd112e93", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/DashboardPage.tsx:100"}, "properties": {"repobilityId": "5248edf1e73ab3b6", "scanner": "scanner-primary", "fingerprint": "96e829b7dd112e93", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"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-caa395488e4a496f", "level": "note", "message": {"text": "Very large file: src/pages/ContactsPage.tsx (976 lines)"}, "properties": {"repobilityId": "cea17720767ad458", "scanner": "scanner-primary", "fingerprint": "caa395488e4a496f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-720fae52bd85a6e7", "level": "note", "message": {"text": "Very large file: src/pages/InboxPage.tsx (1525 lines)"}, "properties": {"repobilityId": "e936afa890ce6ba7", "scanner": "scanner-primary", "fingerprint": "720fae52bd85a6e7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-2b05f1976629287a", "level": "note", "message": {"text": "Very large file: src/pages/SettingsPage.tsx (1722 lines)"}, "properties": {"repobilityId": "473796bf27d30566", "scanner": "scanner-primary", "fingerprint": "2b05f1976629287a", "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": "1230f56c2952a9c6", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "09c71bfbcb6f6444", "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": "ecda019f7db53f66", "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": "043eb91b1af16f49", "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": "778f06fe98035b9e", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "8ab1e28703ea3e64", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "4169fd804f5b4842", "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": "ee4606170c641455", "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": "f425f9c496227522", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-f3cc89c2755fbb1e", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/app.spec.ts:27"}, "properties": {"repobilityId": "036bfdb646aa2b6c", "scanner": "scanner-primary", "fingerprint": "f3cc89c2755fbb1e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b06872a8fa17c922", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/lib/gemini.ts:32"}, "properties": {"repobilityId": "338e3ebc4ee3116b", "scanner": "scanner-primary", "fingerprint": "b06872a8fa17c922", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e342c58f45792519", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/lib/meta-media.ts:36"}, "properties": {"repobilityId": "0afbc944c81bcfae", "scanner": "scanner-primary", "fingerprint": "e342c58f45792519", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e87afd5c67d29b36", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/routes/business.ts:129"}, "properties": {"repobilityId": "1f87e64a8ede1703", "scanner": "scanner-primary", "fingerprint": "e87afd5c67d29b36", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-55e00bbba1661958", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/channels/whatsapp.adapter.ts:189"}, "properties": {"repobilityId": "51b2f00d13fb7073", "scanner": "scanner-primary", "fingerprint": "55e00bbba1661958", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bbb945e2355c90cb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/dashboard/AIInsightsPanel.tsx:40"}, "properties": {"repobilityId": "175fd860d80b2305", "scanner": "scanner-primary", "fingerprint": "bbb945e2355c90cb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c7bb20bc89ab23f3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/api.ts:70"}, "properties": {"repobilityId": "2020619d5611c6fc", "scanner": "scanner-primary", "fingerprint": "c7bb20bc89ab23f3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bcce3787591f1d10", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/pages/BookingPage.tsx:45"}, "properties": {"repobilityId": "38fd19fb384bdbd9", "scanner": "scanner-primary", "fingerprint": "bcce3787591f1d10", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cc0f9d8e41b33b0e", "level": "note", "message": {"text": "11 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "c82cd8cd626c3599", "scanner": "scanner-primary", "fingerprint": "cc0f9d8e41b33b0e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-250f15d809026909", "level": "warning", "message": {"text": "Frontend route `/register` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "c0f9df1320a5cb31", "scanner": "scanner-primary", "fingerprint": "250f15d809026909", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-9a0b99730ac89264", "level": "warning", "message": {"text": "Frontend route `/book/:slug` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "a00e96c549e10484", "scanner": "scanner-primary", "fingerprint": "9a0b99730ac89264", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d0522f6760df0394", "level": "warning", "message": {"text": "Frontend route `inbox` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "931346a4c1b63171", "scanner": "scanner-primary", "fingerprint": "d0522f6760df0394", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-12e52466b0abfd1e", "level": "warning", "message": {"text": "Frontend route `inbox/:conversationId` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "5278c1f814e006d9", "scanner": "scanner-primary", "fingerprint": "12e52466b0abfd1e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-15b9288cde0b54ac", "level": "warning", "message": {"text": "Frontend route `contacts` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "8e3e2347429dcf29", "scanner": "scanner-primary", "fingerprint": "15b9288cde0b54ac", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-76880027ca7a4bdd", "level": "warning", "message": {"text": "Frontend route `contacts/:contactId` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "61c12b562b720301", "scanner": "scanner-primary", "fingerprint": "76880027ca7a4bdd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-2558aec0e7ff57ce", "level": "warning", "message": {"text": "Frontend route `pipeline` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "41b8dd8f59bbf898", "scanner": "scanner-primary", "fingerprint": "2558aec0e7ff57ce", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-6ebc3abb02dfbca3", "level": "warning", "message": {"text": "Frontend route `tasks` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "83ee0a29cd5a5263", "scanner": "scanner-primary", "fingerprint": "6ebc3abb02dfbca3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-46b6afd7e3907927", "level": "warning", "message": {"text": "Frontend route `appointments` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "065a8b556eeebad8", "scanner": "scanner-primary", "fingerprint": "46b6afd7e3907927", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d2153e1710f15466", "level": "warning", "message": {"text": "Frontend route `reports` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "6004b8edc6b1aba1", "scanner": "scanner-primary", "fingerprint": "d2153e1710f15466", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f11b5ad45ae76d49", "level": "warning", "message": {"text": "Frontend route `broadcast` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "b144051128a1a2f4", "scanner": "scanner-primary", "fingerprint": "f11b5ad45ae76d49", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-0626b4c2e4efcb82", "level": "warning", "message": {"text": "Frontend route `settings` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "9badda3b3a471962", "scanner": "scanner-primary", "fingerprint": "0626b4c2e4efcb82", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-dc73f0342699743f", "level": "warning", "message": {"text": "Frontend route `/inbox/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "42f5c420605acce6", "scanner": "scanner-primary", "fingerprint": "dc73f0342699743f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-94030d33c8aee0f1", "level": "warning", "message": {"text": "Frontend route `/dashboard` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "e2bd8872a6202965", "scanner": "scanner-primary", "fingerprint": "94030d33c8aee0f1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-4c96500179de8117", "level": "warning", "message": {"text": "Frontend route `/settings` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "f9dbc8064fa9a6da", "scanner": "scanner-primary", "fingerprint": "4c96500179de8117", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-84beb094e45e0074", "level": "error", "message": {"text": "Dangling fetch: GET https://graph.facebook.com/v19.0/${mediaId} (server/lib/meta-media.ts:36)"}, "properties": {"repobilityId": "f5c6389369a2d682", "scanner": "scanner-primary", "fingerprint": "84beb094e45e0074", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-738805042f65a300", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/v19.0/${waba_id}/subscribed_apps (server/routes/business.ts:169)"}, "properties": {"repobilityId": "efb06fa25ca06d43", "scanner": "scanner-primary", "fingerprint": "738805042f65a300", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e84da8d8698d1077", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/v19.0/${phoneId}/messages (server/channels/whatsapp.adapter.ts:31)"}, "properties": {"repobilityId": "367963bf55ac1ed4", "scanner": "scanner-primary", "fingerprint": "e84da8d8698d1077", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-677083bec36f87a2", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/v19.0/${phoneId}/messages (server/channels/whatsapp.adapter.ts:189)"}, "properties": {"repobilityId": "12ce44c1d5495fb9", "scanner": "scanner-primary", "fingerprint": "677083bec36f87a2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-65d57eb9f37fb97a", "level": "error", "message": {"text": "Dangling fetch: GET /business (src/lib/api.ts:77)"}, "properties": {"repobilityId": "bf1542e8887afbdd", "scanner": "scanner-primary", "fingerprint": "65d57eb9f37fb97a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-b59ef9033c5110d7", "level": "error", "message": {"text": "Dangling fetch: GET /business/${id ?? _activeBusinessId} (src/lib/api.ts:79)"}, "properties": {"repobilityId": "43761084272bd8bc", "scanner": "scanner-primary", "fingerprint": "b59ef9033c5110d7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-60b600378e05ec97", "level": "error", "message": {"text": "Dangling fetch: POST /business (src/lib/api.ts:81)"}, "properties": {"repobilityId": "eafc6c345e31875e", "scanner": "scanner-primary", "fingerprint": "60b600378e05ec97", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-deaa0e5d7ca621e3", "level": "error", "message": {"text": "Dangling fetch: PUT /business/${id} (src/lib/api.ts:83)"}, "properties": {"repobilityId": "4aa54d99e15de256", "scanner": "scanner-primary", "fingerprint": "deaa0e5d7ca621e3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-a16f84eb5bca4902", "level": "error", "message": {"text": "Dangling fetch: PATCH /business/booking-slug (src/lib/api.ts:85)"}, "properties": {"repobilityId": "93c99df95c717325", "scanner": "scanner-primary", "fingerprint": "a16f84eb5bca4902", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-46ee2405acc7250e", "level": "error", "message": {"text": "Dangling fetch: GET /contacts?${qs} (src/lib/api.ts:96)"}, "properties": {"repobilityId": "f9168c6ef78bdf1f", "scanner": "scanner-primary", "fingerprint": "46ee2405acc7250e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-40edeeb288eccdff", "level": "error", "message": {"text": "Dangling fetch: GET /contacts/${id} (src/lib/api.ts:98)"}, "properties": {"repobilityId": "43f8ea3723fbfb5c", "scanner": "scanner-primary", "fingerprint": "40edeeb288eccdff", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-a045fac453b78229", "level": "error", "message": {"text": "Dangling fetch: POST /contacts (src/lib/api.ts:100)"}, "properties": {"repobilityId": "7e1473a3bc70d265", "scanner": "scanner-primary", "fingerprint": "a045fac453b78229", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-36492a4798b43f8b", "level": "error", "message": {"text": "Dangling fetch: PUT /contacts/${id} (src/lib/api.ts:102)"}, "properties": {"repobilityId": "3d0437577768d09b", "scanner": "scanner-primary", "fingerprint": "36492a4798b43f8b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-fdb5b499c1e992e4", "level": "error", "message": {"text": "Dangling fetch: PATCH /contacts/${id}/stage (src/lib/api.ts:104)"}, "properties": {"repobilityId": "e2575c6a449a1e02", "scanner": "scanner-primary", "fingerprint": "fdb5b499c1e992e4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-741acfafc8472866", "level": "error", "message": {"text": "Dangling fetch: DELETE /contacts/${id} (src/lib/api.ts:106)"}, "properties": {"repobilityId": "d7beb8adfc230446", "scanner": "scanner-primary", "fingerprint": "741acfafc8472866", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-ccb48f663b0cb2b7", "level": "error", "message": {"text": "Dangling fetch: POST /contacts/import (src/lib/api.ts:117)"}, "properties": {"repobilityId": "f4a824da9972ebfe", "scanner": "scanner-primary", "fingerprint": "ccb48f663b0cb2b7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-3b8c847a4dde932e", "level": "error", "message": {"text": "Dangling fetch: GET /conversations/unread-count (src/lib/api.ts:122)"}, "properties": {"repobilityId": "df8121186998d324", "scanner": "scanner-primary", "fingerprint": "3b8c847a4dde932e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-34836723a5ea55b0", "level": "error", "message": {"text": "Dangling fetch: GET /conversations?${qs} (src/lib/api.ts:126)"}, "properties": {"repobilityId": "2385993fc26f15b5", "scanner": "scanner-primary", "fingerprint": "34836723a5ea55b0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-ac53624f757afaa4", "level": "error", "message": {"text": "Dangling fetch: GET /conversations/${id} (src/lib/api.ts:128)"}, "properties": {"repobilityId": "5a7c6c3ea3967f51", "scanner": "scanner-primary", "fingerprint": "ac53624f757afaa4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-7aa7c0568e7c94a1", "level": "error", "message": {"text": "Dangling fetch: POST /conversations (src/lib/api.ts:130)"}, "properties": {"repobilityId": "09eb59ec259a44bc", "scanner": "scanner-primary", "fingerprint": "7aa7c0568e7c94a1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-72efc43f392fb6d4", "level": "error", "message": {"text": "Dangling fetch: PATCH /conversations/${id}/status (src/lib/api.ts:132)"}, "properties": {"repobilityId": "c1b7e74269dcc0a3", "scanner": "scanner-primary", "fingerprint": "72efc43f392fb6d4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-c67b34f88de5f65d", "level": "error", "message": {"text": "Dangling fetch: PATCH /conversations/${id}/read (src/lib/api.ts:134)"}, "properties": {"repobilityId": "b07238b8c1170f70", "scanner": "scanner-primary", "fingerprint": "c67b34f88de5f65d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-20f5140d42d82bc6", "level": "error", "message": {"text": "Dangling fetch: PATCH /conversations/${id}/unread (src/lib/api.ts:136)"}, "properties": {"repobilityId": "ceccbb0cf2ffbe4b", "scanner": "scanner-primary", "fingerprint": "20f5140d42d82bc6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-ec8a875b7be4a8bd", "level": "error", "message": {"text": "Dangling fetch: DELETE /conversations/${id} (src/lib/api.ts:138)"}, "properties": {"repobilityId": "f62cb9b033078dad", "scanner": "scanner-primary", "fingerprint": "ec8a875b7be4a8bd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-1723ad16e937a1b0", "level": "error", "message": {"text": "Dangling fetch: PATCH /conversations/${id}/assign (src/lib/api.ts:140)"}, "properties": {"repobilityId": "7b2f24c45d302fa4", "scanner": "scanner-primary", "fingerprint": "1723ad16e937a1b0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-5fb287e409f70017", "level": "error", "message": {"text": "Dangling fetch: PATCH /conversations/${id}/intent (src/lib/api.ts:142)"}, "properties": {"repobilityId": "594ee7f1d9053c8a", "scanner": "scanner-primary", "fingerprint": "5fb287e409f70017", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-f26c6f366022be6a", "level": "error", "message": {"text": "Dangling fetch: POST /conversations/${id}/detect-intent (src/lib/api.ts:144)"}, "properties": {"repobilityId": "6e42cf636a8bc508", "scanner": "scanner-primary", "fingerprint": "f26c6f366022be6a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-45ad38a7c650646e", "level": "error", "message": {"text": "Dangling fetch: GET /conversations/follow-up?hours=${hours} (src/lib/api.ts:146)"}, "properties": {"repobilityId": "2a6e903ca676b99a", "scanner": "scanner-primary", "fingerprint": "45ad38a7c650646e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-e655ab55d1147cb8", "level": "error", "message": {"text": "Dangling fetch: POST /ai/generate-followup (src/lib/api.ts:148)"}, "properties": {"repobilityId": "107faf9e3d4d202b", "scanner": "scanner-primary", "fingerprint": "e655ab55d1147cb8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-75b7e3a718681058", "level": "error", "message": {"text": "Dangling fetch: GET /messages?conversation_id=${conversationId} (src/lib/api.ts:155)"}, "properties": {"repobilityId": "736dab19fc1c2ea5", "scanner": "scanner-primary", "fingerprint": "75b7e3a718681058", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-7cea53e91e904269", "level": "error", "message": {"text": "Dangling fetch: POST /messages (src/lib/api.ts:157)"}, "properties": {"repobilityId": "08863e2408369ac8", "scanner": "scanner-primary", "fingerprint": "7cea53e91e904269", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-0a7c95189ccefd61", "level": "error", "message": {"text": "Dangling fetch: POST /messages (src/lib/api.ts:170)"}, "properties": {"repobilityId": "f0bd4513182bdeb9", "scanner": "scanner-primary", "fingerprint": "0a7c95189ccefd61", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-db6e07429a68dba8", "level": "error", "message": {"text": "Dangling fetch: GET /pipeline?business_id=${_activeBusinessId} (src/lib/api.ts:194)"}, "properties": {"repobilityId": "d5bfbc5c554d2d1b", "scanner": "scanner-primary", "fingerprint": "db6e07429a68dba8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-debfe213d3ddab16", "level": "error", "message": {"text": "Dangling fetch: POST /pipeline (src/lib/api.ts:196)"}, "properties": {"repobilityId": "a8c20de983f4841f", "scanner": "scanner-primary", "fingerprint": "debfe213d3ddab16", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-0a862e049d9e7ca5", "level": "error", "message": {"text": "Dangling fetch: PATCH /pipeline/${id}/stage (src/lib/api.ts:198)"}, "properties": {"repobilityId": "b3311268f7d513e5", "scanner": "scanner-primary", "fingerprint": "0a862e049d9e7ca5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-f2f0b9e8dde18e0f", "level": "error", "message": {"text": "Dangling fetch: PUT /pipeline/${id} (src/lib/api.ts:200)"}, "properties": {"repobilityId": "246fb338b568ac48", "scanner": "scanner-primary", "fingerprint": "f2f0b9e8dde18e0f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-37c2f5717ffa50c0", "level": "error", "message": {"text": "Dangling fetch: DELETE /pipeline/${id} (src/lib/api.ts:202)"}, "properties": {"repobilityId": "900e5417d361bab7", "scanner": "scanner-primary", "fingerprint": "37c2f5717ffa50c0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-725825223d6e11db", "level": "error", "message": {"text": "Dangling fetch: GET /tasks?${qs} (src/lib/api.ts:208)"}, "properties": {"repobilityId": "ccfb907e384ba302", "scanner": "scanner-primary", "fingerprint": "725825223d6e11db", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-aafcaf390cbf0dea", "level": "error", "message": {"text": "Dangling fetch: POST /tasks (src/lib/api.ts:211)"}, "properties": {"repobilityId": "b6e2b684df633b4e", "scanner": "scanner-primary", "fingerprint": "aafcaf390cbf0dea", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-190bf8fdbf0e3130", "level": "error", "message": {"text": "Dangling fetch: PATCH /tasks/${id}/done (src/lib/api.ts:213)"}, "properties": {"repobilityId": "d0aa8bd867d80a25", "scanner": "scanner-primary", "fingerprint": "190bf8fdbf0e3130", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-e4b9b22567282f25", "level": "error", "message": {"text": "Dangling fetch: DELETE /tasks/${id} (src/lib/api.ts:215)"}, "properties": {"repobilityId": "8600b2f964ef89b7", "scanner": "scanner-primary", "fingerprint": "e4b9b22567282f25", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-6d8302b670dce108", "level": "error", "message": {"text": "Dangling fetch: GET /stats?business_id=${_activeBusinessId} (src/lib/api.ts:218)"}, "properties": {"repobilityId": "da3f92f2643ef58c", "scanner": "scanner-primary", "fingerprint": "6d8302b670dce108", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-bc2335cc9df14f65", "level": "error", "message": {"text": "Dangling fetch: GET /quick-replies?${qs} (src/lib/api.ts:224)"}, "properties": {"repobilityId": "3b86f77ab995cf6e", "scanner": "scanner-primary", "fingerprint": "bc2335cc9df14f65", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-c417624d9882e27c", "level": "error", "message": {"text": "Dangling fetch: POST /quick-replies/presets (src/lib/api.ts:227)"}, "properties": {"repobilityId": "a59161ce5e02aaa8", "scanner": "scanner-primary", "fingerprint": "c417624d9882e27c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-6423e3a1257d8778", "level": "error", "message": {"text": "Dangling fetch: POST /quick-replies (src/lib/api.ts:229)"}, "properties": {"repobilityId": "b4371f6bcd4e2bc2", "scanner": "scanner-primary", "fingerprint": "6423e3a1257d8778", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-aa0f81755f290c0b", "level": "error", "message": {"text": "Dangling fetch: PUT /quick-replies/${id} (src/lib/api.ts:231)"}, "properties": {"repobilityId": "cb98c1c2aa30b52c", "scanner": "scanner-primary", "fingerprint": "aa0f81755f290c0b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-53152c7ba37f420b", "level": "error", "message": {"text": "Dangling fetch: DELETE /quick-replies/${id} (src/lib/api.ts:233)"}, "properties": {"repobilityId": "9de1b534328818c6", "scanner": "scanner-primary", "fingerprint": "53152c7ba37f420b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-97733913083b0e49", "level": "error", "message": {"text": "Dangling fetch: POST /ai/suggest (src/lib/api.ts:237)"}, "properties": {"repobilityId": "066464a10ba728e8", "scanner": "scanner-primary", "fingerprint": "97733913083b0e49", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-96ea566f476ce18d", "level": "error", "message": {"text": "Dangling fetch: GET /ai/status (src/lib/api.ts:238)"}, "properties": {"repobilityId": "4077c02b9c1b768d", "scanner": "scanner-primary", "fingerprint": "96ea566f476ce18d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-724191127d8f1b71", "level": "error", "message": {"text": "Dangling fetch: GET /ai/logs?business_id=${_activeBusinessId} (src/lib/api.ts:239)"}, "properties": {"repobilityId": "d575a41f11c94dd3", "scanner": "scanner-primary", "fingerprint": "724191127d8f1b71", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-64d7773105a3a49d", "level": "error", "message": {"text": "Dangling fetch: POST /ai/extract-task (src/lib/api.ts:241)"}, "properties": {"repobilityId": "e81a8e7705838dca", "scanner": "scanner-primary", "fingerprint": "64d7773105a3a49d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-338f3e7a585876b0", "level": "error", "message": {"text": "Dangling fetch: POST /ai/analyze-chats (src/lib/api.ts:246)"}, "properties": {"repobilityId": "6d878fb0ea5ecafe", "scanner": "scanner-primary", "fingerprint": "338f3e7a585876b0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-5cb34ab4ae4ca2e7", "level": "error", "message": {"text": "Dangling fetch: POST /business/channels (src/lib/api.ts:257)"}, "properties": {"repobilityId": "21e70b030dfca030", "scanner": "scanner-primary", "fingerprint": "5cb34ab4ae4ca2e7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-50898fb60ef35c03", "level": "error", "message": {"text": "Dangling fetch: DELETE /business/channels/${id} (src/lib/api.ts:262)"}, "properties": {"repobilityId": "cf15a41c23ced08a", "scanner": "scanner-primary", "fingerprint": "50898fb60ef35c03", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-028fb75e9424b637", "level": "error", "message": {"text": "Dangling fetch: POST /business/channels/whatsapp/connect (src/lib/api.ts:264)"}, "properties": {"repobilityId": "b766b7647c872f11", "scanner": "scanner-primary", "fingerprint": "028fb75e9424b637", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-f3b225c14089da50", "level": "error", "message": {"text": "Dangling fetch: POST /ai/copilot (src/lib/api.ts:271)"}, "properties": {"repobilityId": "07ed9df5546e1f89", "scanner": "scanner-primary", "fingerprint": "f3b225c14089da50", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-8bb8dc4bbf94481f", "level": "error", "message": {"text": "Dangling fetch: POST /ai/setup-assistant/chat (src/lib/api.ts:372)"}, "properties": {"repobilityId": "00b861515209622d", "scanner": "scanner-primary", "fingerprint": "8bb8dc4bbf94481f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-9a7a818ad4438ae6", "level": "error", "message": {"text": "Dangling fetch: POST /ai/setup-assistant/finalize (src/lib/api.ts:377)"}, "properties": {"repobilityId": "ebefc9d952092309", "scanner": "scanner-primary", "fingerprint": "9a7a818ad4438ae6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-d3f0fe43a6dfa8db", "level": "error", "message": {"text": "Dangling fetch: GET /notes?contact_id=${contactId} (src/lib/api.ts:384)"}, "properties": {"repobilityId": "01a9978af2b22186", "scanner": "scanner-primary", "fingerprint": "d3f0fe43a6dfa8db", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-ec03746106090eb8", "level": "error", "message": {"text": "Dangling fetch: POST /notes (src/lib/api.ts:386)"}, "properties": {"repobilityId": "98b4369c84da1cc6", "scanner": "scanner-primary", "fingerprint": "ec03746106090eb8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-21a48e16bed2ecb5", "level": "error", "message": {"text": "Dangling fetch: DELETE /notes/${id} (src/lib/api.ts:388)"}, "properties": {"repobilityId": "d9c04a2d8ac58314", "scanner": "scanner-primary", "fingerprint": "21a48e16bed2ecb5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-47a9f7cc160fc485", "level": "error", "message": {"text": "Dangling fetch: GET /search?q=${encodeURIComponent(q)} (src/lib/api.ts:392)"}, "properties": {"repobilityId": "19f682381b78f6fe", "scanner": "scanner-primary", "fingerprint": "47a9f7cc160fc485", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-a070796220b481b6", "level": "error", "message": {"text": "Dangling fetch: GET /reports?${qs} (src/lib/api.ts:399)"}, "properties": {"repobilityId": "52127978c80d4fbc", "scanner": "scanner-primary", "fingerprint": "a070796220b481b6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-a7eb1386f3cb9426", "level": "error", "message": {"text": "Dangling fetch: GET /activity${qs} (src/lib/api.ts:405)"}, "properties": {"repobilityId": "f414392900f502ba", "scanner": "scanner-primary", "fingerprint": "a7eb1386f3cb9426", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-7cf3fdf350173937", "level": "error", "message": {"text": "Dangling fetch: GET /pipeline?contact_id=${contactId} (src/lib/api.ts:410)"}, "properties": {"repobilityId": "963e199b8165d06c", "scanner": "scanner-primary", "fingerprint": "7cf3fdf350173937", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-516da19a28e9ac18", "level": "error", "message": {"text": "Dangling fetch: GET /conversations?contact_id=${contactId} (src/lib/api.ts:412)"}, "properties": {"repobilityId": "eea5b7910f9a193f", "scanner": "scanner-primary", "fingerprint": "516da19a28e9ac18", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-e92e20469640cc21", "level": "error", "message": {"text": "Dangling fetch: GET /tasks?contact_id=${contactId} (src/lib/api.ts:414)"}, "properties": {"repobilityId": "38c0a8abaa797279", "scanner": "scanner-primary", "fingerprint": "e92e20469640cc21", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-bcd5778d3f94dfc2", "level": "error", "message": {"text": "Dangling fetch: GET /appointments?${qs} (src/lib/api.ts:421)"}, "properties": {"repobilityId": "5ad77f57528dad3b", "scanner": "scanner-primary", "fingerprint": "bcd5778d3f94dfc2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-c8ba42ca27b675f6", "level": "error", "message": {"text": "Dangling fetch: GET /appointments/slots?date=${date}&duration=${duration} (src/lib/api.ts:424)"}, "properties": {"repobilityId": "433c6affc47fb303", "scanner": "scanner-primary", "fingerprint": "c8ba42ca27b675f6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-8fcd5192972bf2a9", "level": "error", "message": {"text": "Dangling fetch: POST /appointments (src/lib/api.ts:426)"}, "properties": {"repobilityId": "ed4d82cfb133a5ef", "scanner": "scanner-primary", "fingerprint": "8fcd5192972bf2a9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-706bebdc0bc6d477", "level": "error", "message": {"text": "Dangling fetch: PUT /appointments/${id} (src/lib/api.ts:428)"}, "properties": {"repobilityId": "0468ffe5e7087922", "scanner": "scanner-primary", "fingerprint": "706bebdc0bc6d477", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-1b43f15a54d76735", "level": "error", "message": {"text": "Dangling fetch: PATCH /appointments/${id}/status (src/lib/api.ts:430)"}, "properties": {"repobilityId": "dcb95b58a79ba1e0", "scanner": "scanner-primary", "fingerprint": "1b43f15a54d76735", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-14a1f56e5504e70a", "level": "error", "message": {"text": "Dangling fetch: DELETE /appointments/${id} (src/lib/api.ts:432)"}, "properties": {"repobilityId": "dc6e7bdaa21bd6a1", "scanner": "scanner-primary", "fingerprint": "14a1f56e5504e70a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-5e21b3b89c48ba7f", "level": "error", "message": {"text": "Dangling fetch: POST /appointments/${id}/remind (src/lib/api.ts:434)"}, "properties": {"repobilityId": "58f52cf97ba736d5", "scanner": "scanner-primary", "fingerprint": "5e21b3b89c48ba7f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-4a00d06c1b43318c", "level": "error", "message": {"text": "Dangling fetch: GET /services (src/lib/api.ts:439)"}, "properties": {"repobilityId": "6a071721020bfe07", "scanner": "scanner-primary", "fingerprint": "4a00d06c1b43318c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-d0f187e79478f10c", "level": "error", "message": {"text": "Dangling fetch: POST /services (src/lib/api.ts:441)"}, "properties": {"repobilityId": "937d0760e5172141", "scanner": "scanner-primary", "fingerprint": "d0f187e79478f10c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-8f6de3ef50066f85", "level": "error", "message": {"text": "Dangling fetch: PUT /services/${id} (src/lib/api.ts:443)"}, "properties": {"repobilityId": "848546e554a0fb32", "scanner": "scanner-primary", "fingerprint": "8f6de3ef50066f85", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-5f91b2bea4a5dea3", "level": "error", "message": {"text": "Dangling fetch: DELETE /services/${id} (src/lib/api.ts:445)"}, "properties": {"repobilityId": "873e4b2354337a45", "scanner": "scanner-primary", "fingerprint": "5f91b2bea4a5dea3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-34d4efb0f3d6c7be", "level": "error", "message": {"text": "Dangling fetch: GET /memories (src/lib/api.ts:449)"}, "properties": {"repobilityId": "10a79d43cbd1aa00", "scanner": "scanner-primary", "fingerprint": "34d4efb0f3d6c7be", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-9def7ed9582af2df", "level": "error", "message": {"text": "Dangling fetch: POST /memories (src/lib/api.ts:451)"}, "properties": {"repobilityId": "fbe0937d6a347ca9", "scanner": "scanner-primary", "fingerprint": "9def7ed9582af2df", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-06ea491367b4882f", "level": "error", "message": {"text": "Dangling fetch: PATCH /memories/${id} (src/lib/api.ts:453)"}, "properties": {"repobilityId": "4e326c0764cf7111", "scanner": "scanner-primary", "fingerprint": "06ea491367b4882f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-d07fc3f99bdaaf6f", "level": "error", "message": {"text": "Dangling fetch: DELETE /memories/${id} (src/lib/api.ts:455)"}, "properties": {"repobilityId": "1d0fe3cc860d4444", "scanner": "scanner-primary", "fingerprint": "d07fc3f99bdaaf6f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-fe78859da9e1470a", "level": "error", "message": {"text": "Dangling fetch: GET /broadcasts (src/lib/api.ts:458)"}, "properties": {"repobilityId": "d38b7f44d22b2c2f", "scanner": "scanner-primary", "fingerprint": "fe78859da9e1470a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-d3509a9a5676afbe", "level": "error", "message": {"text": "Dangling fetch: GET /broadcasts/${id} (src/lib/api.ts:459)"}, "properties": {"repobilityId": "0ecd6f9868f7e487", "scanner": "scanner-primary", "fingerprint": "d3509a9a5676afbe", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-41ad28adc3e597aa", "level": "error", "message": {"text": "Dangling fetch: GET /broadcasts/preview/count?${qs} (src/lib/api.ts:463)"}, "properties": {"repobilityId": "728d55fa9f04639b", "scanner": "scanner-primary", "fingerprint": "41ad28adc3e597aa", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-ff14051528f82962", "level": "error", "message": {"text": "Dangling fetch: POST /broadcasts (src/lib/api.ts:466)"}, "properties": {"repobilityId": "1899d658bb6fe2e0", "scanner": "scanner-primary", "fingerprint": "ff14051528f82962", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-ed66e8875ece737b", "level": "error", "message": {"text": "Dangling fetch: POST /broadcasts/${id}/send (src/lib/api.ts:468)"}, "properties": {"repobilityId": "511e399c87f34d07", "scanner": "scanner-primary", "fingerprint": "ed66e8875ece737b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-edbfc7ca98b4d818", "level": "error", "message": {"text": "Dangling fetch: DELETE /broadcasts/${id} (src/lib/api.ts:470)"}, "properties": {"repobilityId": "e3847433b601665c", "scanner": "scanner-primary", "fingerprint": "edbfc7ca98b4d818", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-de295af58272766e", "level": "error", "message": {"text": "Dangling fetch: GET /team (src/lib/api.ts:474)"}, "properties": {"repobilityId": "bf67eedc4c9a49e5", "scanner": "scanner-primary", "fingerprint": "de295af58272766e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-d19541ca07dfd4b4", "level": "error", "message": {"text": "Dangling fetch: GET /team/invitations (src/lib/api.ts:476)"}, "properties": {"repobilityId": "a0ada330e94cdb6f", "scanner": "scanner-primary", "fingerprint": "d19541ca07dfd4b4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-ce63e5b5610cb38d", "level": "error", "message": {"text": "Dangling fetch: GET /team/join/${token} (src/lib/api.ts:478)"}, "properties": {"repobilityId": "f27c819a76fdb365", "scanner": "scanner-primary", "fingerprint": "ce63e5b5610cb38d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-5c1edde6650cf529", "level": "error", "message": {"text": "Dangling fetch: POST /team/invite (src/lib/api.ts:480)"}, "properties": {"repobilityId": "972ce4ca591acd67", "scanner": "scanner-primary", "fingerprint": "5c1edde6650cf529", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-04f7f47bc277f854", "level": "error", "message": {"text": "Dangling fetch: POST /team/join (src/lib/api.ts:485)"}, "properties": {"repobilityId": "949107c00be4fff5", "scanner": "scanner-primary", "fingerprint": "04f7f47bc277f854", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-dd0be9377ae5f7f8", "level": "error", "message": {"text": "Dangling fetch: DELETE /team/invitations/${id} (src/lib/api.ts:490)"}, "properties": {"repobilityId": "b234cdc363500815", "scanner": "scanner-primary", "fingerprint": "dd0be9377ae5f7f8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-ae331781d77992b9", "level": "error", "message": {"text": "Dangling fetch: PATCH /team/${memberId}/role (src/lib/api.ts:492)"}, "properties": {"repobilityId": "9c196fb3ea6ce122", "scanner": "scanner-primary", "fingerprint": "ae331781d77992b9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-46dbd5519dd84deb", "level": "error", "message": {"text": "Dangling fetch: DELETE /team/${memberId} (src/lib/api.ts:497)"}, "properties": {"repobilityId": "dff71825622964e5", "scanner": "scanner-primary", "fingerprint": "46dbd5519dd84deb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-4756b4c4da7d2088", "level": "note", "message": {"text": "Unused endpoint: GET /api/health"}, "properties": {"repobilityId": "779ee59986e3e7ae", "scanner": "scanner-primary", "fingerprint": "4756b4c4da7d2088", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-203ec659ed8ada77", "level": "note", "message": {"text": "Unused endpoint: USE /api/webhooks"}, "properties": {"repobilityId": "9abd46e567b3e404", "scanner": "scanner-primary", "fingerprint": "203ec659ed8ada77", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-83203709e066fa32", "level": "note", "message": {"text": "Unused endpoint: USE /api/public/book"}, "properties": {"repobilityId": "60f882ecd4ea2820", "scanner": "scanner-primary", "fingerprint": "83203709e066fa32", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c1b288117a6e8a7a", "level": "note", "message": {"text": "Unused endpoint: USE /api/business"}, "properties": {"repobilityId": "7789e6ae79b37d61", "scanner": "scanner-primary", "fingerprint": "c1b288117a6e8a7a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-70583fbeefb962c2", "level": "note", "message": {"text": "Unused endpoint: USE /api/contacts"}, "properties": {"repobilityId": "cf553b69879a18d2", "scanner": "scanner-primary", "fingerprint": "70583fbeefb962c2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c73e8bea8e1d1368", "level": "note", "message": {"text": "Unused endpoint: USE /api/conversations"}, "properties": {"repobilityId": "17b9e7c888d72d44", "scanner": "scanner-primary", "fingerprint": "c73e8bea8e1d1368", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9a300508c4edb651", "level": "note", "message": {"text": "Unused endpoint: USE /api/messages"}, "properties": {"repobilityId": "bfcd515b571a22cd", "scanner": "scanner-primary", "fingerprint": "9a300508c4edb651", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0ab055a45f0b96b6", "level": "note", "message": {"text": "Unused endpoint: USE /api/pipeline"}, "properties": {"repobilityId": "4a45367655500814", "scanner": "scanner-primary", "fingerprint": "0ab055a45f0b96b6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6330b0c4a0a152d3", "level": "note", "message": {"text": "Unused endpoint: USE /api/tasks"}, "properties": {"repobilityId": "aba3b6f202f07b36", "scanner": "scanner-primary", "fingerprint": "6330b0c4a0a152d3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-06c88a2e2dc65557", "level": "note", "message": {"text": "Unused endpoint: USE /api/stats"}, "properties": {"repobilityId": "367d621d88ab120e", "scanner": "scanner-primary", "fingerprint": "06c88a2e2dc65557", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-316c43db307befc3", "level": "note", "message": {"text": "Unused endpoint: USE /api/ai"}, "properties": {"repobilityId": "ac333bfd063cd1b6", "scanner": "scanner-primary", "fingerprint": "316c43db307befc3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e804f3fe26cb30d9", "level": "note", "message": {"text": "Unused endpoint: USE /api/quick-replies"}, "properties": {"repobilityId": "8876f9dd02fd1684", "scanner": "scanner-primary", "fingerprint": "e804f3fe26cb30d9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4dc6237d07348713", "level": "note", "message": {"text": "Unused endpoint: USE /api/memories"}, "properties": {"repobilityId": "9a8bac758f2bb8b6", "scanner": "scanner-primary", "fingerprint": "4dc6237d07348713", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-058eab53385fceec", "level": "note", "message": {"text": "Unused endpoint: USE /api/ai/insights"}, "properties": {"repobilityId": "696535866f41621e", "scanner": "scanner-primary", "fingerprint": "058eab53385fceec", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-188d2a5d9a7fddd9", "level": "note", "message": {"text": "Unused endpoint: USE /api/ai/setup-assistant"}, "properties": {"repobilityId": "484ec15c6373b9ed", "scanner": "scanner-primary", "fingerprint": "188d2a5d9a7fddd9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e932839200aed5ac", "level": "note", "message": {"text": "Unused endpoint: USE /api/ai/copilot"}, "properties": {"repobilityId": "7bfba2d9ee90518e", "scanner": "scanner-primary", "fingerprint": "e932839200aed5ac", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1b6c609850c719b2", "level": "note", "message": {"text": "Unused endpoint: USE /api/notes"}, "properties": {"repobilityId": "cfaf471015c34449", "scanner": "scanner-primary", "fingerprint": "1b6c609850c719b2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a74449cc5d561bad", "level": "note", "message": {"text": "Unused endpoint: USE /api/search"}, "properties": {"repobilityId": "936ec8c832914943", "scanner": "scanner-primary", "fingerprint": "a74449cc5d561bad", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2a06e6d401449b82", "level": "note", "message": {"text": "Unused endpoint: USE /api/reports"}, "properties": {"repobilityId": "03eca5013398a805", "scanner": "scanner-primary", "fingerprint": "2a06e6d401449b82", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-70d1dce5c086c6b4", "level": "note", "message": {"text": "Unused endpoint: USE /api/activity"}, "properties": {"repobilityId": "3f9285d791fca9cf", "scanner": "scanner-primary", "fingerprint": "70d1dce5c086c6b4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2f94b4c7d983f1df", "level": "note", "message": {"text": "Unused endpoint: USE /api/appointments"}, "properties": {"repobilityId": "1557980fe6563c6d", "scanner": "scanner-primary", "fingerprint": "2f94b4c7d983f1df", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-10484ff622717d30", "level": "note", "message": {"text": "Unused endpoint: USE /api/services"}, "properties": {"repobilityId": "3f38a7b28ba8effe", "scanner": "scanner-primary", "fingerprint": "10484ff622717d30", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-da48c098aa00614d", "level": "note", "message": {"text": "Unused endpoint: USE /api/broadcasts"}, "properties": {"repobilityId": "867dca48270f653f", "scanner": "scanner-primary", "fingerprint": "da48c098aa00614d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c7472eefab50d274", "level": "note", "message": {"text": "Unused endpoint: USE /api/team"}, "properties": {"repobilityId": "8929785cc46dc389", "scanner": "scanner-primary", "fingerprint": "c7472eefab50d274", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-946dc627de4f272d", "level": "note", "message": {"text": "Unused endpoint: USE /api/billing"}, "properties": {"repobilityId": "7c6c0306c314e72c", "scanner": "scanner-primary", "fingerprint": "946dc627de4f272d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ab91e694dc0e7551", "level": "note", "message": {"text": "Unused endpoint: USE /api/media"}, "properties": {"repobilityId": "3de2bef1984eec39", "scanner": "scanner-primary", "fingerprint": "ab91e694dc0e7551", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-27cc2bb73ad635b3", "level": "note", "message": {"text": "Unused endpoint: POST /suggest"}, "properties": {"repobilityId": "0a549e422c52956a", "scanner": "scanner-primary", "fingerprint": "27cc2bb73ad635b3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-72f99d58636b648b", "level": "note", "message": {"text": "Unused endpoint: GET /logs"}, "properties": {"repobilityId": "cd1138e65a5eaa83", "scanner": "scanner-primary", "fingerprint": "72f99d58636b648b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a44480977487ac0a", "level": "note", "message": {"text": "Unused endpoint: POST /extract-task"}, "properties": {"repobilityId": "71d4d4727a0b09aa", "scanner": "scanner-primary", "fingerprint": "a44480977487ac0a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-01f033b16ef714bc", "level": "note", "message": {"text": "Unused endpoint: POST /analyze-chats"}, "properties": {"repobilityId": "7546c795f826e487", "scanner": "scanner-primary", "fingerprint": "01f033b16ef714bc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3c441e631a953f58", "level": "note", "message": {"text": "Unused endpoint: POST /generate-followup"}, "properties": {"repobilityId": "920ef81c293cc45a", "scanner": "scanner-primary", "fingerprint": "3c441e631a953f58", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c42bba47518b038a", "level": "note", "message": {"text": "Unused endpoint: GET /meta/whatsapp"}, "properties": {"repobilityId": "16eb178cb032083f", "scanner": "scanner-primary", "fingerprint": "c42bba47518b038a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-656758dd8b27b402", "level": "note", "message": {"text": "Unused endpoint: POST /meta/whatsapp"}, "properties": {"repobilityId": "6b6e437983deeea6", "scanner": "scanner-primary", "fingerprint": "656758dd8b27b402", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6236b283b79811b8", "level": "note", "message": {"text": "Unused endpoint: POST /upload"}, "properties": {"repobilityId": "5fd70ae135760f8d", "scanner": "scanner-primary", "fingerprint": "6236b283b79811b8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "ad9c39cbaa0c91fa", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a009b1a56794f45", "level": "note", "message": {"text": "Unused endpoint: POST /"}, "properties": {"repobilityId": "a49d40c8d8d2e51a", "scanner": "scanner-primary", "fingerprint": "7a009b1a56794f45", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-86f4172afb1b0ad5", "level": "note", "message": {"text": "Unused endpoint: POST /create-checkout-session"}, "properties": {"repobilityId": "99309ac3aeea3838", "scanner": "scanner-primary", "fingerprint": "86f4172afb1b0ad5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1ec7e423e24778e4", "level": "note", "message": {"text": "Unused endpoint: POST /portal"}, "properties": {"repobilityId": "a62107254d5200f0", "scanner": "scanner-primary", "fingerprint": "1ec7e423e24778e4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0ae38010c60493f1", "level": "note", "message": {"text": "Unused endpoint: POST /webhook"}, "properties": {"repobilityId": "6795dc109b41cbc9", "scanner": "scanner-primary", "fingerprint": "0ae38010c60493f1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bd645cc6653a585b", "level": "note", "message": {"text": "Unused endpoint: PATCH /:id/done"}, "properties": {"repobilityId": "a0c7ff1cc926db48", "scanner": "scanner-primary", "fingerprint": "bd645cc6653a585b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a61c112b611f4bb", "level": "note", "message": {"text": "Unused endpoint: DELETE /:id"}, "properties": {"repobilityId": "7146c4973bd0336c", "scanner": "scanner-primary", "fingerprint": "7a61c112b611f4bb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a6f226130b2c66e7", "level": "note", "message": {"text": "Unused endpoint: GET /invitations"}, "properties": {"repobilityId": "afc34e05b010e7ec", "scanner": "scanner-primary", "fingerprint": "a6f226130b2c66e7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ec0e5cdfd38ef5d1", "level": "note", "message": {"text": "Unused endpoint: GET /join/:token"}, "properties": {"repobilityId": "f6c3bf24e8032700", "scanner": "scanner-primary", "fingerprint": "ec0e5cdfd38ef5d1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-46eb93a4accdc83b", "level": "note", "message": {"text": "Unused endpoint: POST /invite"}, "properties": {"repobilityId": "bc216f7a96337b3a", "scanner": "scanner-primary", "fingerprint": "46eb93a4accdc83b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-633d0a653ebbf1bf", "level": "note", "message": {"text": "Unused endpoint: POST /join"}, "properties": {"repobilityId": "55c7af623b097de8", "scanner": "scanner-primary", "fingerprint": "633d0a653ebbf1bf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1fe337c480ef3344", "level": "note", "message": {"text": "Unused endpoint: DELETE /invitations/:id"}, "properties": {"repobilityId": "e2d132f90b1c3d3b", "scanner": "scanner-primary", "fingerprint": "1fe337c480ef3344", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8840c97805835143", "level": "note", "message": {"text": "Unused endpoint: PATCH /:memberId/role"}, "properties": {"repobilityId": "20555ac594d7db8e", "scanner": "scanner-primary", "fingerprint": "8840c97805835143", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1de30ab94408364d", "level": "note", "message": {"text": "Unused endpoint: DELETE /:memberId"}, "properties": {"repobilityId": "5014452bb3d00f00", "scanner": "scanner-primary", "fingerprint": "1de30ab94408364d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5f4ee569e1562771", "level": "note", "message": {"text": "Unused endpoint: POST /stream"}, "properties": {"repobilityId": "3aa1b77179fa58cc", "scanner": "scanner-primary", "fingerprint": "5f4ee569e1562771", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dd71dfa1d0356c5b", "level": "note", "message": {"text": "Unused endpoint: GET /:slug"}, "properties": {"repobilityId": "1df8742b98750c49", "scanner": "scanner-primary", "fingerprint": "dd71dfa1d0356c5b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}