{"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-864f1e314f52dd6e", "name": "Possibly dead Python function: handle_DATA", "shortDescription": {"text": "Possibly dead Python function: handle_DATA"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a5960c8de3af4089", "name": "Possibly dead Python function: handle_DATA", "shortDescription": {"text": "Possibly dead Python function: handle_DATA"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7a14a09e447f5250", "name": "Possibly dead Python function: handle_DATA", "shortDescription": {"text": "Possibly dead Python function: handle_DATA"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fdbfcf27bfbcd651", "name": "Possibly dead Python function: handle_DATA", "shortDescription": {"text": "Possibly dead Python function: handle_DATA"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-32ac9bb21f37f799", "name": "Possibly dead Python function: include_object", "shortDescription": {"text": "Possibly dead Python function: include_object"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c0aec69763340904", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cd780ba54291030d", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-05effa3a725d7fd5", "name": "Possibly dead Python function: sweep", "shortDescription": {"text": "Possibly dead Python function: sweep"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-915d39f0f295d7b7", "name": "Possibly dead Python function: poll_all", "shortDescription": {"text": "Possibly dead Python function: poll_all"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0da86166aaad55d0", "name": "Stray `console.log` in TS/JS \u2014 extension/background.js:21", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 extension/background.js:21"}, "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-510aca18d2229c22", "name": "Stray `console.log` in TS/JS \u2014 extension/content_linkedin.js:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 extension/content_linkedin.js:10"}, "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-5f37463cf33d6b6d", "name": "Privileged port 587 in use", "shortDescription": {"text": "Privileged port 587 in use"}, "fullDescription": {"text": "Port 587 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f84f6ca600e39425", "name": "Privileged port 993 in use", "shortDescription": {"text": "Privileged port 993 in use"}, "fullDescription": {"text": "Port 993 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-05e85697574c8388", "name": "Insecure pattern 'direct_innerhtml_assignment' in extension/content_linkedin.js:153", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in extension/content_linkedin.js:153"}, "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-06bd11cbfc81502c", "name": "Insecure pattern 'direct_innerhtml_assignment' in extension/sidepanel.js:25", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in extension/sidepanel.js:25"}, "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-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-13837d323fbe4d7d", "name": "Very large file: extension/content_linkedin.js (1520 lines)", "shortDescription": {"text": "Very large file: extension/content_linkedin.js (1520 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "1 test file(s) for 110 source file(s) (ratio 0.01). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 264 console/debugger/print-style debug statements in non-test source. This is a common fast-generation residue before production cleanup."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 30 placeholder/mock markers across 10 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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-f64a48d59b71fceb", "name": "Network/subprocess call without timeout or try/except \u2014 agent/coherent_agent.py:123", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 agent/coherent_agent.py:123"}, "fullDescription": {"text": "`subprocess.Popen(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6f0689c04f39e3a8", "name": "Commented-code block (7 lines) in extension/background.js:9", "shortDescription": {"text": "Commented-code block (7 lines) in extension/background.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-bf59776dc8aae79f", "name": "Commented-code block (11 lines) in extension/content_linkedin.js:44", "shortDescription": {"text": "Commented-code block (11 lines) in extension/content_linkedin.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-dbdfae8614aa84fd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 extension/sidepanel.js:17", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 extension/sidepanel.js:17"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2e40a1f6210e6466", "name": "Commented-code block (5 lines) in backend/src/outreach/config.py:40", "shortDescription": {"text": "Commented-code block (5 lines) in backend/src/outreach/config.py:40"}, "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-5a92a02586e7f32b", "name": "Commented-code block (5 lines) in backend/src/outreach/api/routes_extension.py:46", "shortDescription": {"text": "Commented-code block (5 lines) in backend/src/outreach/api/routes_extension.py: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-a7456f0a5ec4f546", "name": "Commented-code block (5 lines) in backend/src/outreach/api/routes_followups.py:113", "shortDescription": {"text": "Commented-code block (5 lines) in backend/src/outreach/api/routes_followups.py:113"}, "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-e4eaad89d6039e3b", "name": "Commented-code block (6 lines) in backend/src/outreach/workers/dispatcher.py:217", "shortDescription": {"text": "Commented-code block (6 lines) in backend/src/outreach/workers/dispatcher.py:217"}, "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-6dcb2f5107a73e33", "name": "Commented-code block (6 lines) in backend/src/outreach/workers/watchdog.py:244", "shortDescription": {"text": "Commented-code block (6 lines) in backend/src/outreach/workers/watchdog.py:244"}, "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-c43d6ccd75bf5ef0", "name": "Commented-code block (6 lines) in backend/src/outreach/services/selector_healer.py:122", "shortDescription": {"text": "Commented-code block (6 lines) in backend/src/outreach/services/selector_healer.py: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-319e66a630e14977", "name": "2 env vars used in code but missing from .env.example", "shortDescription": {"text": "2 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `LOCALAPPDATA`, `OUTREACH_DESTRUCTIVE_SMOKE_OK`. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-be46ea126aa5d8dc", "name": "Near-duplicate function bodies in 3 places", "shortDescription": {"text": "Near-duplicate function bodies in 3 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nscripts/smoke_m6.py:handle_DATA, scripts/smoke_m9.py:handle_DATA, scripts/smoke_m5.py:handle_DATA\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-49c98f7cedd9c977", "name": "Near-duplicate function bodies in 4 places", "shortDescription": {"text": "Near-duplicate function bodies in 4 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nscripts/smoke_m6.py:main, scripts/smoke_m9.py:main, scripts/smoke_m5.py:main, scripts/smoke_m4.py:main\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nscripts/smoke_m9.py:build_reply, scripts/smoke_m5.py:build_reply\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7062279893e90305", "name": "Frontend route `/leads/:id/timeline` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/leads/:id/timeline` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-22f0c8b2b8687114", "name": "Frontend route `/sequences/:id` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/sequences/:id` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0db83a36c29a7014", "name": "FastAPI POST `watchdog_note` without auth dependency \u2014 backend/src/outreach/api/routes_extension.py:515", "shortDescription": {"text": "FastAPI POST `watchdog_note` without auth dependency \u2014 backend/src/outreach/api/routes_extension.py:515"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`backend/src/outreach/api/routes_sequences.py` declares `GET /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7a009b1a56794f45", "name": "Unused endpoint: POST /", "shortDescription": {"text": "Unused endpoint: POST /"}, "fullDescription": {"text": "`backend/src/outreach/api/routes_sequences.py` declares `POST /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-018e153bad49b54f", "name": "Unused endpoint: GET /{sequence_id}", "shortDescription": {"text": "Unused endpoint: GET /{sequence_id}"}, "fullDescription": {"text": "`backend/src/outreach/api/routes_sequences.py` declares `GET /{sequence_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c516f14db5c99c95", "name": "Unused endpoint: PATCH /{sequence_id}", "shortDescription": {"text": "Unused endpoint: PATCH /{sequence_id}"}, "fullDescription": {"text": "`backend/src/outreach/api/routes_sequences.py` declares `PATCH /{sequence_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3081bcf449959a3c", "name": "Unused endpoint: POST /{sequence_id}/status", "shortDescription": {"text": "Unused endpoint: POST /{sequence_id}/status"}, "fullDescription": {"text": "`backend/src/outreach/api/routes_sequences.py` declares `POST /{sequence_id}/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-a0e5b9e1b01472a6", "name": "Unused endpoint: DELETE /{sequence_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{sequence_id}"}, "fullDescription": {"text": "`backend/src/outreach/api/routes_sequences.py` declares `DELETE /{sequence_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-be56b53f509f6191", "name": "Unused endpoint: POST /{sequence_id}/steps", "shortDescription": {"text": "Unused endpoint: POST /{sequence_id}/steps"}, "fullDescription": {"text": "`backend/src/outreach/api/routes_sequences.py` declares `POST /{sequence_id}/steps` 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-fa4dac35f9ac18d7", "name": "Unused endpoint: PATCH /{sequence_id}/steps/{step_id}", "shortDescription": {"text": "Unused endpoint: PATCH /{sequence_id}/steps/{step_id}"}, "fullDescription": {"text": "`backend/src/outreach/api/routes_sequences.py` declares `PATCH /{sequence_id}/steps/{step_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1a32e325e5fd306e", "name": "Unused endpoint: DELETE /{sequence_id}/steps/{step_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{sequence_id}/steps/{step_id}"}, "fullDescription": {"text": "`backend/src/outreach/api/routes_sequences.py` declares `DELETE /{sequence_id}/steps/{step_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0ce1a099d6cc68b9", "name": "Unused endpoint: POST /{sequence_id}/steps/reorder", "shortDescription": {"text": "Unused endpoint: POST /{sequence_id}/steps/reorder"}, "fullDescription": {"text": "`backend/src/outreach/api/routes_sequences.py` declares `POST /{sequence_id}/steps/reorder` 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-a3557fbd89f5b400", "name": "Unused endpoint: POST /{sequence_id}/enrol", "shortDescription": {"text": "Unused endpoint: POST /{sequence_id}/enrol"}, "fullDescription": {"text": "`backend/src/outreach/api/routes_sequences.py` declares `POST /{sequence_id}/enrol` 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-34a59d36e1b5873b", "name": "Unused endpoint: POST /upload/preview", "shortDescription": {"text": "Unused endpoint: POST /upload/preview"}, "fullDescription": {"text": "`backend/src/outreach/api/routes_leads.py` declares `POST /upload/preview` 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-1104263fb9fc6299", "name": "Unused endpoint: POST /upload/commit", "shortDescription": {"text": "Unused endpoint: POST /upload/commit"}, "fullDescription": {"text": "`backend/src/outreach/api/routes_leads.py` declares `POST /upload/commit` 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-68b3008dcf240037", "name": "Unused endpoint: DELETE /{lead_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{lead_id}"}, "fullDescription": {"text": "`backend/src/outreach/api/routes_leads.py` declares `DELETE /{lead_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3b30f4c0994a30b4", "name": "Unused endpoint: DELETE /", "shortDescription": {"text": "Unused endpoint: DELETE /"}, "fullDescription": {"text": "`backend/src/outreach/api/routes_leads.py` declares `DELETE /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bf4da92fe93096a4", "name": "Unused endpoint: GET /email/presets", "shortDescription": {"text": "Unused endpoint: GET /email/presets"}, "fullDescription": {"text": "`backend/src/outreach/api/routes_channels.py` declares `GET /email/presets` 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-046330795b9429da", "name": "Unused endpoint: POST /email/test", "shortDescription": {"text": "Unused endpoint: POST /email/test"}, "fullDescription": {"text": "`backend/src/outreach/api/routes_channels.py` declares `POST /email/test` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b0c737301aa8b493", "name": "Unused endpoint: POST /email", "shortDescription": {"text": "Unused endpoint: POST /email"}, "fullDescription": {"text": "`backend/src/outreach/api/routes_channels.py` declares `POST /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-a408c5657061ecab", "name": "Unused endpoint: POST /linkedin", "shortDescription": {"text": "Unused endpoint: POST /linkedin"}, "fullDescription": {"text": "`backend/src/outreach/api/routes_channels.py` declares `POST /linkedin` 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-627a3ba4af284151", "name": "Unused endpoint: DELETE /{channel_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{channel_id}"}, "fullDescription": {"text": "`backend/src/outreach/api/routes_channels.py` declares `DELETE /{channel_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9de97920e5c602ec", "name": "Unused endpoint: GET /{lead_id}/timeline", "shortDescription": {"text": "Unused endpoint: GET /{lead_id}/timeline"}, "fullDescription": {"text": "`backend/src/outreach/api/routes_timeline.py` declares `GET /{lead_id}/timeline` 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-24127e99f5c184fb", "name": "Unused endpoint: GET /state", "shortDescription": {"text": "Unused endpoint: GET /state"}, "fullDescription": {"text": "`backend/src/outreach/api/routes_watchdog.py` declares `GET /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}}, {"id": "scanner-7b74bc933163caea", "name": "Unused endpoint: POST /run/{tier}", "shortDescription": {"text": "Unused endpoint: POST /run/{tier}"}, "fullDescription": {"text": "`backend/src/outreach/api/routes_watchdog.py` declares `POST /run/{tier}` 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-82960bb97cd011cc", "name": "Unused endpoint: POST /circuit-breaker/reset", "shortDescription": {"text": "Unused endpoint: POST /circuit-breaker/reset"}, "fullDescription": {"text": "`backend/src/outreach/api/routes_watchdog.py` declares `POST /circuit-breaker/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-3d34662c69365ec5", "name": "Unused endpoint: GET /heartbeat", "shortDescription": {"text": "Unused endpoint: GET /heartbeat"}, "fullDescription": {"text": "`backend/src/outreach/api/routes_extension.py` declares `GET /heartbeat` 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-f267cc6244ff132b", "name": "Unused endpoint: GET /campaigns", "shortDescription": {"text": "Unused endpoint: GET /campaigns"}, "fullDescription": {"text": "`backend/src/outreach/api/routes_extension.py` declares `GET /campaigns` 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-6eb19a2be7a6629c", "name": "Unused endpoint: GET /leads", "shortDescription": {"text": "Unused endpoint: GET /leads"}, "fullDescription": {"text": "`backend/src/outreach/api/routes_extension.py` declares `GET /leads` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2a366262a6be358f", "name": "Unused endpoint: GET /activity", "shortDescription": {"text": "Unused endpoint: GET /activity"}, "fullDescription": {"text": "`backend/src/outreach/api/routes_extension.py` declares `GET /activity` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f0631cd5abf2e107", "name": "Unused endpoint: GET /next-command", "shortDescription": {"text": "Unused endpoint: GET /next-command"}, "fullDescription": {"text": "`backend/src/outreach/api/routes_extension.py` declares `GET /next-command` 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-63564560efc758d0", "name": "Unused endpoint: POST /commands/{cmd_id}/complete", "shortDescription": {"text": "Unused endpoint: POST /commands/{cmd_id}/complete"}, "fullDescription": {"text": "`backend/src/outreach/api/routes_extension.py` declares `POST /commands/{cmd_id}/complete` 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-0cf6dcf8e144aa92", "name": "Unused endpoint: POST /heal-selector", "shortDescription": {"text": "Unused endpoint: POST /heal-selector"}, "fullDescription": {"text": "`backend/src/outreach/api/routes_extension.py` declares `POST /heal-selector` 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-296cda53b644f2cb", "name": "Unused endpoint: POST /watchdog-note", "shortDescription": {"text": "Unused endpoint: POST /watchdog-note"}, "fullDescription": {"text": "`backend/src/outreach/api/routes_extension.py` declares `POST /watchdog-note` 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-6fbd633ffaa9b6ba", "name": "Unused endpoint: POST /connections-seen", "shortDescription": {"text": "Unused endpoint: POST /connections-seen"}, "fullDescription": {"text": "`backend/src/outreach/api/routes_extension.py` declares `POST /connections-seen` 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-a9948208e439b57a", "name": "Unused endpoint: POST /replies", "shortDescription": {"text": "Unused endpoint: POST /replies"}, "fullDescription": {"text": "`backend/src/outreach/api/routes_extension.py` declares `POST /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-e1b7bee247ffc801", "name": "Unused endpoint: GET /summary", "shortDescription": {"text": "Unused endpoint: GET /summary"}, "fullDescription": {"text": "`backend/src/outreach/api/routes_dashboard.py` declares `GET /summary` 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-fa2d7ca5588cacc3", "name": "Unused endpoint: GET /sentiment-timeseries", "shortDescription": {"text": "Unused endpoint: GET /sentiment-timeseries"}, "fullDescription": {"text": "`backend/src/outreach/api/routes_dashboard.py` declares `GET /sentiment-timeseries` 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-d2c2a4a40745084f", "name": "Unused endpoint: GET /sequences", "shortDescription": {"text": "Unused endpoint: GET /sequences"}, "fullDescription": {"text": "`backend/src/outreach/api/routes_dashboard.py` declares `GET /sequences` 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-e2ffe3f313cfcbe4", "name": "Unused endpoint: GET /hot-leads", "shortDescription": {"text": "Unused endpoint: GET /hot-leads"}, "fullDescription": {"text": "`backend/src/outreach/api/routes_dashboard.py` declares `GET /hot-leads` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-244e3a049a9138e7", "name": "Unused endpoint: GET /at-risk", "shortDescription": {"text": "Unused endpoint: GET /at-risk"}, "fullDescription": {"text": "`backend/src/outreach/api/routes_dashboard.py` declares `GET /at-risk` 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-29d17450d20db711", "name": "Unused endpoint: POST /draft", "shortDescription": {"text": "Unused endpoint: POST /draft"}, "fullDescription": {"text": "`backend/src/outreach/api/routes_followups.py` declares `POST /draft` 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-2f222a275ed687b3", "name": "Unused endpoint: POST /send", "shortDescription": {"text": "Unused endpoint: POST /send"}, "fullDescription": {"text": "`backend/src/outreach/api/routes_followups.py` declares `POST /send` 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-39994bd1f4366bdf", "name": "Unused endpoint: GET /sequences/{sequence_id}/enrolments", "shortDescription": {"text": "Unused endpoint: GET /sequences/{sequence_id}/enrolments"}, "fullDescription": {"text": "`backend/src/outreach/api/routes_enrolments.py` declares `GET /sequences/{sequence_id}/enrolments` 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-b66730655279908f", "name": "Unused endpoint: POST /enrolments/{enrolment_id}/pause", "shortDescription": {"text": "Unused endpoint: POST /enrolments/{enrolment_id}/pause"}, "fullDescription": {"text": "`backend/src/outreach/api/routes_enrolments.py` declares `POST /enrolments/{enrolment_id}/pause` 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-e5d9f598525b34d4", "name": "Unused endpoint: POST /enrolments/{enrolment_id}/resume", "shortDescription": {"text": "Unused endpoint: POST /enrolments/{enrolment_id}/resume"}, "fullDescription": {"text": "`backend/src/outreach/api/routes_enrolments.py` declares `POST /enrolments/{enrolment_id}/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-ad2f843406ff8d6b", "name": "Unused endpoint: POST /enrolments/{enrolment_id}/stop", "shortDescription": {"text": "Unused endpoint: POST /enrolments/{enrolment_id}/stop"}, "fullDescription": {"text": "`backend/src/outreach/api/routes_enrolments.py` declares `POST /enrolments/{enrolment_id}/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}}]}}, "automationDetails": {"id": "repobility/22242"}, "properties": {"repository": "Vimarsh-Coherent/outreach", "repoUrl": "https://github.com/Vimarsh-Coherent/outreach", "branch": "main"}, "results": [{"ruleId": "scanner-864f1e314f52dd6e", "level": "note", "message": {"text": "Possibly dead Python function: handle_DATA"}, "properties": {"repobilityId": "72d8301ebdc19fa9", "scanner": "scanner-primary", "fingerprint": "864f1e314f52dd6e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/smoke_m6.py:81"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a5960c8de3af4089", "level": "note", "message": {"text": "Possibly dead Python function: handle_DATA"}, "properties": {"repobilityId": "72d8301ebdc19fa9", "scanner": "scanner-primary", "fingerprint": "a5960c8de3af4089", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/smoke_m9.py:43"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7a14a09e447f5250", "level": "note", "message": {"text": "Possibly dead Python function: handle_DATA"}, "properties": {"repobilityId": "72d8301ebdc19fa9", "scanner": "scanner-primary", "fingerprint": "7a14a09e447f5250", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/smoke_m5.py:50"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-fdbfcf27bfbcd651", "level": "note", "message": {"text": "Possibly dead Python function: handle_DATA"}, "properties": {"repobilityId": "72d8301ebdc19fa9", "scanner": "scanner-primary", "fingerprint": "fdbfcf27bfbcd651", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/smoke_m4.py:45"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-32ac9bb21f37f799", "level": "note", "message": {"text": "Possibly dead Python function: include_object"}, "properties": {"repobilityId": "425a5e67292c778e", "scanner": "scanner-primary", "fingerprint": "32ac9bb21f37f799", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/env.py:21"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c0aec69763340904", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "c0aec69763340904", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/0001_initial.py:21"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-cd780ba54291030d", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "cd780ba54291030d", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/0001_initial.py:297"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-05effa3a725d7fd5", "level": "note", "message": {"text": "Possibly dead Python function: sweep"}, "properties": {"repobilityId": "f9a1954828cce24b", "scanner": "scanner-primary", "fingerprint": "05effa3a725d7fd5", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/outreach/workers/recovery.py:29"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-915d39f0f295d7b7", "level": "note", "message": {"text": "Possibly dead Python function: poll_all"}, "properties": {"repobilityId": "0c8e15bab12275cd", "scanner": "scanner-primary", "fingerprint": "915d39f0f295d7b7", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/outreach/workers/imap_poller.py:130"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0da86166aaad55d0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 extension/background.js:21"}, "properties": {"repobilityId": "e037ad0456203f49", "scanner": "scanner-primary", "fingerprint": "0da86166aaad55d0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-510aca18d2229c22", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 extension/content_linkedin.js:10"}, "properties": {"repobilityId": "15d7fb7f2211ce81", "scanner": "scanner-primary", "fingerprint": "510aca18d2229c22", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5f37463cf33d6b6d", "level": "warning", "message": {"text": "Privileged port 587 in use"}, "properties": {"repobilityId": "a87a96c3b2e62c08", "scanner": "scanner-primary", "fingerprint": "5f37463cf33d6b6d", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/pages/Channels.tsx"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f84f6ca600e39425", "level": "warning", "message": {"text": "Privileged port 993 in use"}, "properties": {"repobilityId": "a36e56a26353e9ee", "scanner": "scanner-primary", "fingerprint": "f84f6ca600e39425", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/pages/Channels.tsx"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-05e85697574c8388", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in extension/content_linkedin.js:153"}, "properties": {"repobilityId": "3c2e2f5061f258b4", "scanner": "scanner-primary", "fingerprint": "05e85697574c8388", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "extension/content_linkedin.js"}, "region": {"startLine": 153}}}]}, {"ruleId": "scanner-06bd11cbfc81502c", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in extension/sidepanel.js:25"}, "properties": {"repobilityId": "db1bfba6ef39e3c3", "scanner": "scanner-primary", "fingerprint": "06bd11cbfc81502c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "extension/sidepanel.js"}, "region": {"startLine": 25}}}]}, {"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-13837d323fbe4d7d", "level": "note", "message": {"text": "Very large file: extension/content_linkedin.js (1520 lines)"}, "properties": {"repobilityId": "b3d20e1251bd6c4d", "scanner": "scanner-primary", "fingerprint": "13837d323fbe4d7d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "4b9b82cdef46bf36", "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": "5ffdbd0f832b667a", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "cc302f784d826f9a", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "e4d20df8c66306fc", "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": "8cc0e801c9001c64", "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": "3b3003c4473b53dd", "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": "44e3a12343d9d29a", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-f64a48d59b71fceb", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 agent/coherent_agent.py:123"}, "properties": {"repobilityId": "2c7dbf01e569cbee", "scanner": "scanner-primary", "fingerprint": "f64a48d59b71fceb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6f0689c04f39e3a8", "level": "none", "message": {"text": "Commented-code block (7 lines) in extension/background.js:9"}, "properties": {"repobilityId": "83af181658a41be4", "scanner": "scanner-primary", "fingerprint": "6f0689c04f39e3a8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bf59776dc8aae79f", "level": "none", "message": {"text": "Commented-code block (11 lines) in extension/content_linkedin.js:44"}, "properties": {"repobilityId": "cc2f83dba34af03e", "scanner": "scanner-primary", "fingerprint": "bf59776dc8aae79f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dbdfae8614aa84fd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 extension/sidepanel.js:17"}, "properties": {"repobilityId": "2fe52a2ae565a964", "scanner": "scanner-primary", "fingerprint": "dbdfae8614aa84fd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2e40a1f6210e6466", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/src/outreach/config.py:40"}, "properties": {"repobilityId": "48a2d0ee8e1b98eb", "scanner": "scanner-primary", "fingerprint": "2e40a1f6210e6466", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5a92a02586e7f32b", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/src/outreach/api/routes_extension.py:46"}, "properties": {"repobilityId": "44f09645b1481bca", "scanner": "scanner-primary", "fingerprint": "5a92a02586e7f32b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a7456f0a5ec4f546", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/src/outreach/api/routes_followups.py:113"}, "properties": {"repobilityId": "58ebc396667696cd", "scanner": "scanner-primary", "fingerprint": "a7456f0a5ec4f546", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e4eaad89d6039e3b", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/src/outreach/workers/dispatcher.py:217"}, "properties": {"repobilityId": "3c97594a225acbc7", "scanner": "scanner-primary", "fingerprint": "e4eaad89d6039e3b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6dcb2f5107a73e33", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/src/outreach/workers/watchdog.py:244"}, "properties": {"repobilityId": "203744c8541fcdfa", "scanner": "scanner-primary", "fingerprint": "6dcb2f5107a73e33", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c43d6ccd75bf5ef0", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/src/outreach/services/selector_healer.py:122"}, "properties": {"repobilityId": "322ca32e618cd3f0", "scanner": "scanner-primary", "fingerprint": "c43d6ccd75bf5ef0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-319e66a630e14977", "level": "none", "message": {"text": "2 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "d838d1fc5d8231c9", "scanner": "scanner-primary", "fingerprint": "319e66a630e14977", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "953c09736b5bbcf9", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "1bfca395b27b8300", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "05610de262c54f71", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "1b48806785ac50b3", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "476486bf0d8325de", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-7062279893e90305", "level": "warning", "message": {"text": "Frontend route `/leads/:id/timeline` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "d7d134b0125332cf", "scanner": "scanner-primary", "fingerprint": "7062279893e90305", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-22f0c8b2b8687114", "level": "warning", "message": {"text": "Frontend route `/sequences/:id` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "a30cb83170003b2d", "scanner": "scanner-primary", "fingerprint": "22f0c8b2b8687114", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-0db83a36c29a7014", "level": "error", "message": {"text": "FastAPI POST `watchdog_note` without auth dependency \u2014 backend/src/outreach/api/routes_extension.py:515"}, "properties": {"repobilityId": "cddb75876d2aaba3", "scanner": "scanner-primary", "fingerprint": "0db83a36c29a7014", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/outreach/api/routes_extension.py"}, "region": {"startLine": 515}}}]}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "dc7396dd41e1fe26", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a009b1a56794f45", "level": "note", "message": {"text": "Unused endpoint: POST /"}, "properties": {"repobilityId": "9bdd6674f12234a6", "scanner": "scanner-primary", "fingerprint": "7a009b1a56794f45", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-018e153bad49b54f", "level": "note", "message": {"text": "Unused endpoint: GET /{sequence_id}"}, "properties": {"repobilityId": "45a9224bfd8c01d1", "scanner": "scanner-primary", "fingerprint": "018e153bad49b54f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c516f14db5c99c95", "level": "note", "message": {"text": "Unused endpoint: PATCH /{sequence_id}"}, "properties": {"repobilityId": "1423a36c860e18bf", "scanner": "scanner-primary", "fingerprint": "c516f14db5c99c95", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3081bcf449959a3c", "level": "note", "message": {"text": "Unused endpoint: POST /{sequence_id}/status"}, "properties": {"repobilityId": "230502dccbccccb1", "scanner": "scanner-primary", "fingerprint": "3081bcf449959a3c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a0e5b9e1b01472a6", "level": "note", "message": {"text": "Unused endpoint: DELETE /{sequence_id}"}, "properties": {"repobilityId": "95aaeb97b2705c5c", "scanner": "scanner-primary", "fingerprint": "a0e5b9e1b01472a6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-be56b53f509f6191", "level": "note", "message": {"text": "Unused endpoint: POST /{sequence_id}/steps"}, "properties": {"repobilityId": "1652246d6d00793d", "scanner": "scanner-primary", "fingerprint": "be56b53f509f6191", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fa4dac35f9ac18d7", "level": "note", "message": {"text": "Unused endpoint: PATCH /{sequence_id}/steps/{step_id}"}, "properties": {"repobilityId": "e8fed8f8aa1cbe94", "scanner": "scanner-primary", "fingerprint": "fa4dac35f9ac18d7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1a32e325e5fd306e", "level": "note", "message": {"text": "Unused endpoint: DELETE /{sequence_id}/steps/{step_id}"}, "properties": {"repobilityId": "10012d5a1ab4547a", "scanner": "scanner-primary", "fingerprint": "1a32e325e5fd306e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0ce1a099d6cc68b9", "level": "note", "message": {"text": "Unused endpoint: POST /{sequence_id}/steps/reorder"}, "properties": {"repobilityId": "e03de21567e35bbc", "scanner": "scanner-primary", "fingerprint": "0ce1a099d6cc68b9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a3557fbd89f5b400", "level": "note", "message": {"text": "Unused endpoint: POST /{sequence_id}/enrol"}, "properties": {"repobilityId": "f168cb9bca4a60d1", "scanner": "scanner-primary", "fingerprint": "a3557fbd89f5b400", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-34a59d36e1b5873b", "level": "note", "message": {"text": "Unused endpoint: POST /upload/preview"}, "properties": {"repobilityId": "1611d7a6597ff355", "scanner": "scanner-primary", "fingerprint": "34a59d36e1b5873b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1104263fb9fc6299", "level": "note", "message": {"text": "Unused endpoint: POST /upload/commit"}, "properties": {"repobilityId": "65e59e037e7ada1f", "scanner": "scanner-primary", "fingerprint": "1104263fb9fc6299", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-68b3008dcf240037", "level": "note", "message": {"text": "Unused endpoint: DELETE /{lead_id}"}, "properties": {"repobilityId": "2358a11e9762d7dd", "scanner": "scanner-primary", "fingerprint": "68b3008dcf240037", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3b30f4c0994a30b4", "level": "note", "message": {"text": "Unused endpoint: DELETE /"}, "properties": {"repobilityId": "6315b390df063a97", "scanner": "scanner-primary", "fingerprint": "3b30f4c0994a30b4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bf4da92fe93096a4", "level": "note", "message": {"text": "Unused endpoint: GET /email/presets"}, "properties": {"repobilityId": "c5c7b40f6b0dbe6e", "scanner": "scanner-primary", "fingerprint": "bf4da92fe93096a4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-046330795b9429da", "level": "note", "message": {"text": "Unused endpoint: POST /email/test"}, "properties": {"repobilityId": "447b0ccbd262d98d", "scanner": "scanner-primary", "fingerprint": "046330795b9429da", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b0c737301aa8b493", "level": "note", "message": {"text": "Unused endpoint: POST /email"}, "properties": {"repobilityId": "7c4e48abf0ec3ee2", "scanner": "scanner-primary", "fingerprint": "b0c737301aa8b493", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a408c5657061ecab", "level": "note", "message": {"text": "Unused endpoint: POST /linkedin"}, "properties": {"repobilityId": "94e8b1e6d7ec60f5", "scanner": "scanner-primary", "fingerprint": "a408c5657061ecab", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-627a3ba4af284151", "level": "note", "message": {"text": "Unused endpoint: DELETE /{channel_id}"}, "properties": {"repobilityId": "0056ecced837de98", "scanner": "scanner-primary", "fingerprint": "627a3ba4af284151", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9de97920e5c602ec", "level": "note", "message": {"text": "Unused endpoint: GET /{lead_id}/timeline"}, "properties": {"repobilityId": "840f27e879785194", "scanner": "scanner-primary", "fingerprint": "9de97920e5c602ec", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-24127e99f5c184fb", "level": "note", "message": {"text": "Unused endpoint: GET /state"}, "properties": {"repobilityId": "72f862375f63940d", "scanner": "scanner-primary", "fingerprint": "24127e99f5c184fb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7b74bc933163caea", "level": "note", "message": {"text": "Unused endpoint: POST /run/{tier}"}, "properties": {"repobilityId": "cb21c2b74f7e338a", "scanner": "scanner-primary", "fingerprint": "7b74bc933163caea", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-82960bb97cd011cc", "level": "note", "message": {"text": "Unused endpoint: POST /circuit-breaker/reset"}, "properties": {"repobilityId": "32ac0188f454b584", "scanner": "scanner-primary", "fingerprint": "82960bb97cd011cc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3d34662c69365ec5", "level": "note", "message": {"text": "Unused endpoint: GET /heartbeat"}, "properties": {"repobilityId": "a534a29d0a903ac9", "scanner": "scanner-primary", "fingerprint": "3d34662c69365ec5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f267cc6244ff132b", "level": "note", "message": {"text": "Unused endpoint: GET /campaigns"}, "properties": {"repobilityId": "583d71cf5463af6c", "scanner": "scanner-primary", "fingerprint": "f267cc6244ff132b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6eb19a2be7a6629c", "level": "note", "message": {"text": "Unused endpoint: GET /leads"}, "properties": {"repobilityId": "38160180610401e0", "scanner": "scanner-primary", "fingerprint": "6eb19a2be7a6629c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2a366262a6be358f", "level": "note", "message": {"text": "Unused endpoint: GET /activity"}, "properties": {"repobilityId": "76e51ff7ccf187ec", "scanner": "scanner-primary", "fingerprint": "2a366262a6be358f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f0631cd5abf2e107", "level": "note", "message": {"text": "Unused endpoint: GET /next-command"}, "properties": {"repobilityId": "80c3955406ea3f43", "scanner": "scanner-primary", "fingerprint": "f0631cd5abf2e107", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-63564560efc758d0", "level": "note", "message": {"text": "Unused endpoint: POST /commands/{cmd_id}/complete"}, "properties": {"repobilityId": "9ae02171930c847e", "scanner": "scanner-primary", "fingerprint": "63564560efc758d0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0cf6dcf8e144aa92", "level": "note", "message": {"text": "Unused endpoint: POST /heal-selector"}, "properties": {"repobilityId": "143d0019ec26ecef", "scanner": "scanner-primary", "fingerprint": "0cf6dcf8e144aa92", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-296cda53b644f2cb", "level": "note", "message": {"text": "Unused endpoint: POST /watchdog-note"}, "properties": {"repobilityId": "c5509cf7b6e4c773", "scanner": "scanner-primary", "fingerprint": "296cda53b644f2cb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6fbd633ffaa9b6ba", "level": "note", "message": {"text": "Unused endpoint: POST /connections-seen"}, "properties": {"repobilityId": "5a6ed5696f182dc9", "scanner": "scanner-primary", "fingerprint": "6fbd633ffaa9b6ba", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a9948208e439b57a", "level": "note", "message": {"text": "Unused endpoint: POST /replies"}, "properties": {"repobilityId": "5992906057afe2c1", "scanner": "scanner-primary", "fingerprint": "a9948208e439b57a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e1b7bee247ffc801", "level": "note", "message": {"text": "Unused endpoint: GET /summary"}, "properties": {"repobilityId": "0905e1914bbea955", "scanner": "scanner-primary", "fingerprint": "e1b7bee247ffc801", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fa2d7ca5588cacc3", "level": "note", "message": {"text": "Unused endpoint: GET /sentiment-timeseries"}, "properties": {"repobilityId": "45c3d63e2abe7007", "scanner": "scanner-primary", "fingerprint": "fa2d7ca5588cacc3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d2c2a4a40745084f", "level": "note", "message": {"text": "Unused endpoint: GET /sequences"}, "properties": {"repobilityId": "3377f4dcc86d9b7b", "scanner": "scanner-primary", "fingerprint": "d2c2a4a40745084f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e2ffe3f313cfcbe4", "level": "note", "message": {"text": "Unused endpoint: GET /hot-leads"}, "properties": {"repobilityId": "3eed4220efab724a", "scanner": "scanner-primary", "fingerprint": "e2ffe3f313cfcbe4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-244e3a049a9138e7", "level": "note", "message": {"text": "Unused endpoint: GET /at-risk"}, "properties": {"repobilityId": "cc7211f005825fa9", "scanner": "scanner-primary", "fingerprint": "244e3a049a9138e7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-29d17450d20db711", "level": "note", "message": {"text": "Unused endpoint: POST /draft"}, "properties": {"repobilityId": "18bf7f315be00be6", "scanner": "scanner-primary", "fingerprint": "29d17450d20db711", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2f222a275ed687b3", "level": "note", "message": {"text": "Unused endpoint: POST /send"}, "properties": {"repobilityId": "a5dd505e0285660f", "scanner": "scanner-primary", "fingerprint": "2f222a275ed687b3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-39994bd1f4366bdf", "level": "note", "message": {"text": "Unused endpoint: GET /sequences/{sequence_id}/enrolments"}, "properties": {"repobilityId": "30185bec99ef2aa0", "scanner": "scanner-primary", "fingerprint": "39994bd1f4366bdf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b66730655279908f", "level": "note", "message": {"text": "Unused endpoint: POST /enrolments/{enrolment_id}/pause"}, "properties": {"repobilityId": "78c013fdafce74cd", "scanner": "scanner-primary", "fingerprint": "b66730655279908f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e5d9f598525b34d4", "level": "note", "message": {"text": "Unused endpoint: POST /enrolments/{enrolment_id}/resume"}, "properties": {"repobilityId": "c5884e2fe4bfcd4e", "scanner": "scanner-primary", "fingerprint": "e5d9f598525b34d4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ad2f843406ff8d6b", "level": "note", "message": {"text": "Unused endpoint: POST /enrolments/{enrolment_id}/stop"}, "properties": {"repobilityId": "5879b4cea802e0b3", "scanner": "scanner-primary", "fingerprint": "ad2f843406ff8d6b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}