{"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-885e1096f6c4d726", "name": "Stray `console.log` in TS/JS \u2014 tests/libsignal-log-throttle.test.js:68", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/libsignal-log-throttle.test.js:68"}, "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-ad88a6d15dea91b8", "name": "Stray `console.log` in TS/JS \u2014 scripts/migrate-json-to-postgres.js:214", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate-json-to-postgres.js:214"}, "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-e3632bcbe4d6f64e", "name": "Stray `console.log` in TS/JS \u2014 scripts/encrypt-existing-api-keys.js:35", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/encrypt-existing-api-keys.js:35"}, "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-99baf43e2265b7a7", "name": "Stray `console.log` in TS/JS \u2014 scripts/generate-secrets-key.js:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generate-secrets-key.js:8"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cd987ac09df8ea91", "name": "Stray `console.log` in TS/JS \u2014 scripts/eval/data-style-eval.js:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/eval/data-style-eval.js:16"}, "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-3db84534c88ebd28", "name": "Stray `console.log` in TS/JS \u2014 scripts/eval/bot-brain-eval.js:63", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/eval/bot-brain-eval.js: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-997f6f3e65221a27", "name": "Stray `console.log` in TS/JS \u2014 lib/logger.js:40", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/logger.js:40"}, "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-b5761859d3115267", "name": "Stray `console.log` in TS/JS \u2014 lib/store-scanner.js:64", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/store-scanner.js:64"}, "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-021f442a220c70f8", "name": "Stray `console.log` in TS/JS \u2014 legacy/index.js:62", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 legacy/index.js:62"}, "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-245591ed5c426a92", "name": "Stray `console.log` in TS/JS \u2014 legacy/lib/error-handler.js:51", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 legacy/lib/error-handler.js:51"}, "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-3a45a6215eaab7af", "name": "Stray `console.log` in TS/JS \u2014 src/server.js:806", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/server.js:806"}, "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-66a412f24eb7bc12", "name": "Stray `console.log` in TS/JS \u2014 src/workers/outgoing-whatsapp-worker.js:643", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/workers/outgoing-whatsapp-worker.js:643"}, "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-aeea33a095458afd", "name": "Stray `console.log` in TS/JS \u2014 src/workers/ai-worker.js:56", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/workers/ai-worker.js:56"}, "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-0b9753827d47fa23", "name": "Stray `console.log` in TS/JS \u2014 src/runtime/start-all.js:25", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/runtime/start-all.js:25"}, "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-7946cbbb64e3b5ef", "name": "Stray `console.log` in TS/JS \u2014 src/services/admin/admin-api-keys.js:91", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/services/admin/admin-api-keys.js:91"}, "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-f02dc134c73b8b4e", "name": "Stray `console.log` in TS/JS \u2014 src/services/whatsapp/connection-manager.js:57", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/services/whatsapp/connection-manager.js:57"}, "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-7345e351d2a6d373", "name": "Stray `console.log` in TS/JS \u2014 src/services/whatsapp/baileys-connection-manager.js:213", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/services/whatsapp/baileys-connection-manager.js:213"}, "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-c083fee10f5636f1", "name": "Stray `console.log` in TS/JS \u2014 src/db/migrations/init.js:535", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/db/migrations/init.js:535"}, "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-d63da3583b14afc0", "name": "Dockerfile runs as root: Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a35c6a00f751880f", "name": "Docker base image is tag-pinned but not digest-pinned: node:20-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-slim"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2321284860f7f1ed", "name": "Insecure pattern 'direct_innerhtml_assignment' in dashboard/login.html:654", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in dashboard/login.html:654"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4aad946dd71dd7d9", "name": "Insecure pattern 'direct_innerhtml_assignment' in dashboard/index.html:1983", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in dashboard/index.html:1983"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fe458c44fef7898f", "name": "Insecure pattern 'direct_innerhtml_assignment' in dashboard/admin.html:234", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in dashboard/admin.html:234"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-acf5ff3c964739b4", "name": "Insecure pattern 'node_child_process' in lib/helpers.js:12", "shortDescription": {"text": "Insecure pattern 'node_child_process' in lib/helpers.js:12"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6f716aa9c5fa08e3", "name": "Insecure pattern 'node_child_process' in src/runtime/start-all.js:3", "shortDescription": {"text": "Insecure pattern 'node_child_process' in src/runtime/start-all.js:3"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6372cebde0220094", "name": "No auth library detected", "shortDescription": {"text": "No auth library detected"}, "fullDescription": {"text": "The scanner did not find any standard auth library (JWT, OAuth, NextAuth, Auth0, etc.). The repo has auth/admin/session surface indicators, so auth may live in custom code, in a separate service, or be missing."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "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-1ae3ecf17a2ee84a", "name": "Very large file: legacy/index.js (1245 lines)", "shortDescription": {"text": "Very large file: legacy/index.js (1245 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-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 57 console/debugger/print-style debug statements in non-test source. This is a common fast-generation residue before production cleanup."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9d79c4077342a7d0", "name": "Runtime service client appears to use placeholder configuration", "shortDescription": {"text": "Runtime service client appears to use placeholder configuration"}, "fullDescription": {"text": "A runtime source file appears to wire Supabase/Firebase/AI/payment-style clients to placeholder URLs, keys, or fallback values. In the Fable corpus this often means the UI/API shape is present while the backend service is not actually configured."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-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-a82351121bb93621", "name": "Commented-code block (5 lines) in tests/escalation-bridge.test.js:60", "shortDescription": {"text": "Commented-code block (5 lines) in tests/escalation-bridge.test.js:60"}, "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-01d3f7f746020805", "name": "Commented-code block (6 lines) in tests/outgoing-records-whatsapp-id.test.js:3", "shortDescription": {"text": "Commented-code block (6 lines) in tests/outgoing-records-whatsapp-id.test.js:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-91a67b747bf76c8e", "name": "Commented-code block (5 lines) in tests/runtime-bot-lease-force.test.js:3", "shortDescription": {"text": "Commented-code block (5 lines) in tests/runtime-bot-lease-force.test.js:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-009f3f3232a1292f", "name": "Commented-code block (5 lines) in tests/never-silent-escalation.test.js:8", "shortDescription": {"text": "Commented-code block (5 lines) in tests/never-silent-escalation.test.js:8"}, "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-634931aaeb5bd373", "name": "Commented-code block (5 lines) in tests/meta-prompts-integration.test.js:3", "shortDescription": {"text": "Commented-code block (5 lines) in tests/meta-prompts-integration.test.js:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-75877fd425fb3838", "name": "Commented-code block (5 lines) in tests/bot-resolver-single-flight.test.js:3", "shortDescription": {"text": "Commented-code block (5 lines) in tests/bot-resolver-single-flight.test.js:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f2698233b1437db0", "name": "Commented-code block (5 lines) in tests/baileys-auth-flush.test.js:3", "shortDescription": {"text": "Commented-code block (5 lines) in tests/baileys-auth-flush.test.js:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7fbf73e8615eb51a", "name": "Commented-code block (5 lines) in tests/baileys-keystore-debounce.test.js:3", "shortDescription": {"text": "Commented-code block (5 lines) in tests/baileys-keystore-debounce.test.js:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9e49dbd3f1711ff2", "name": "Commented-code block (5 lines) in tests/outgoing-conn-conflict-guard.test.js:3", "shortDescription": {"text": "Commented-code block (5 lines) in tests/outgoing-conn-conflict-guard.test.js:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2c2d4fedb444a3a9", "name": "Commented-code block (6 lines) in tests/runtime-bot-conn-conflict-backoff.test.js:5", "shortDescription": {"text": "Commented-code block (6 lines) in tests/runtime-bot-conn-conflict-backoff.test.js:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2e93126c2ee7e20d", "name": "Commented-code block (6 lines) in tests/connection-fixes.test.js:3", "shortDescription": {"text": "Commented-code block (6 lines) in tests/connection-fixes.test.js:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c77cdbc4f935b64c", "name": "Commented-code block (6 lines) in tests/ai-failure-fallback.test.js:7", "shortDescription": {"text": "Commented-code block (6 lines) in tests/ai-failure-fallback.test.js:7"}, "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-7f5c51961fa68af2", "name": "Commented-code block (6 lines) in tests/baileys-messages-generation-guard.test.js:3", "shortDescription": {"text": "Commented-code block (6 lines) in tests/baileys-messages-generation-guard.test.js:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-be585c1fa94d395e", "name": "Commented-code block (5 lines) in tests/ai-worker-store-assistant.test.js:26", "shortDescription": {"text": "Commented-code block (5 lines) in tests/ai-worker-store-assistant.test.js:26"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d86d4808b88694da", "name": "Commented-code block (5 lines) in tests/config-controller-save-strips-keys.test.js:8", "shortDescription": {"text": "Commented-code block (5 lines) in tests/config-controller-save-strips-keys.test.js:8"}, "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-556f2d5a8b96059a", "name": "Commented-code block (5 lines) in tests/copy-merchant-config.test.js:10", "shortDescription": {"text": "Commented-code block (5 lines) in tests/copy-merchant-config.test.js:10"}, "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-00b4c8b02314e927", "name": "Commented-code block (5 lines) in tests/no-duplicate-sends-and-media-pause.test.js:11", "shortDescription": {"text": "Commented-code block (5 lines) in tests/no-duplicate-sends-and-media-pause.test.js:11"}, "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-b895c7ae74a7f2cf", "name": "Commented-code block (5 lines) in tests/runtime-bot-lease-loss.test.js:5", "shortDescription": {"text": "Commented-code block (5 lines) in tests/runtime-bot-lease-loss.test.js:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-48f1274e1ab1fd5f", "name": "Commented-code block (5 lines) in tests/ai-worker-stale-skip.test.js:8", "shortDescription": {"text": "Commented-code block (5 lines) in tests/ai-worker-stale-skip.test.js:8"}, "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-d188ef5e12d4078a", "name": "Commented-code block (8 lines) in lib/message-staleness.js:9", "shortDescription": {"text": "Commented-code block (8 lines) in lib/message-staleness.js:9"}, "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-f830f2108d906d76", "name": "Commented-code block (7 lines) in lib/helpers.js:76", "shortDescription": {"text": "Commented-code block (7 lines) in lib/helpers.js:76"}, "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-b8a92c99802990a8", "name": "Commented-code block (6 lines) in lib/post-process-reply.js:36", "shortDescription": {"text": "Commented-code block (6 lines) in lib/post-process-reply.js:36"}, "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-a11b0e00360d0bc0", "name": "Commented-code block (7 lines) in lib/ai-client.js:25", "shortDescription": {"text": "Commented-code block (7 lines) in lib/ai-client.js:25"}, "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-6f4ba3732d073554", "name": "Commented-code block (6 lines) in src/server.js:122", "shortDescription": {"text": "Commented-code block (6 lines) in src/server.js:122"}, "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-1fff1cb3c5422019", "name": "Commented-code block (5 lines) in src/routes/billing.routes.js:44", "shortDescription": {"text": "Commented-code block (5 lines) in src/routes/billing.routes.js:44"}, "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-676c5b0f4a7a459e", "name": "Commented-code block (5 lines) in src/routes/admin.routes.js:174", "shortDescription": {"text": "Commented-code block (5 lines) in src/routes/admin.routes.js:174"}, "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-6a504e559e5cfc61", "name": "Commented-code block (5 lines) in src/workers/escalation-routing.js:5", "shortDescription": {"text": "Commented-code block (5 lines) in src/workers/escalation-routing.js:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-592b92b33c79107b", "name": "Commented-code block (7 lines) in src/workers/outgoing-whatsapp-worker.js:46", "shortDescription": {"text": "Commented-code block (7 lines) in src/workers/outgoing-whatsapp-worker.js:46"}, "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-18133101895d32a9", "name": "Commented-code block (5 lines) in src/workers/ai-worker.js:208", "shortDescription": {"text": "Commented-code block (5 lines) in src/workers/ai-worker.js:208"}, "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-c1ee1644bbcf149e", "name": "Commented-code block (5 lines) in src/controllers/bot.controller.js:63", "shortDescription": {"text": "Commented-code block (5 lines) in src/controllers/bot.controller.js:63"}, "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-3e9b53b49323e853", "name": "Commented-code block (9 lines) in src/runtime/libsignal-log-throttle.js:3", "shortDescription": {"text": "Commented-code block (9 lines) in src/runtime/libsignal-log-throttle.js:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4d6fab1c57574bfa", "name": "Commented-code block (6 lines) in src/runtime/process-safety.js:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/runtime/process-safety.js:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1f71404a180ca9c1", "name": "Commented-code block (5 lines) in src/runtime/boot-recovery.js:5", "shortDescription": {"text": "Commented-code block (5 lines) in src/runtime/boot-recovery.js:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b47d0bcf4478689c", "name": "Commented-code block (9 lines) in src/runtime/bot-resolver.js:5", "shortDescription": {"text": "Commented-code block (9 lines) in src/runtime/bot-resolver.js:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-46937053623fe115", "name": "Commented-code block (5 lines) in src/services/bot/platform-features.js:87", "shortDescription": {"text": "Commented-code block (5 lines) in src/services/bot/platform-features.js:87"}, "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-9d63b5ec4f0f612a", "name": "Commented-code block (6 lines) in src/services/bot/runtime-bot.js:183", "shortDescription": {"text": "Commented-code block (6 lines) in src/services/bot/runtime-bot.js:183"}, "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-1f00ce41cf491a33", "name": "Commented-code block (5 lines) in src/services/monitoring/unlink-alert.js:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/services/monitoring/unlink-alert.js:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ff3533197b6b4a05", "name": "Commented-code block (8 lines) in src/services/ai/reply-validator.js:82", "shortDescription": {"text": "Commented-code block (8 lines) in src/services/ai/reply-validator.js:82"}, "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-9f6f8c46e3dfe1ca", "name": "Commented-code block (5 lines) in src/services/ai/knowledge-retrieval.js:101", "shortDescription": {"text": "Commented-code block (5 lines) in src/services/ai/knowledge-retrieval.js:101"}, "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-7aac33f1fe0ee70a", "name": "Commented-code block (5 lines) in src/services/learning/owner-reply-learner.js:95", "shortDescription": {"text": "Commented-code block (5 lines) in src/services/learning/owner-reply-learner.js:95"}, "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-9db368b6a1dc6872", "name": "Commented-code block (6 lines) in src/services/escalation/escalation-bridge.js:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/services/escalation/escalation-bridge.js:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c6ac8b20afb068a1", "name": "Commented-code block (5 lines) in src/services/admin/copy-merchant-config.js:5", "shortDescription": {"text": "Commented-code block (5 lines) in src/services/admin/copy-merchant-config.js:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c1ce4625e487ba6b", "name": "Commented-code block (5 lines) in src/services/whatsapp/baileys-postgres-auth.js:31", "shortDescription": {"text": "Commented-code block (5 lines) in src/services/whatsapp/baileys-postgres-auth.js:31"}, "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-6b70660cf48fee87", "name": "Commented-code block (6 lines) in src/services/whatsapp/message-ingest.service.js:308", "shortDescription": {"text": "Commented-code block (6 lines) in src/services/whatsapp/message-ingest.service.js:308"}, "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-7c0e0a26aa05e74c", "name": "Commented-code block (6 lines) in src/services/whatsapp/baileys-connection-manager.js:22", "shortDescription": {"text": "Commented-code block (6 lines) in src/services/whatsapp/baileys-connection-manager.js:22"}, "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-567647597204de85", "name": "Commented-code block (9 lines) in src/db/migrations/init.js:438", "shortDescription": {"text": "Commented-code block (9 lines) in src/db/migrations/init.js:438"}, "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-fcdd1307187b61cc", "name": "98 env vars used in code but missing from .env.example", "shortDescription": {"text": "98 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ADMIN_ALERT_EMAIL`, `ADMIN_PASSWORD`, `AI_PENDING_MAX_AGE_MS`, `AI_RECOVERY_INTERVAL_MS`, `AI_RECOVERY_LIMIT`, `AI_RECOVERY_MAX_AGE_MS`, `AI_REPLY_DEBOUNCE_MS`, `AI_WORKER_DB_READY_INTERVAL_MS` + 90 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-132a5b38dd68b83a", "name": "Dangling fetch: GET http://127.0.0.1:${server.address().port}/health (tests/startup-health.test.js:24)", "shortDescription": {"text": "Dangling fetch: GET http://127.0.0.1:${server.address().port}/health (tests/startup-health.test.js:24)"}, "fullDescription": {"text": "`tests/startup-health.test.js:24` calls `GET http://127.0.0.1:${server.address().port}/health` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:/<p>/health`\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-675ba6ba465ef31e", "name": "Dangling fetch: GET http://127.0.0.1:${server.address().port}/api/status (tests/startup-health.test.js:39)", "shortDescription": {"text": "Dangling fetch: GET http://127.0.0.1:${server.address().port}/api/status (tests/startup-health.test.js:39)"}, "fullDescription": {"text": "`tests/startup-health.test.js:39` calls `GET http://127.0.0.1:${server.address().port}/api/status` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:/<p>/api/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-738d0885a127a2e9", "name": "Dangling fetch: GET http://127.0.0.1:${server.address().port}/api/status (tests/startup-health.test.js:55)", "shortDescription": {"text": "Dangling fetch: GET http://127.0.0.1:${server.address().port}/api/status (tests/startup-health.test.js:55)"}, "fullDescription": {"text": "`tests/startup-health.test.js:55` calls `GET http://127.0.0.1:${server.address().port}/api/status` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:/<p>/api/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-f159074cca7ddac7", "name": "Dangling fetch: GET https://api.moyasar.com/v1/payments/${encodeURIComponent(id)} (src/services/billing/moyasar-client.j", "shortDescription": {"text": "Dangling fetch: GET https://api.moyasar.com/v1/payments/${encodeURIComponent(id)} (src/services/billing/moyasar-client.js:33)"}, "fullDescription": {"text": "`src/services/billing/moyasar-client.js:33` calls `GET https://api.moyasar.com/v1/payments/${encodeURIComponent(id)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.moyasar.com/v1/payments/<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-e3e81b1e3fa4cc66", "name": "Unused endpoint: GET /api/storage-status", "shortDescription": {"text": "Unused endpoint: GET /api/storage-status"}, "fullDescription": {"text": "`legacy/index.js` declares `GET /api/storage-status` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1157c4bcb54c348c", "name": "Unused endpoint: USE /fonts", "shortDescription": {"text": "Unused endpoint: USE /fonts"}, "fullDescription": {"text": "`legacy/index.js` declares `USE /fonts` 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-6a4dfcad3eb1618a", "name": "Unused endpoint: GET /login", "shortDescription": {"text": "Unused endpoint: GET /login"}, "fullDescription": {"text": "`legacy/index.js` declares `GET /login` 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": "`legacy/index.js` declares `GET /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a5b3437e64c8f7b4", "name": "Unused endpoint: POST /api/auth/register", "shortDescription": {"text": "Unused endpoint: POST /api/auth/register"}, "fullDescription": {"text": "`legacy/index.js` declares `POST /api/auth/register` 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-9a09509abf7dc4a3", "name": "Unused endpoint: POST /api/auth/verify-email", "shortDescription": {"text": "Unused endpoint: POST /api/auth/verify-email"}, "fullDescription": {"text": "`legacy/index.js` declares `POST /api/auth/verify-email` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-82bd21677b0ffc49", "name": "Unused endpoint: POST /api/auth/resend-code", "shortDescription": {"text": "Unused endpoint: POST /api/auth/resend-code"}, "fullDescription": {"text": "`legacy/index.js` declares `POST /api/auth/resend-code` 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-fd55aa0818a7c897", "name": "Unused endpoint: POST /api/auth/login", "shortDescription": {"text": "Unused endpoint: POST /api/auth/login"}, "fullDescription": {"text": "`legacy/index.js` declares `POST /api/auth/login` 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-d5a39262ac205120", "name": "Unused endpoint: POST /api/auth/logout", "shortDescription": {"text": "Unused endpoint: POST /api/auth/logout"}, "fullDescription": {"text": "`legacy/index.js` declares `POST /api/auth/logout` 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-ee4aa5ddab88c9dc", "name": "Unused endpoint: GET /api/auth/me", "shortDescription": {"text": "Unused endpoint: GET /api/auth/me"}, "fullDescription": {"text": "`legacy/index.js` declares `GET /api/auth/me` 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-a0e81858fbfe443b", "name": "Unused endpoint: POST /api/auth/forgot-password", "shortDescription": {"text": "Unused endpoint: POST /api/auth/forgot-password"}, "fullDescription": {"text": "`legacy/index.js` declares `POST /api/auth/forgot-password` 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-deb991b140ed4125", "name": "Unused endpoint: POST /api/auth/reset-password", "shortDescription": {"text": "Unused endpoint: POST /api/auth/reset-password"}, "fullDescription": {"text": "`legacy/index.js` declares `POST /api/auth/reset-password` 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-dde3adb27bf7eebe", "name": "Unused endpoint: USE /api", "shortDescription": {"text": "Unused endpoint: USE /api"}, "fullDescription": {"text": "`legacy/index.js` declares `USE /api` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-866cfadefccd0b5c", "name": "Unused endpoint: POST /api/auth/change-password", "shortDescription": {"text": "Unused endpoint: POST /api/auth/change-password"}, "fullDescription": {"text": "`legacy/index.js` declares `POST /api/auth/change-password` 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-963710f42a2c8219", "name": "Unused endpoint: GET /api/status", "shortDescription": {"text": "Unused endpoint: GET /api/status"}, "fullDescription": {"text": "`legacy/index.js` declares `GET /api/status` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d0cde515b9874455", "name": "Unused endpoint: GET /api/debug-last", "shortDescription": {"text": "Unused endpoint: GET /api/debug-last"}, "fullDescription": {"text": "`legacy/index.js` declares `GET /api/debug-last` 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-f774785ee734700e", "name": "Unused endpoint: GET /api/qr-image", "shortDescription": {"text": "Unused endpoint: GET /api/qr-image"}, "fullDescription": {"text": "`legacy/index.js` declares `GET /api/qr-image` 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-9d56fee08c61d082", "name": "Unused endpoint: GET /api/qr", "shortDescription": {"text": "Unused endpoint: GET /api/qr"}, "fullDescription": {"text": "`legacy/index.js` declares `GET /api/qr` 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-7aa4b2518cbbbfa2", "name": "Unused endpoint: GET /api/config", "shortDescription": {"text": "Unused endpoint: GET /api/config"}, "fullDescription": {"text": "`legacy/index.js` declares `GET /api/config` 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-1309b6a1617af0a6", "name": "Unused endpoint: POST /api/config", "shortDescription": {"text": "Unused endpoint: POST /api/config"}, "fullDescription": {"text": "`legacy/index.js` declares `POST /api/config` 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-dace2c5f27ad9318", "name": "Unused endpoint: POST /api/clear", "shortDescription": {"text": "Unused endpoint: POST /api/clear"}, "fullDescription": {"text": "`legacy/index.js` declares `POST /api/clear` 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-7a68877793f94788", "name": "Unused endpoint: POST /api/bot/start", "shortDescription": {"text": "Unused endpoint: POST /api/bot/start"}, "fullDescription": {"text": "`legacy/index.js` declares `POST /api/bot/start` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c23567db72506bae", "name": "Unused endpoint: POST /api/bot/stop", "shortDescription": {"text": "Unused endpoint: POST /api/bot/stop"}, "fullDescription": {"text": "`legacy/index.js` declares `POST /api/bot/stop` 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-797c36c764faf55b", "name": "Unused endpoint: POST /api/bot/clear-session", "shortDescription": {"text": "Unused endpoint: POST /api/bot/clear-session"}, "fullDescription": {"text": "`legacy/index.js` declares `POST /api/bot/clear-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-cfa621c46167674c", "name": "Unused endpoint: POST /api/send-message", "shortDescription": {"text": "Unused endpoint: POST /api/send-message"}, "fullDescription": {"text": "`legacy/index.js` declares `POST /api/send-message` 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-2b63450920852611", "name": "Unused endpoint: POST /api/test-token", "shortDescription": {"text": "Unused endpoint: POST /api/test-token"}, "fullDescription": {"text": "`legacy/index.js` declares `POST /api/test-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-5a610e6d77e1b92d", "name": "Unused endpoint: POST /api/health-check", "shortDescription": {"text": "Unused endpoint: POST /api/health-check"}, "fullDescription": {"text": "`legacy/index.js` declares `POST /api/health-check` 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-bf725a35a2cd7018", "name": "Unused endpoint: POST /api/test-chat", "shortDescription": {"text": "Unused endpoint: POST /api/test-chat"}, "fullDescription": {"text": "`legacy/index.js` declares `POST /api/test-chat` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aead595a4b54d73b", "name": "Unused endpoint: POST /api/learn-style", "shortDescription": {"text": "Unused endpoint: POST /api/learn-style"}, "fullDescription": {"text": "`legacy/index.js` declares `POST /api/learn-style` 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-4e15aee87bbf10f1", "name": "Unused endpoint: POST /api/enhance-text", "shortDescription": {"text": "Unused endpoint: POST /api/enhance-text"}, "fullDescription": {"text": "`legacy/index.js` declares `POST /api/enhance-text` 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-b4bb881d4032c59b", "name": "Unused endpoint: POST /api/scan-store", "shortDescription": {"text": "Unused endpoint: POST /api/scan-store"}, "fullDescription": {"text": "`legacy/index.js` declares `POST /api/scan-store` 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-36d480d8cfedb9b4", "name": "Unused endpoint: GET /api/paused-chats", "shortDescription": {"text": "Unused endpoint: GET /api/paused-chats"}, "fullDescription": {"text": "`legacy/index.js` declares `GET /api/paused-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-c76d2532627b25bf", "name": "Unused endpoint: POST /api/paused-chats/resume", "shortDescription": {"text": "Unused endpoint: POST /api/paused-chats/resume"}, "fullDescription": {"text": "`legacy/index.js` declares `POST /api/paused-chats/resume` 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-30865b72574e3003", "name": "Unused endpoint: GET /api/costs", "shortDescription": {"text": "Unused endpoint: GET /api/costs"}, "fullDescription": {"text": "`legacy/index.js` declares `GET /api/costs` 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-15a8abf649e63dfd", "name": "Unused endpoint: POST /api/costs/reset", "shortDescription": {"text": "Unused endpoint: POST /api/costs/reset"}, "fullDescription": {"text": "`legacy/index.js` declares `POST /api/costs/reset` 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-33ffa73fd252fb7a", "name": "Unused endpoint: POST /api/train-analyze", "shortDescription": {"text": "Unused endpoint: POST /api/train-analyze"}, "fullDescription": {"text": "`legacy/index.js` declares `POST /api/train-analyze` 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-def16861a13564b0", "name": "Unused endpoint: USE /api/auth/register", "shortDescription": {"text": "Unused endpoint: USE /api/auth/register"}, "fullDescription": {"text": "`src/server.js` declares `USE /api/auth/register` 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-07337beb363b49bf", "name": "Unused endpoint: GET /conversations.css", "shortDescription": {"text": "Unused endpoint: GET /conversations.css"}, "fullDescription": {"text": "`src/server.js` declares `GET /conversations.css` 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-bced35a4cd9c329b", "name": "Unused endpoint: GET /billing", "shortDescription": {"text": "Unused endpoint: GET /billing"}, "fullDescription": {"text": "`src/server.js` declares `GET /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-cb97d5083076ac10", "name": "Unused endpoint: POST /api/bot/restart", "shortDescription": {"text": "Unused endpoint: POST /api/bot/restart"}, "fullDescription": {"text": "`src/server.js` declares `POST /api/bot/restart` 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-c921d242ce55dba1", "name": "Unused endpoint: GET /api/conversations", "shortDescription": {"text": "Unused endpoint: GET /api/conversations"}, "fullDescription": {"text": "`src/server.js` declares `GET /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-2d8ab2e37d6cec30", "name": "Unused endpoint: POST /api/products/import", "shortDescription": {"text": "Unused endpoint: POST /api/products/import"}, "fullDescription": {"text": "`src/server.js` declares `POST /api/products/import` 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-e39315049e0183db", "name": "Unused endpoint: GET /api/learned-replies", "shortDescription": {"text": "Unused endpoint: GET /api/learned-replies"}, "fullDescription": {"text": "`src/server.js` declares `GET /api/learned-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-0a32a45a0e8bdf3c", "name": "Unused endpoint: POST /api/learned-replies/toggle", "shortDescription": {"text": "Unused endpoint: POST /api/learned-replies/toggle"}, "fullDescription": {"text": "`src/server.js` declares `POST /api/learned-replies/toggle` 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-db4dd03caf189021", "name": "Unused endpoint: POST /api/learned-replies/update", "shortDescription": {"text": "Unused endpoint: POST /api/learned-replies/update"}, "fullDescription": {"text": "`src/server.js` declares `POST /api/learned-replies/update` 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-8c236625afb6a8cb", "name": "Unused endpoint: GET /ready", "shortDescription": {"text": "Unused endpoint: GET /ready"}, "fullDescription": {"text": "`src/routes/health.routes.js` declares `GET /ready` 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-3c66e0a56692f7cf", "name": "Unused endpoint: USE /api/queues", "shortDescription": {"text": "Unused endpoint: USE /api/queues"}, "fullDescription": {"text": "`src/routes/queue.routes.js` declares `USE /api/queues` 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-d63f18d18e0a65b5", "name": "Unused endpoint: GET /api/queues/stats", "shortDescription": {"text": "Unused endpoint: GET /api/queues/stats"}, "fullDescription": {"text": "`src/routes/queue.routes.js` declares `GET /api/queues/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-e11bddf2673f8423", "name": "Unused endpoint: POST /billing/moyasar/webhook", "shortDescription": {"text": "Unused endpoint: POST /billing/moyasar/webhook"}, "fullDescription": {"text": "`src/routes/billing.routes.js` declares `POST /billing/moyasar/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-823fcbfbce9bb4d9", "name": "Unused endpoint: GET /api/billing/state", "shortDescription": {"text": "Unused endpoint: GET /api/billing/state"}, "fullDescription": {"text": "`src/routes/billing.routes.js` declares `GET /api/billing/state` 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/18756"}, "properties": {"repository": "sahiniksa-cyber/raddi-bot", "repoUrl": "https://github.com/sahiniksa-cyber/raddi-bot", "branch": "main"}, "results": [{"ruleId": "scanner-885e1096f6c4d726", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/libsignal-log-throttle.test.js:68"}, "properties": {"repobilityId": "2029384f1e42a59d", "scanner": "scanner-primary", "fingerprint": "885e1096f6c4d726", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ad88a6d15dea91b8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate-json-to-postgres.js:214"}, "properties": {"repobilityId": "51f65c87fa3a25bc", "scanner": "scanner-primary", "fingerprint": "ad88a6d15dea91b8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e3632bcbe4d6f64e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/encrypt-existing-api-keys.js:35"}, "properties": {"repobilityId": "728d52e909d20719", "scanner": "scanner-primary", "fingerprint": "e3632bcbe4d6f64e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-99baf43e2265b7a7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generate-secrets-key.js:8"}, "properties": {"repobilityId": "0f924e91474e2dcb", "scanner": "scanner-primary", "fingerprint": "99baf43e2265b7a7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cd987ac09df8ea91", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/eval/data-style-eval.js:16"}, "properties": {"repobilityId": "253f78d5556fee11", "scanner": "scanner-primary", "fingerprint": "cd987ac09df8ea91", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3db84534c88ebd28", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/eval/bot-brain-eval.js:63"}, "properties": {"repobilityId": "f872e3673eb54990", "scanner": "scanner-primary", "fingerprint": "3db84534c88ebd28", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-997f6f3e65221a27", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/logger.js:40"}, "properties": {"repobilityId": "aee9fd5855be3d80", "scanner": "scanner-primary", "fingerprint": "997f6f3e65221a27", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b5761859d3115267", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/store-scanner.js:64"}, "properties": {"repobilityId": "d42d1cc204e13676", "scanner": "scanner-primary", "fingerprint": "b5761859d3115267", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-021f442a220c70f8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 legacy/index.js:62"}, "properties": {"repobilityId": "720ed58e53b31bdd", "scanner": "scanner-primary", "fingerprint": "021f442a220c70f8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-245591ed5c426a92", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 legacy/lib/error-handler.js:51"}, "properties": {"repobilityId": "d072f36d7d3149d8", "scanner": "scanner-primary", "fingerprint": "245591ed5c426a92", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3a45a6215eaab7af", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/server.js:806"}, "properties": {"repobilityId": "51ec0d6adae748e2", "scanner": "scanner-primary", "fingerprint": "3a45a6215eaab7af", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-66a412f24eb7bc12", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/workers/outgoing-whatsapp-worker.js:643"}, "properties": {"repobilityId": "6ad76819bde80a14", "scanner": "scanner-primary", "fingerprint": "66a412f24eb7bc12", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-aeea33a095458afd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/workers/ai-worker.js:56"}, "properties": {"repobilityId": "3f9b333c4bcfd054", "scanner": "scanner-primary", "fingerprint": "aeea33a095458afd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0b9753827d47fa23", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/runtime/start-all.js:25"}, "properties": {"repobilityId": "38981eed86022b23", "scanner": "scanner-primary", "fingerprint": "0b9753827d47fa23", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7946cbbb64e3b5ef", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/services/admin/admin-api-keys.js:91"}, "properties": {"repobilityId": "1ecbcf82d813877e", "scanner": "scanner-primary", "fingerprint": "7946cbbb64e3b5ef", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f02dc134c73b8b4e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/services/whatsapp/connection-manager.js:57"}, "properties": {"repobilityId": "c4d5c2952f030ed7", "scanner": "scanner-primary", "fingerprint": "f02dc134c73b8b4e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7345e351d2a6d373", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/services/whatsapp/baileys-connection-manager.js:213"}, "properties": {"repobilityId": "e394380c6a749e31", "scanner": "scanner-primary", "fingerprint": "7345e351d2a6d373", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c083fee10f5636f1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/db/migrations/init.js:535"}, "properties": {"repobilityId": "38343d0ea5ba4bc6", "scanner": "scanner-primary", "fingerprint": "c083fee10f5636f1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d63da3583b14afc0", "level": "warning", "message": {"text": "Dockerfile runs as root: Dockerfile"}, "properties": {"repobilityId": "a2ed1bd120e507db", "scanner": "scanner-primary", "fingerprint": "d63da3583b14afc0", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-a35c6a00f751880f", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-slim"}, "properties": {"repobilityId": "be924fbee382ebe0", "scanner": "scanner-primary", "fingerprint": "a35c6a00f751880f", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"ruleId": "scanner-2321284860f7f1ed", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in dashboard/login.html:654"}, "properties": {"repobilityId": "b0b5bc83bfb4e104", "scanner": "scanner-primary", "fingerprint": "2321284860f7f1ed", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dashboard/login.html"}, "region": {"startLine": 654}}}]}, {"ruleId": "scanner-4aad946dd71dd7d9", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in dashboard/index.html:1983"}, "properties": {"repobilityId": "1d59152a7617eeef", "scanner": "scanner-primary", "fingerprint": "4aad946dd71dd7d9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dashboard/index.html"}, "region": {"startLine": 1983}}}]}, {"ruleId": "scanner-fe458c44fef7898f", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in dashboard/admin.html:234"}, "properties": {"repobilityId": "49c8db68126b188b", "scanner": "scanner-primary", "fingerprint": "fe458c44fef7898f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dashboard/admin.html"}, "region": {"startLine": 234}}}]}, {"ruleId": "scanner-acf5ff3c964739b4", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in lib/helpers.js:12"}, "properties": {"repobilityId": "5dd32e3d53541093", "scanner": "scanner-primary", "fingerprint": "acf5ff3c964739b4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/helpers.js"}, "region": {"startLine": 12}}}]}, {"ruleId": "scanner-6f716aa9c5fa08e3", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in src/runtime/start-all.js:3"}, "properties": {"repobilityId": "1be2e34b58a7de31", "scanner": "scanner-primary", "fingerprint": "6f716aa9c5fa08e3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/runtime/start-all.js"}, "region": {"startLine": 3}}}]}, {"ruleId": "scanner-6372cebde0220094", "level": "warning", "message": {"text": "No auth library detected"}, "properties": {"repobilityId": "a5b6035a5bbf8054", "scanner": "scanner-primary", "fingerprint": "6372cebde0220094", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["coverage", "auth"]}}, {"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-1ae3ecf17a2ee84a", "level": "note", "message": {"text": "Very large file: legacy/index.js (1245 lines)"}, "properties": {"repobilityId": "2ab3ddd469820abb", "scanner": "scanner-primary", "fingerprint": "1ae3ecf17a2ee84a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "dc59b4a87ee26564", "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": "fa8736126401b279", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-9d79c4077342a7d0", "level": "warning", "message": {"text": "Runtime service client appears to use placeholder configuration"}, "properties": {"repobilityId": "974d6ce09106097c", "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": "2c12e6292d746aa5", "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": "2960831cb6c0ece7", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "5756b31990bb25a5", "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": "5c221c8fee81a4e2", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-a82351121bb93621", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/escalation-bridge.test.js:60"}, "properties": {"repobilityId": "e99f58628a77ffcf", "scanner": "scanner-primary", "fingerprint": "a82351121bb93621", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-01d3f7f746020805", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/outgoing-records-whatsapp-id.test.js:3"}, "properties": {"repobilityId": "c8dd6dd89e1541b0", "scanner": "scanner-primary", "fingerprint": "01d3f7f746020805", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-91a67b747bf76c8e", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/runtime-bot-lease-force.test.js:3"}, "properties": {"repobilityId": "04be0cc8464bd135", "scanner": "scanner-primary", "fingerprint": "91a67b747bf76c8e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-009f3f3232a1292f", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/never-silent-escalation.test.js:8"}, "properties": {"repobilityId": "9df9b0f2450590f2", "scanner": "scanner-primary", "fingerprint": "009f3f3232a1292f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-634931aaeb5bd373", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/meta-prompts-integration.test.js:3"}, "properties": {"repobilityId": "e7fedbc4b5c459ed", "scanner": "scanner-primary", "fingerprint": "634931aaeb5bd373", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-75877fd425fb3838", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/bot-resolver-single-flight.test.js:3"}, "properties": {"repobilityId": "f718a45952a180d3", "scanner": "scanner-primary", "fingerprint": "75877fd425fb3838", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f2698233b1437db0", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/baileys-auth-flush.test.js:3"}, "properties": {"repobilityId": "4f2c9fe16476b933", "scanner": "scanner-primary", "fingerprint": "f2698233b1437db0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7fbf73e8615eb51a", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/baileys-keystore-debounce.test.js:3"}, "properties": {"repobilityId": "80e3cf2d15e5934c", "scanner": "scanner-primary", "fingerprint": "7fbf73e8615eb51a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9e49dbd3f1711ff2", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/outgoing-conn-conflict-guard.test.js:3"}, "properties": {"repobilityId": "b8ee3b52dbc1f867", "scanner": "scanner-primary", "fingerprint": "9e49dbd3f1711ff2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2c2d4fedb444a3a9", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/runtime-bot-conn-conflict-backoff.test.js:5"}, "properties": {"repobilityId": "bb92f9f59c3d5555", "scanner": "scanner-primary", "fingerprint": "2c2d4fedb444a3a9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2e93126c2ee7e20d", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/connection-fixes.test.js:3"}, "properties": {"repobilityId": "b2f21590c401ab9c", "scanner": "scanner-primary", "fingerprint": "2e93126c2ee7e20d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c77cdbc4f935b64c", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/ai-failure-fallback.test.js:7"}, "properties": {"repobilityId": "7484828f3c1071cf", "scanner": "scanner-primary", "fingerprint": "c77cdbc4f935b64c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7f5c51961fa68af2", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/baileys-messages-generation-guard.test.js:3"}, "properties": {"repobilityId": "a3d89a43643f7ee8", "scanner": "scanner-primary", "fingerprint": "7f5c51961fa68af2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-be585c1fa94d395e", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/ai-worker-store-assistant.test.js:26"}, "properties": {"repobilityId": "197ae6cbbfc96fc0", "scanner": "scanner-primary", "fingerprint": "be585c1fa94d395e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d86d4808b88694da", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/config-controller-save-strips-keys.test.js:8"}, "properties": {"repobilityId": "240812eaf33f21c9", "scanner": "scanner-primary", "fingerprint": "d86d4808b88694da", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-556f2d5a8b96059a", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/copy-merchant-config.test.js:10"}, "properties": {"repobilityId": "0911f67279ff902b", "scanner": "scanner-primary", "fingerprint": "556f2d5a8b96059a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-00b4c8b02314e927", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/no-duplicate-sends-and-media-pause.test.js:11"}, "properties": {"repobilityId": "64f0de14512c0a20", "scanner": "scanner-primary", "fingerprint": "00b4c8b02314e927", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b895c7ae74a7f2cf", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/runtime-bot-lease-loss.test.js:5"}, "properties": {"repobilityId": "e1d32d08bd308e14", "scanner": "scanner-primary", "fingerprint": "b895c7ae74a7f2cf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-48f1274e1ab1fd5f", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/ai-worker-stale-skip.test.js:8"}, "properties": {"repobilityId": "2b964a3a13637bbc", "scanner": "scanner-primary", "fingerprint": "48f1274e1ab1fd5f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d188ef5e12d4078a", "level": "none", "message": {"text": "Commented-code block (8 lines) in lib/message-staleness.js:9"}, "properties": {"repobilityId": "a32caaf88315dc61", "scanner": "scanner-primary", "fingerprint": "d188ef5e12d4078a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f830f2108d906d76", "level": "none", "message": {"text": "Commented-code block (7 lines) in lib/helpers.js:76"}, "properties": {"repobilityId": "20dafaf245136390", "scanner": "scanner-primary", "fingerprint": "f830f2108d906d76", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b8a92c99802990a8", "level": "none", "message": {"text": "Commented-code block (6 lines) in lib/post-process-reply.js:36"}, "properties": {"repobilityId": "8af0d9e686a47d02", "scanner": "scanner-primary", "fingerprint": "b8a92c99802990a8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a11b0e00360d0bc0", "level": "none", "message": {"text": "Commented-code block (7 lines) in lib/ai-client.js:25"}, "properties": {"repobilityId": "c3e55cabd0b64ab1", "scanner": "scanner-primary", "fingerprint": "a11b0e00360d0bc0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6f4ba3732d073554", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/server.js:122"}, "properties": {"repobilityId": "5b6963bfb775211f", "scanner": "scanner-primary", "fingerprint": "6f4ba3732d073554", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1fff1cb3c5422019", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/routes/billing.routes.js:44"}, "properties": {"repobilityId": "3d64acfb0eac83e5", "scanner": "scanner-primary", "fingerprint": "1fff1cb3c5422019", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-676c5b0f4a7a459e", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/routes/admin.routes.js:174"}, "properties": {"repobilityId": "f330c36679f4ae8b", "scanner": "scanner-primary", "fingerprint": "676c5b0f4a7a459e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6a504e559e5cfc61", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/workers/escalation-routing.js:5"}, "properties": {"repobilityId": "32bda8269aece669", "scanner": "scanner-primary", "fingerprint": "6a504e559e5cfc61", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-592b92b33c79107b", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/workers/outgoing-whatsapp-worker.js:46"}, "properties": {"repobilityId": "1b74dcfa9e735e4a", "scanner": "scanner-primary", "fingerprint": "592b92b33c79107b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-18133101895d32a9", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/workers/ai-worker.js:208"}, "properties": {"repobilityId": "1fb2e2cd106a6250", "scanner": "scanner-primary", "fingerprint": "18133101895d32a9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c1ee1644bbcf149e", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/controllers/bot.controller.js:63"}, "properties": {"repobilityId": "e0e126f3e4f21839", "scanner": "scanner-primary", "fingerprint": "c1ee1644bbcf149e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3e9b53b49323e853", "level": "none", "message": {"text": "Commented-code block (9 lines) in src/runtime/libsignal-log-throttle.js:3"}, "properties": {"repobilityId": "2725c99bef6f71c2", "scanner": "scanner-primary", "fingerprint": "3e9b53b49323e853", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4d6fab1c57574bfa", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/runtime/process-safety.js:3"}, "properties": {"repobilityId": "3be6cc7daf487f1c", "scanner": "scanner-primary", "fingerprint": "4d6fab1c57574bfa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1f71404a180ca9c1", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/runtime/boot-recovery.js:5"}, "properties": {"repobilityId": "24a757e61bf28f90", "scanner": "scanner-primary", "fingerprint": "1f71404a180ca9c1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b47d0bcf4478689c", "level": "none", "message": {"text": "Commented-code block (9 lines) in src/runtime/bot-resolver.js:5"}, "properties": {"repobilityId": "02ee81f73fea58d4", "scanner": "scanner-primary", "fingerprint": "b47d0bcf4478689c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-46937053623fe115", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/services/bot/platform-features.js:87"}, "properties": {"repobilityId": "0a7de9db3e40b9c4", "scanner": "scanner-primary", "fingerprint": "46937053623fe115", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9d63b5ec4f0f612a", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/services/bot/runtime-bot.js:183"}, "properties": {"repobilityId": "4c98f4e1cb8c4b98", "scanner": "scanner-primary", "fingerprint": "9d63b5ec4f0f612a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1f00ce41cf491a33", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/services/monitoring/unlink-alert.js:3"}, "properties": {"repobilityId": "7653685afc167dd8", "scanner": "scanner-primary", "fingerprint": "1f00ce41cf491a33", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ff3533197b6b4a05", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/services/ai/reply-validator.js:82"}, "properties": {"repobilityId": "e40d200540bb233a", "scanner": "scanner-primary", "fingerprint": "ff3533197b6b4a05", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9f6f8c46e3dfe1ca", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/services/ai/knowledge-retrieval.js:101"}, "properties": {"repobilityId": "a3a957028619fe4b", "scanner": "scanner-primary", "fingerprint": "9f6f8c46e3dfe1ca", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7aac33f1fe0ee70a", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/services/learning/owner-reply-learner.js:95"}, "properties": {"repobilityId": "c97b765cc315678d", "scanner": "scanner-primary", "fingerprint": "7aac33f1fe0ee70a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9db368b6a1dc6872", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/services/escalation/escalation-bridge.js:3"}, "properties": {"repobilityId": "3aa50645256ae3d8", "scanner": "scanner-primary", "fingerprint": "9db368b6a1dc6872", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c6ac8b20afb068a1", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/services/admin/copy-merchant-config.js:5"}, "properties": {"repobilityId": "083e56cd32c5d865", "scanner": "scanner-primary", "fingerprint": "c6ac8b20afb068a1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c1ce4625e487ba6b", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/services/whatsapp/baileys-postgres-auth.js:31"}, "properties": {"repobilityId": "0e07270b7788a846", "scanner": "scanner-primary", "fingerprint": "c1ce4625e487ba6b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6b70660cf48fee87", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/services/whatsapp/message-ingest.service.js:308"}, "properties": {"repobilityId": "5585b1205115c2f7", "scanner": "scanner-primary", "fingerprint": "6b70660cf48fee87", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7c0e0a26aa05e74c", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/services/whatsapp/baileys-connection-manager.js:22"}, "properties": {"repobilityId": "3bef4a068124c845", "scanner": "scanner-primary", "fingerprint": "7c0e0a26aa05e74c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-567647597204de85", "level": "none", "message": {"text": "Commented-code block (9 lines) in src/db/migrations/init.js:438"}, "properties": {"repobilityId": "0f04195bdac2db94", "scanner": "scanner-primary", "fingerprint": "567647597204de85", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fcdd1307187b61cc", "level": "note", "message": {"text": "98 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "51c4192f5836ddfa", "scanner": "scanner-primary", "fingerprint": "fcdd1307187b61cc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-132a5b38dd68b83a", "level": "error", "message": {"text": "Dangling fetch: GET http://127.0.0.1:${server.address().port}/health (tests/startup-health.test.js:24)"}, "properties": {"repobilityId": "6077ba3d300166c6", "scanner": "scanner-primary", "fingerprint": "132a5b38dd68b83a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-675ba6ba465ef31e", "level": "error", "message": {"text": "Dangling fetch: GET http://127.0.0.1:${server.address().port}/api/status (tests/startup-health.test.js:39)"}, "properties": {"repobilityId": "4046138e239761e7", "scanner": "scanner-primary", "fingerprint": "675ba6ba465ef31e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-738d0885a127a2e9", "level": "error", "message": {"text": "Dangling fetch: GET http://127.0.0.1:${server.address().port}/api/status (tests/startup-health.test.js:55)"}, "properties": {"repobilityId": "b543cf864d331f9f", "scanner": "scanner-primary", "fingerprint": "738d0885a127a2e9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f159074cca7ddac7", "level": "error", "message": {"text": "Dangling fetch: GET https://api.moyasar.com/v1/payments/${encodeURIComponent(id)} (src/services/billing/moyasar-client.js:33)"}, "properties": {"repobilityId": "5edf99d7533fc8a3", "scanner": "scanner-primary", "fingerprint": "f159074cca7ddac7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e3e81b1e3fa4cc66", "level": "note", "message": {"text": "Unused endpoint: GET /api/storage-status"}, "properties": {"repobilityId": "a07d0ff741770cae", "scanner": "scanner-primary", "fingerprint": "e3e81b1e3fa4cc66", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1157c4bcb54c348c", "level": "note", "message": {"text": "Unused endpoint: USE /fonts"}, "properties": {"repobilityId": "7b7537b9e8ee3c6f", "scanner": "scanner-primary", "fingerprint": "1157c4bcb54c348c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6a4dfcad3eb1618a", "level": "note", "message": {"text": "Unused endpoint: GET /login"}, "properties": {"repobilityId": "0f478bf1433a08bb", "scanner": "scanner-primary", "fingerprint": "6a4dfcad3eb1618a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "6710eb22a06c0766", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a5b3437e64c8f7b4", "level": "note", "message": {"text": "Unused endpoint: POST /api/auth/register"}, "properties": {"repobilityId": "229bf6c96e8bf6ce", "scanner": "scanner-primary", "fingerprint": "a5b3437e64c8f7b4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9a09509abf7dc4a3", "level": "note", "message": {"text": "Unused endpoint: POST /api/auth/verify-email"}, "properties": {"repobilityId": "61ef5b15bd6e7ec3", "scanner": "scanner-primary", "fingerprint": "9a09509abf7dc4a3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-82bd21677b0ffc49", "level": "note", "message": {"text": "Unused endpoint: POST /api/auth/resend-code"}, "properties": {"repobilityId": "cd91ff2443fdfea5", "scanner": "scanner-primary", "fingerprint": "82bd21677b0ffc49", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fd55aa0818a7c897", "level": "note", "message": {"text": "Unused endpoint: POST /api/auth/login"}, "properties": {"repobilityId": "ad7c15fadc78af13", "scanner": "scanner-primary", "fingerprint": "fd55aa0818a7c897", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d5a39262ac205120", "level": "note", "message": {"text": "Unused endpoint: POST /api/auth/logout"}, "properties": {"repobilityId": "8e504f5b19833c0b", "scanner": "scanner-primary", "fingerprint": "d5a39262ac205120", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ee4aa5ddab88c9dc", "level": "note", "message": {"text": "Unused endpoint: GET /api/auth/me"}, "properties": {"repobilityId": "34dcbf3d41328652", "scanner": "scanner-primary", "fingerprint": "ee4aa5ddab88c9dc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a0e81858fbfe443b", "level": "note", "message": {"text": "Unused endpoint: POST /api/auth/forgot-password"}, "properties": {"repobilityId": "537cdf42c3695513", "scanner": "scanner-primary", "fingerprint": "a0e81858fbfe443b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-deb991b140ed4125", "level": "note", "message": {"text": "Unused endpoint: POST /api/auth/reset-password"}, "properties": {"repobilityId": "43deda7cbd8a5e5a", "scanner": "scanner-primary", "fingerprint": "deb991b140ed4125", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dde3adb27bf7eebe", "level": "note", "message": {"text": "Unused endpoint: USE /api"}, "properties": {"repobilityId": "b99ff98a87d14c55", "scanner": "scanner-primary", "fingerprint": "dde3adb27bf7eebe", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-866cfadefccd0b5c", "level": "note", "message": {"text": "Unused endpoint: POST /api/auth/change-password"}, "properties": {"repobilityId": "abdaf1ef95d25b64", "scanner": "scanner-primary", "fingerprint": "866cfadefccd0b5c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-963710f42a2c8219", "level": "note", "message": {"text": "Unused endpoint: GET /api/status"}, "properties": {"repobilityId": "925f0797f52702a9", "scanner": "scanner-primary", "fingerprint": "963710f42a2c8219", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d0cde515b9874455", "level": "note", "message": {"text": "Unused endpoint: GET /api/debug-last"}, "properties": {"repobilityId": "3e1afa0a4ac22f9a", "scanner": "scanner-primary", "fingerprint": "d0cde515b9874455", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f774785ee734700e", "level": "note", "message": {"text": "Unused endpoint: GET /api/qr-image"}, "properties": {"repobilityId": "113e42bf1d03b4ff", "scanner": "scanner-primary", "fingerprint": "f774785ee734700e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9d56fee08c61d082", "level": "note", "message": {"text": "Unused endpoint: GET /api/qr"}, "properties": {"repobilityId": "c30d3f8e60e58f45", "scanner": "scanner-primary", "fingerprint": "9d56fee08c61d082", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7aa4b2518cbbbfa2", "level": "note", "message": {"text": "Unused endpoint: GET /api/config"}, "properties": {"repobilityId": "c1639dc717e447fb", "scanner": "scanner-primary", "fingerprint": "7aa4b2518cbbbfa2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1309b6a1617af0a6", "level": "note", "message": {"text": "Unused endpoint: POST /api/config"}, "properties": {"repobilityId": "a19f540fe2e8f82b", "scanner": "scanner-primary", "fingerprint": "1309b6a1617af0a6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dace2c5f27ad9318", "level": "note", "message": {"text": "Unused endpoint: POST /api/clear"}, "properties": {"repobilityId": "ca2a6718b4cd6b2e", "scanner": "scanner-primary", "fingerprint": "dace2c5f27ad9318", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a68877793f94788", "level": "note", "message": {"text": "Unused endpoint: POST /api/bot/start"}, "properties": {"repobilityId": "e4b4c4451a70605c", "scanner": "scanner-primary", "fingerprint": "7a68877793f94788", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c23567db72506bae", "level": "note", "message": {"text": "Unused endpoint: POST /api/bot/stop"}, "properties": {"repobilityId": "c106a2cd822c8890", "scanner": "scanner-primary", "fingerprint": "c23567db72506bae", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-797c36c764faf55b", "level": "note", "message": {"text": "Unused endpoint: POST /api/bot/clear-session"}, "properties": {"repobilityId": "c46b6ae54fef8d3f", "scanner": "scanner-primary", "fingerprint": "797c36c764faf55b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cfa621c46167674c", "level": "note", "message": {"text": "Unused endpoint: POST /api/send-message"}, "properties": {"repobilityId": "2bff86af32521439", "scanner": "scanner-primary", "fingerprint": "cfa621c46167674c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2b63450920852611", "level": "note", "message": {"text": "Unused endpoint: POST /api/test-token"}, "properties": {"repobilityId": "8bd0dd401c5d7bfb", "scanner": "scanner-primary", "fingerprint": "2b63450920852611", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5a610e6d77e1b92d", "level": "note", "message": {"text": "Unused endpoint: POST /api/health-check"}, "properties": {"repobilityId": "6b3b967c20079a51", "scanner": "scanner-primary", "fingerprint": "5a610e6d77e1b92d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bf725a35a2cd7018", "level": "note", "message": {"text": "Unused endpoint: POST /api/test-chat"}, "properties": {"repobilityId": "622bfde6b8a7d134", "scanner": "scanner-primary", "fingerprint": "bf725a35a2cd7018", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-aead595a4b54d73b", "level": "note", "message": {"text": "Unused endpoint: POST /api/learn-style"}, "properties": {"repobilityId": "2ffb28482c03df4b", "scanner": "scanner-primary", "fingerprint": "aead595a4b54d73b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4e15aee87bbf10f1", "level": "note", "message": {"text": "Unused endpoint: POST /api/enhance-text"}, "properties": {"repobilityId": "6d4a9ed90bcbbe6c", "scanner": "scanner-primary", "fingerprint": "4e15aee87bbf10f1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b4bb881d4032c59b", "level": "note", "message": {"text": "Unused endpoint: POST /api/scan-store"}, "properties": {"repobilityId": "cfc2c8d6a64caa48", "scanner": "scanner-primary", "fingerprint": "b4bb881d4032c59b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-36d480d8cfedb9b4", "level": "note", "message": {"text": "Unused endpoint: GET /api/paused-chats"}, "properties": {"repobilityId": "8f67bba7e9f11743", "scanner": "scanner-primary", "fingerprint": "36d480d8cfedb9b4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c76d2532627b25bf", "level": "note", "message": {"text": "Unused endpoint: POST /api/paused-chats/resume"}, "properties": {"repobilityId": "e61502775f112db0", "scanner": "scanner-primary", "fingerprint": "c76d2532627b25bf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-30865b72574e3003", "level": "note", "message": {"text": "Unused endpoint: GET /api/costs"}, "properties": {"repobilityId": "c05068d3f5177062", "scanner": "scanner-primary", "fingerprint": "30865b72574e3003", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-15a8abf649e63dfd", "level": "note", "message": {"text": "Unused endpoint: POST /api/costs/reset"}, "properties": {"repobilityId": "1ec3811465308b55", "scanner": "scanner-primary", "fingerprint": "15a8abf649e63dfd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-33ffa73fd252fb7a", "level": "note", "message": {"text": "Unused endpoint: POST /api/train-analyze"}, "properties": {"repobilityId": "53ef3125c92e0257", "scanner": "scanner-primary", "fingerprint": "33ffa73fd252fb7a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-def16861a13564b0", "level": "note", "message": {"text": "Unused endpoint: USE /api/auth/register"}, "properties": {"repobilityId": "c42e1289b4d72b1b", "scanner": "scanner-primary", "fingerprint": "def16861a13564b0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-07337beb363b49bf", "level": "note", "message": {"text": "Unused endpoint: GET /conversations.css"}, "properties": {"repobilityId": "00af2f729f237bae", "scanner": "scanner-primary", "fingerprint": "07337beb363b49bf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bced35a4cd9c329b", "level": "note", "message": {"text": "Unused endpoint: GET /billing"}, "properties": {"repobilityId": "8fa10373a95ea495", "scanner": "scanner-primary", "fingerprint": "bced35a4cd9c329b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cb97d5083076ac10", "level": "note", "message": {"text": "Unused endpoint: POST /api/bot/restart"}, "properties": {"repobilityId": "2880b2f7e94cc58e", "scanner": "scanner-primary", "fingerprint": "cb97d5083076ac10", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c921d242ce55dba1", "level": "note", "message": {"text": "Unused endpoint: GET /api/conversations"}, "properties": {"repobilityId": "fe22a6bb7de934f9", "scanner": "scanner-primary", "fingerprint": "c921d242ce55dba1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2d8ab2e37d6cec30", "level": "note", "message": {"text": "Unused endpoint: POST /api/products/import"}, "properties": {"repobilityId": "f237dc5ea52f8a58", "scanner": "scanner-primary", "fingerprint": "2d8ab2e37d6cec30", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e39315049e0183db", "level": "note", "message": {"text": "Unused endpoint: GET /api/learned-replies"}, "properties": {"repobilityId": "fbe5047db3ef40fd", "scanner": "scanner-primary", "fingerprint": "e39315049e0183db", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0a32a45a0e8bdf3c", "level": "note", "message": {"text": "Unused endpoint: POST /api/learned-replies/toggle"}, "properties": {"repobilityId": "e32094d486a9fd6b", "scanner": "scanner-primary", "fingerprint": "0a32a45a0e8bdf3c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-db4dd03caf189021", "level": "note", "message": {"text": "Unused endpoint: POST /api/learned-replies/update"}, "properties": {"repobilityId": "b8a550d2bc87bf0a", "scanner": "scanner-primary", "fingerprint": "db4dd03caf189021", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8c236625afb6a8cb", "level": "note", "message": {"text": "Unused endpoint: GET /ready"}, "properties": {"repobilityId": "c03d224ba16ea5e9", "scanner": "scanner-primary", "fingerprint": "8c236625afb6a8cb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3c66e0a56692f7cf", "level": "note", "message": {"text": "Unused endpoint: USE /api/queues"}, "properties": {"repobilityId": "3185e94a39589ee6", "scanner": "scanner-primary", "fingerprint": "3c66e0a56692f7cf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d63f18d18e0a65b5", "level": "note", "message": {"text": "Unused endpoint: GET /api/queues/stats"}, "properties": {"repobilityId": "95075572e445f6db", "scanner": "scanner-primary", "fingerprint": "d63f18d18e0a65b5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e11bddf2673f8423", "level": "note", "message": {"text": "Unused endpoint: POST /billing/moyasar/webhook"}, "properties": {"repobilityId": "04dc58e24bb32639", "scanner": "scanner-primary", "fingerprint": "e11bddf2673f8423", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-823fcbfbce9bb4d9", "level": "note", "message": {"text": "Unused endpoint: GET /api/billing/state"}, "properties": {"repobilityId": "5203d0dbaae6a81b", "scanner": "scanner-primary", "fingerprint": "823fcbfbce9bb4d9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}