{"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": "foundry_assumption_check", "name": "Foundry mined assumption checks: sskorohod/caller", "shortDescription": {"text": "Foundry mined assumption checks: sskorohod/caller"}, "fullDescription": {"text": "Comment chain pattern product: assumption_checks\nRepo: sskorohod/caller\nThread: sskorohod/caller#1\nOutcome: claimed_resolved_unverified\nThread label: thread_has_human_issue_and_fix_context\nSource graph label: source_backed_multi_signal_graph\nReasons: source_graph_has_real_artifacts, source_graph_has_verification_artifacts, repo_has_isolated_helicopter_views, link_quality_high_confidence, high_risk_human_feedback_label\nChain evidence:\nIssue/PR evidence chain: sskorohod/caller#1\nRepo: sskorohod/caller\nThread label: thread_has_human_issue_and_fix_context\nOutcome: claimed_resolved_unverified\nComment count: 1\nLinked commit count: 5\nLinked CI commit count: 0\nLinked CI labels: {}\nChanged file count: 3\nLabels: {'data_schema_persistence': 1}\nPolarities: {'bad': 1}\nChanged file labels: {'schema_or_data': 2, 'api_or_backend': 1}\nExamples:\n[\n  {\n    \"id\": \"github-feedback-comment-67e6ea35de336965\",\n    \"kind\": \"pull_request_body\",\n    \"label\": \"data_schema_persistence\",\n    \"polarity\": \"bad\",\n    "}, "properties": {"scanner": "foundry_dataset", "category": "practices", "severity": "medium", "confidence": 0.62, "cwe": "", "owasp": ""}}, {"id": "foundry_schema_ui_api_gap", "name": "Foundry mined schema ui api mismatch: sskorohod/caller", "shortDescription": {"text": "Foundry mined schema ui api mismatch: sskorohod/caller"}, "fullDescription": {"text": "Graph query export: Schema, UI, and API mismatch\nQuery id: schema_ui_api_mismatch\nQuery type: motif_query\nIntent: Assumption-check examples for data-path consistency across layers.\nMotif: schema_ui_api_mismatch\nTraining usage: assumption_check\nGraph gold label: supported_by_high_confidence_link\nRepo: sskorohod/caller\nThread: sskorohod/caller#1\nEvidence:\nGraph motif: Schema, UI, and API evidence do not line up\nMotif id: schema_ui_api_mismatch\nPolarity: bad\nTraining usage: assumption_check\nSeverity: high\nRepo: sskorohod/caller\nThread: sskorohod/caller#1\nGraph gold label: supported_by_high_confidence_link\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: sskorohod/caller#1\nRepo: sskorohod/caller\nIssue/PR number: 1\nGraph consistency label: supported_by_high_confidence_link\nNodes: 17\nEdges: 25\nNode types: {'commit': 5, 'pr_file': 3, 'link_quality': 3, 'thread': 1, 'repo': 1, 'comment': 1, 'comment_chain': 1, 'issue_chain': 1, 'fix_outcome': 1}\nEdge types: {'comment_chain_link"}, "properties": {"scanner": "foundry_dataset", "category": "quality", "severity": "high", "confidence": 0.76, "cwe": "", "owasp": ""}}, {"id": "scanner-d19d8e3d14fe8ac5", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/components/BottomTabBar.tsx:132", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/components/BottomTabBar.tsx:132"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-deaa47644891b958", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/components/IncomingCallCard.tsx:155", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/components/IncomingCallCard.tsx:155"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-35782dd35ea09306", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/frontend/src/components/JsonLd.tsx:13", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/frontend/src/components/JsonLd.tsx:13"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e3574ee5b096790e", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/components/MobilePageHeader.tsx:28", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/components/MobilePageHeader.tsx:28"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-76d8c92c98791c6c", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/components/CollapsibleSection.tsx:38", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/components/CollapsibleSection.tsx:38"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9045fdf208dd7eb5", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/frontend/src/app/layout.tsx:73", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/frontend/src/app/layout.tsx:73"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f99e0719ade7038e", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/dashboard/layout.tsx:85", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/dashboard/layout.tsx:85"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7d191c5a5f616a08", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/dashboard/settings/_components/SettingsNa", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/dashboard/settings/_components/SettingsNav.tsx:64"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-24af24e7c2ed5314", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/dashboard/settings/_components/GeneralSec", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/dashboard/settings/_components/GeneralSection.tsx:67"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-839324dcba7924cb", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/dashboard/help/_components/SupportChat.ts", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/dashboard/help/_components/SupportChat.tsx:163"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-aa3ed3def9de7622", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/frontend/src/app/dashboard/help/_components/HelpArticle.t", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/frontend/src/app/dashboard/help/_components/HelpArticle.tsx:19"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-262424aef3f641ca", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/dashboard/help/_components/HelpSidebar.ts", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/dashboard/help/_components/HelpSidebar.tsx:66"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9ecca3725befafc6", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/dashboard/billing/_components/Transaction", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/dashboard/billing/_components/TransactionHistory.tsx:81"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7945803c4e7af4c6", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/dashboard/calls/page.tsx:139", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/dashboard/calls/page.tsx:139"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1f369d9b599026d6", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/dashboard/calls/[id]/translate/page.tsx:1", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/dashboard/calls/[id]/translate/page.tsx:192"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2b6f6b814b06ad45", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/dashboard/_components/RecentCallsTable.ts", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/dashboard/_components/RecentCallsTable.tsx:62"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a9f5e83f337dd306", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/oauth/authorize/page.tsx:170", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/oauth/authorize/page.tsx:170"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-169f02d9d41bcdbe", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/admin/settings/page.tsx:320", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/admin/settings/page.tsx:320"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5d2d5a955e88cafc", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/admin/workspaces/page.tsx:243", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/admin/workspaces/page.tsx:243"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e4d776c2ffa63b15", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/admin/audit/page.tsx:86", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/admin/audit/page.tsx:86"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b57536da3a61d045", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/admin/finance/page.tsx:160", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/admin/finance/page.tsx:160"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-02ea789340b4fdbb", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/admin/tickets/page.tsx:118", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/admin/tickets/page.tsx:118"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e34d45b367717ac9", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/admin/contacts/page.tsx:87", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/admin/contacts/page.tsx:87"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b19c4a12f4f1e81e", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/admin/_components/AdminLivePanel.tsx:76", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/admin/_components/AdminLivePanel.tsx:76"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0d29d03b6297a5fe", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/admin/_components/AdminHealthBlock.tsx:11", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/admin/_components/AdminHealthBlock.tsx:110"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-48047d11837e2de3", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/calls/[id]/monitor/page.tsx:169", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/calls/[id]/monitor/page.tsx:169"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-de527a276ff65f34", "name": "Stray `console.log` in TS/JS \u2014 packages/frontend/src/lib/socket.tsx:27", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/frontend/src/lib/socket.tsx:27"}, "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-f3126e64f1179393", "name": "Stray `console.log` in TS/JS \u2014 packages/backend/src/migrate.ts:27", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/backend/src/migrate.ts:27"}, "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-a2d59964771165de", "name": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8448aae02c8b5688", "name": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-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-f61e9aef75c40a4e", "name": "Insecure pattern 'dangerous_innerhtml' in packages/frontend/src/components/JsonLd.tsx:13", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in packages/frontend/src/components/JsonLd.tsx:13"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b23776f3c671c6df", "name": "Insecure pattern 'dangerous_innerhtml' in packages/frontend/src/app/layout.tsx:73", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in packages/frontend/src/app/layout.tsx:73"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0672d5fcf0768bfb", "name": "Insecure pattern 'local_storage_auth_token' in packages/frontend/src/app/translator/portal/page.tsx:105", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in packages/frontend/src/app/translator/portal/page.tsx:105"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e113e0f639c3ac32", "name": "Insecure pattern 'local_storage_auth_token' in packages/frontend/src/app/auth/verify/page.tsx:37", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in packages/frontend/src/app/auth/verify/page.tsx:37"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e928b1deac9d09cd", "name": "Insecure pattern 'dangerous_innerhtml' in packages/frontend/src/app/dashboard/help/_components/HelpArticle.tsx:19", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in packages/frontend/src/app/dashboard/help/_components/HelpArticle.tsx:19"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a826f69d4003eea3", "name": "Insecure pattern 'local_storage_auth_token' in packages/frontend/src/lib/auth-context.tsx:39", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in packages/frontend/src/lib/auth-context.tsx:39"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). 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-a0b5df21464e23d9", "name": "Very large file: packages/frontend/src/app/translator/TranslatorPageClient.tsx (1015 lines)", "shortDescription": {"text": "Very large file: packages/frontend/src/app/translator/TranslatorPageClient.tsx (1015 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-3034b9e27d512538", "name": "Very large file: packages/frontend/src/app/dashboard/dialer/page.tsx (1030 lines)", "shortDescription": {"text": "Very large file: packages/frontend/src/app/dashboard/dialer/page.tsx (1030 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-31e7055dd826b4e3", "name": "Very large file: packages/frontend/src/app/dashboard/calls/page.tsx (945 lines)", "shortDescription": {"text": "Very large file: packages/frontend/src/app/dashboard/calls/page.tsx (945 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-d66abe4a4a3d6d03", "name": "Very large file: packages/frontend/src/lib/i18n/ru.ts (1091 lines)", "shortDescription": {"text": "Very large file: packages/frontend/src/lib/i18n/ru.ts (1091 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-82e44987277f3ef8", "name": "Very large file: packages/backend/src/routes/admin/index.ts (1255 lines)", "shortDescription": {"text": "Very large file: packages/backend/src/routes/admin/index.ts (1255 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-b0a662fe7d31f91b", "name": "Very large file: packages/backend/src/routes/webhooks/media-stream.ts (1146 lines)", "shortDescription": {"text": "Very large file: packages/backend/src/routes/webhooks/media-stream.ts (1146 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-b1999318b7c18c1e", "name": "Very large file: packages/backend/src/services/conference-translator.ts (1420 lines)", "shortDescription": {"text": "Very large file: packages/backend/src/services/conference-translator.ts (1420 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "0 test file(s) for 263 source file(s) (ratio 0.00). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-faccb9061e9b52a0", "name": "No README detected", "shortDescription": {"text": "No README detected"}, "fullDescription": {"text": "No README file was found. Generated repos without README context are hard to operate, validate, or safely hand off."}, "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 10 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 80 placeholder/mock markers across 27 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9d79c4077342a7d0", "name": "Runtime service client appears to use placeholder configuration", "shortDescription": {"text": "Runtime service client appears to use placeholder configuration"}, "fullDescription": {"text": "A runtime source file appears to wire Supabase/Firebase/AI/payment-style clients to placeholder URLs, keys, or fallback values. In the Fable corpus this often means the UI/API shape is present while the backend service is not actually configured."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci, tests, operator-readme. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci, tests, operator-readme. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2c5f98b152cddb6d", "name": "Agent authority lacks a verifier contract: .claude/launch.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/launch.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4a4e3615d8ad1af9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/frontend/src/app/translator/portal/page.tsx:101", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/frontend/src/app/translator/portal/page.tsx:101"}, "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-3335c231ac4b0ec2", "name": "Commented-code block (5 lines) in packages/frontend/src/app/translate/[token]/page.tsx:146", "shortDescription": {"text": "Commented-code block (5 lines) in packages/frontend/src/app/translate/[token]/page.tsx:146"}, "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-6f1feb73b21e924e", "name": "Commented-code block (9 lines) in packages/frontend/src/app/dashboard/settings/_components/GeneralSection.tsx:164", "shortDescription": {"text": "Commented-code block (9 lines) in packages/frontend/src/app/dashboard/settings/_components/GeneralSection.tsx:164"}, "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-6bbbea037235401a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/frontend/src/app/calls/[id]/monitor/page.tsx:48", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/frontend/src/app/calls/[id]/monitor/page.tsx:48"}, "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-5190e91b272af8f1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/frontend/src/lib/api.ts:33", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/frontend/src/lib/api.ts:33"}, "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-8a94713bdb0c0fa5", "name": "Commented-code block (5 lines) in packages/frontend/src/lib/use-sandbox-audio.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in packages/frontend/src/lib/use-sandbox-audio.ts:4"}, "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-4991de79b3d3f588", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/frontend/src/lib/use-twilio-device.ts:23", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/frontend/src/lib/use-twilio-device.ts:23"}, "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-d1fa000da2af9afc", "name": "Commented-code block (6 lines) in packages/backend/src/server.ts:24", "shortDescription": {"text": "Commented-code block (6 lines) in packages/backend/src/server.ts:24"}, "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-b53f76e47fdc93a6", "name": "Commented-code block (5 lines) in packages/backend/src/middleware/auth.ts:79", "shortDescription": {"text": "Commented-code block (5 lines) in packages/backend/src/middleware/auth.ts:79"}, "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-8a5731433be9dca1", "name": "Commented-code block (5 lines) in packages/backend/src/routes/auth/session.ts:275", "shortDescription": {"text": "Commented-code block (5 lines) in packages/backend/src/routes/auth/session.ts:275"}, "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-34bb6766aabeb9f7", "name": "Commented-code block (5 lines) in packages/backend/src/routes/workspaces/index.ts:86", "shortDescription": {"text": "Commented-code block (5 lines) in packages/backend/src/routes/workspaces/index.ts:86"}, "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-0a37800940d07aaf", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/backend/src/routes/admin/index.ts:487", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/backend/src/routes/admin/index.ts:487"}, "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-0620107071b3d8a5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/backend/src/routes/calls/index.ts:254", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/backend/src/routes/calls/index.ts:254"}, "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-02b0bd645d0129c7", "name": "Commented-code block (6 lines) in packages/backend/src/routes/webhooks/twilio.ts:99", "shortDescription": {"text": "Commented-code block (6 lines) in packages/backend/src/routes/webhooks/twilio.ts:99"}, "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-229cb902ae50f9e7", "name": "Commented-code block (5 lines) in packages/backend/src/routes/webhooks/media-stream.ts:550", "shortDescription": {"text": "Commented-code block (5 lines) in packages/backend/src/routes/webhooks/media-stream.ts:550"}, "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-38b9fb7ec83b0861", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/backend/src/routes/webhooks/telegram.ts:45", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/backend/src/routes/webhooks/telegram.ts:45"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b87c45e7bd88d733", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/backend/src/services/sms.service.ts:37", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/backend/src/services/sms.service.ts:37"}, "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-d9a70773f8fcbadb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/backend/src/services/post-call.service.ts:184", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/backend/src/services/post-call.service.ts:184"}, "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-8f046cf8feb45d6a", "name": "Commented-code block (10 lines) in packages/backend/src/services/conference-translator.ts:44", "shortDescription": {"text": "Commented-code block (10 lines) in packages/backend/src/services/conference-translator.ts: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-a17b3f9805dce535", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/backend/src/services/telegram.service.ts:50", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/backend/src/services/telegram.service.ts:50"}, "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-a2ffa721119bab0e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/backend/src/services/recording-storage.service.ts:76", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/backend/src/services/recording-storage.service.ts:76"}, "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-e58ce55992fc5980", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/backend/src/services/stripe-connect.service.ts:46", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/backend/src/services/stripe-connect.service.ts:46"}, "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-5d05199b3ac31668", "name": "Commented-code block (5 lines) in packages/backend/src/services/stripe.service.ts:157", "shortDescription": {"text": "Commented-code block (5 lines) in packages/backend/src/services/stripe.service.ts:157"}, "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-81005bfcdf473b31", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/backend/src/services/stripe.service.ts:91", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/backend/src/services/stripe.service.ts:91"}, "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-4c1cd8c84dfe81b0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/backend/src/services/tts.service.ts:29", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/backend/src/services/tts.service.ts:29"}, "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-e431fb1d6970adff", "name": "Commented-code block (6 lines) in packages/backend/src/services/billing.service.ts:146", "shortDescription": {"text": "Commented-code block (6 lines) in packages/backend/src/services/billing.service.ts:146"}, "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-65da1bd092456dfb", "name": "Commented-code block (7 lines) in packages/backend/src/db/schema.ts:548", "shortDescription": {"text": "Commented-code block (7 lines) in packages/backend/src/db/schema.ts:548"}, "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-dc30a6e56758118a", "name": "Commented-code block (5 lines) in packages/backend/src/realtime/socket-server.ts:289", "shortDescription": {"text": "Commented-code block (5 lines) in packages/backend/src/realtime/socket-server.ts:289"}, "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-ad1f2c0971b89ce0", "name": "10 env vars used in code but missing from .env.example", "shortDescription": {"text": "10 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `CORS_ORIGINS`, `EMAIL_FROM`, `GROK_VOICE_MODEL`, `INTERNAL_API_URL`, `NEXT_PUBLIC_WS_URL`, `RESEND_API_KEY`, `STRIPE_AGENTS_MCP_PRICE_ID`, `STRIPE_AGENTS_PRICE_ID` + 2 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-3a81e797851f8169", "name": "Dangling fetch: GET /api/calls/${callId}/recording (packages/frontend/src/app/dashboard/calls/page.tsx:270)", "shortDescription": {"text": "Dangling fetch: GET /api/calls/${callId}/recording (packages/frontend/src/app/dashboard/calls/page.tsx:270)"}, "fullDescription": {"text": "`packages/frontend/src/app/dashboard/calls/page.tsx:270` calls `GET /api/calls/${callId}/recording` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/calls/<p>/recording`\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-ea169d7578cbefc4", "name": "Dangling fetch: POST /api/oauth/authorize (packages/frontend/src/app/oauth/authorize/page.tsx:54)", "shortDescription": {"text": "Dangling fetch: POST /api/oauth/authorize (packages/frontend/src/app/oauth/authorize/page.tsx:54)"}, "fullDescription": {"text": "`packages/frontend/src/app/oauth/authorize/page.tsx:54` calls `POST /api/oauth/authorize` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/oauth/authorize`\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-11da566d058215d4", "name": "Dangling fetch: POST /auth/register (packages/frontend/src/lib/api.ts:69)", "shortDescription": {"text": "Dangling fetch: POST /auth/register (packages/frontend/src/lib/api.ts:69)"}, "fullDescription": {"text": "`packages/frontend/src/lib/api.ts:69` calls `POST /auth/register` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/auth/register`\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-c8a042a39053c1c7", "name": "Dangling fetch: POST /auth/login (packages/frontend/src/lib/api.ts:73)", "shortDescription": {"text": "Dangling fetch: POST /auth/login (packages/frontend/src/lib/api.ts:73)"}, "fullDescription": {"text": "`packages/frontend/src/lib/api.ts:73` calls `POST /auth/login` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/auth/login`\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-e214b57cdf0dcf86", "name": "Dangling fetch: POST https://api.telegram.org/bot${botToken}/sendMessage (packages/backend/src/routes/webhooks/telegram.", "shortDescription": {"text": "Dangling fetch: POST https://api.telegram.org/bot${botToken}/sendMessage (packages/backend/src/routes/webhooks/telegram.ts:45)"}, "fullDescription": {"text": "`packages/backend/src/routes/webhooks/telegram.ts:45` calls `POST https://api.telegram.org/bot${botToken}/sendMessage` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.telegram.org/bot/<p>/sendmessage`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ec8019a274b4383f", "name": "Dangling fetch: POST https://api.telegram.org/bot${botToken}/sendVoice (packages/backend/src/routes/webhooks/telegram.ts", "shortDescription": {"text": "Dangling fetch: POST https://api.telegram.org/bot${botToken}/sendVoice (packages/backend/src/routes/webhooks/telegram.ts:118)"}, "fullDescription": {"text": "`packages/backend/src/routes/webhooks/telegram.ts:118` calls `POST https://api.telegram.org/bot${botToken}/sendVoice` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.telegram.org/bot/<p>/sendvoice`\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-93baafede1ca0958", "name": "Dangling fetch: POST https://api.telegram.org/bot${botToken}/setMyCommands (packages/backend/src/routes/webhooks/telegra", "shortDescription": {"text": "Dangling fetch: POST https://api.telegram.org/bot${botToken}/setMyCommands (packages/backend/src/routes/webhooks/telegram.ts:295)"}, "fullDescription": {"text": "`packages/backend/src/routes/webhooks/telegram.ts:295` calls `POST https://api.telegram.org/bot${botToken}/setMyCommands` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.telegram.org/bot/<p>/setmycommands`\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-0a3098c3e03d92f5", "name": "Dangling fetch: POST https://api.telegram.org/bot${botToken}/setWebhook (packages/backend/src/routes/webhooks/telegram.t", "shortDescription": {"text": "Dangling fetch: POST https://api.telegram.org/bot${botToken}/setWebhook (packages/backend/src/routes/webhooks/telegram.ts:310)"}, "fullDescription": {"text": "`packages/backend/src/routes/webhooks/telegram.ts:310` calls `POST https://api.telegram.org/bot${botToken}/setWebhook` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.telegram.org/bot/<p>/setwebhook`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fad0f1bc083f9d8f", "name": "Dangling fetch: POST https://api.x.ai/v1/chat/completions (packages/backend/src/services/conference-translator.ts:795)", "shortDescription": {"text": "Dangling fetch: POST https://api.x.ai/v1/chat/completions (packages/backend/src/services/conference-translator.ts:795)"}, "fullDescription": {"text": "`packages/backend/src/services/conference-translator.ts:795` calls `POST https://api.x.ai/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.x.ai/v1/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-764f276d4871ca88", "name": "Dangling fetch: POST https://api.telegram.org/bot${botToken}/answerCallbackQuery (packages/backend/src/services/telegram", "shortDescription": {"text": "Dangling fetch: POST https://api.telegram.org/bot${botToken}/answerCallbackQuery (packages/backend/src/services/telegram.service.ts:210)"}, "fullDescription": {"text": "`packages/backend/src/services/telegram.service.ts:210` calls `POST https://api.telegram.org/bot${botToken}/answerCallbackQuery` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.telegram.org/bot/<p>/answercallbackquery`\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-6dacd4c8bdf45d1e", "name": "Dangling fetch: GET https://api.telegram.org/bot${botToken}/getFile?file_id=${fileId} (packages/backend/src/services/tel", "shortDescription": {"text": "Dangling fetch: GET https://api.telegram.org/bot${botToken}/getFile?file_id=${fileId} (packages/backend/src/services/telegram.service.ts:223)"}, "fullDescription": {"text": "`packages/backend/src/services/telegram.service.ts:223` calls `GET https://api.telegram.org/bot${botToken}/getFile?file_id=${fileId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.telegram.org/bot/<p>/getfile`\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-c27fe0f14718e430", "name": "Dangling fetch: GET https://api.telegram.org/file/bot${botToken}/${fileData.result.file_path} (packages/backend/src/serv", "shortDescription": {"text": "Dangling fetch: GET https://api.telegram.org/file/bot${botToken}/${fileData.result.file_path} (packages/backend/src/services/telegram.service.ts:228)"}, "fullDescription": {"text": "`packages/backend/src/services/telegram.service.ts:228` calls `GET https://api.telegram.org/file/bot${botToken}/${fileData.result.file_path}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.telegram.org/file/bot/<p>/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1929acf374e5724c", "name": "Dangling fetch: POST https://api.openai.com/v1/audio/transcriptions (packages/backend/src/services/telegram.service.ts:2", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/audio/transcriptions (packages/backend/src/services/telegram.service.ts:237)"}, "fullDescription": {"text": "`packages/backend/src/services/telegram.service.ts:237` calls `POST https://api.openai.com/v1/audio/transcriptions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/audio/transcriptions`\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-219f60908bcde42f", "name": "Dangling fetch: POST https://connect.stripe.com/oauth/token (packages/backend/src/services/stripe-connect.service.ts:46)", "shortDescription": {"text": "Dangling fetch: POST https://connect.stripe.com/oauth/token (packages/backend/src/services/stripe-connect.service.ts:46)"}, "fullDescription": {"text": "`packages/backend/src/services/stripe-connect.service.ts:46` calls `POST https://connect.stripe.com/oauth/token` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/connect.stripe.com/oauth/token`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9cdea3bf67fa4ec8", "name": "Dangling fetch: GET https://api.stripe.com/v1/account (packages/backend/src/services/stripe-connect.service.ts:75)", "shortDescription": {"text": "Dangling fetch: GET https://api.stripe.com/v1/account (packages/backend/src/services/stripe-connect.service.ts:75)"}, "fullDescription": {"text": "`packages/backend/src/services/stripe-connect.service.ts:75` calls `GET https://api.stripe.com/v1/account` 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.stripe.com/v1/account`\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-ca23ba0b77d1fbb8", "name": "Dangling fetch: POST https://connect.stripe.com/oauth/deauthorize (packages/backend/src/services/stripe-connect.service.", "shortDescription": {"text": "Dangling fetch: POST https://connect.stripe.com/oauth/deauthorize (packages/backend/src/services/stripe-connect.service.ts:90)"}, "fullDescription": {"text": "`packages/backend/src/services/stripe-connect.service.ts:90` calls `POST https://connect.stripe.com/oauth/deauthorize` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/connect.stripe.com/oauth/deauthorize`\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-b5a6ba42dd801e10", "name": "Dangling fetch: POST https://api.resend.com/emails (packages/backend/src/services/email.service.ts:21)", "shortDescription": {"text": "Dangling fetch: POST https://api.resend.com/emails (packages/backend/src/services/email.service.ts:21)"}, "fullDescription": {"text": "`packages/backend/src/services/email.service.ts:21` calls `POST https://api.resend.com/emails` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.resend.com/emails`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-dc95f82f11ec499f", "name": "Dangling fetch: GET https://api.stripe.com/v1${path} (packages/backend/src/services/stripe.service.ts:91)", "shortDescription": {"text": "Dangling fetch: GET https://api.stripe.com/v1${path} (packages/backend/src/services/stripe.service.ts:91)"}, "fullDescription": {"text": "`packages/backend/src/services/stripe.service.ts:91` calls `GET https://api.stripe.com/v1${path}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.stripe.com/v1/<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-132e237dd9a80f88", "name": "Dangling fetch: POST https://api.openai.com/v1/audio/speech (packages/backend/src/services/tts.service.ts:83)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/audio/speech (packages/backend/src/services/tts.service.ts:83)"}, "fullDescription": {"text": "`packages/backend/src/services/tts.service.ts:83` calls `POST https://api.openai.com/v1/audio/speech` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/audio/speech`\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-079a225de73f87f4", "name": "Dangling fetch: POST https://api.x.ai/v1/tts (packages/backend/src/services/tts.service.ts:150)", "shortDescription": {"text": "Dangling fetch: POST https://api.x.ai/v1/tts (packages/backend/src/services/tts.service.ts:150)"}, "fullDescription": {"text": "`packages/backend/src/services/tts.service.ts:150` calls `POST https://api.x.ai/v1/tts` 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.x.ai/v1/tts`\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-9ce039feeb91791f", "name": "Unused endpoint: POST /auth/set-password", "shortDescription": {"text": "Unused endpoint: POST /auth/set-password"}, "fullDescription": {"text": "`packages/frontend/src/app/auth/set-password/page.tsx` declares `POST /auth/set-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-031f2448581b7541", "name": "Unused endpoint: POST /auth/magic-link", "shortDescription": {"text": "Unused endpoint: POST /auth/magic-link"}, "fullDescription": {"text": "`packages/frontend/src/app/login/page.tsx` declares `POST /auth/magic-link` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8cbf20e974177219", "name": "Unused endpoint: PUT /translator/defaults", "shortDescription": {"text": "Unused endpoint: PUT /translator/defaults"}, "fullDescription": {"text": "`packages/frontend/src/app/dashboard/page.tsx` declares `PUT /translator/defaults` 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-b38b417c64d7af39", "name": "Unused endpoint: PUT /workspaces/telegram", "shortDescription": {"text": "Unused endpoint: PUT /workspaces/telegram"}, "fullDescription": {"text": "`packages/frontend/src/app/dashboard/settings/_components/TelegramSection.tsx` declares `PUT /workspaces/telegram` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1d347d43d66f048a", "name": "Unused endpoint: DELETE /workspaces/telegram", "shortDescription": {"text": "Unused endpoint: DELETE /workspaces/telegram"}, "fullDescription": {"text": "`packages/frontend/src/app/dashboard/settings/_components/TelegramSection.tsx` declares `DELETE /workspaces/telegram` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-62442cf9426e3815", "name": "Unused endpoint: POST /workspaces/test-telegram", "shortDescription": {"text": "Unused endpoint: POST /workspaces/test-telegram"}, "fullDescription": {"text": "`packages/frontend/src/app/dashboard/settings/_components/TelegramSection.tsx` declares `POST /workspaces/test-telegram` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cb497b75799bc13e", "name": "Unused endpoint: DELETE /workspaces/current", "shortDescription": {"text": "Unused endpoint: DELETE /workspaces/current"}, "fullDescription": {"text": "`packages/frontend/src/app/dashboard/settings/_components/DangerZone.tsx` declares `DELETE /workspaces/current` 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-433112f7205b11b4", "name": "Unused endpoint: POST /telephony/personal-number", "shortDescription": {"text": "Unused endpoint: POST /telephony/personal-number"}, "fullDescription": {"text": "`packages/frontend/src/app/dashboard/settings/_components/PersonalNumberSection.tsx` declares `POST /telephony/personal-number` 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-8c754233c90bf0cb", "name": "Unused endpoint: DELETE /telephony/personal-number", "shortDescription": {"text": "Unused endpoint: DELETE /telephony/personal-number"}, "fullDescription": {"text": "`packages/frontend/src/app/dashboard/settings/_components/PersonalNumberSection.tsx` declares `DELETE /telephony/personal-number` 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-c5f3c315dea4ff5d", "name": "Unused endpoint: DELETE /billing/subscription", "shortDescription": {"text": "Unused endpoint: DELETE /billing/subscription"}, "fullDescription": {"text": "`packages/frontend/src/app/dashboard/billing/_lib/useBillingData.ts` declares `DELETE /billing/subscription` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7223d9a381d78d50", "name": "Unused endpoint: POST /billing/downgrade", "shortDescription": {"text": "Unused endpoint: POST /billing/downgrade"}, "fullDescription": {"text": "`packages/frontend/src/app/dashboard/billing/_lib/useBillingData.ts` declares `POST /billing/downgrade` 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-c7d45e2f691ba823", "name": "Unused endpoint: POST /billing/reactivate", "shortDescription": {"text": "Unused endpoint: POST /billing/reactivate"}, "fullDescription": {"text": "`packages/frontend/src/app/dashboard/billing/_lib/useBillingData.ts` declares `POST /billing/reactivate` 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-6ae65195b97962bb", "name": "Unused endpoint: POST /calls/bulk-delete", "shortDescription": {"text": "Unused endpoint: POST /calls/bulk-delete"}, "fullDescription": {"text": "`packages/frontend/src/app/dashboard/calls/page.tsx` declares `POST /calls/bulk-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-e82585e3fe92d6e6", "name": "Unused endpoint: PUT /admin/billing-settings", "shortDescription": {"text": "Unused endpoint: PUT /admin/billing-settings"}, "fullDescription": {"text": "`packages/frontend/src/app/admin/settings/page.tsx` declares `PUT /admin/billing-settings` 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-479353b005c631f2", "name": "Unused endpoint: PUT /admin/settings", "shortDescription": {"text": "Unused endpoint: PUT /admin/settings"}, "fullDescription": {"text": "`packages/frontend/src/app/admin/settings/page.tsx` declares `PUT /admin/settings` 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-d3509b29d27489af", "name": "Unused endpoint: DELETE /admin/stripe/connect", "shortDescription": {"text": "Unused endpoint: DELETE /admin/stripe/connect"}, "fullDescription": {"text": "`packages/frontend/src/app/admin/providers/page.tsx` declares `DELETE /admin/stripe/connect` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5be00aad8584d4cf", "name": "Unused endpoint: DELETE /admin/providers/stripe", "shortDescription": {"text": "Unused endpoint: DELETE /admin/providers/stripe"}, "fullDescription": {"text": "`packages/frontend/src/app/admin/providers/page.tsx` declares `DELETE /admin/providers/stripe` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ec33d846c59daaef", "name": "Unused endpoint: POST /admin/stripe/callback", "shortDescription": {"text": "Unused endpoint: POST /admin/stripe/callback"}, "fullDescription": {"text": "`packages/frontend/src/app/admin/providers/stripe/callback/page.tsx` declares `POST /admin/stripe/callback` 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-86dd25ea09251db5", "name": "Unused endpoint: GET /admin/promo", "shortDescription": {"text": "Unused endpoint: GET /admin/promo"}, "fullDescription": {"text": "`packages/frontend/src/app/admin/promo/page.tsx` declares `GET /admin/promo` 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-a1a232ab74182748", "name": "Unused endpoint: POST /admin/promo", "shortDescription": {"text": "Unused endpoint: POST /admin/promo"}, "fullDescription": {"text": "`packages/frontend/src/app/admin/promo/page.tsx` declares `POST /admin/promo` 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-6ab2ac3d0b6bc661", "name": "Unused endpoint: GET /api/billing/plans", "shortDescription": {"text": "Unused endpoint: GET /api/billing/plans"}, "fullDescription": {"text": "`packages/backend/src/server.ts` declares `GET /api/billing/plans` 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-0a459f319af665ae", "name": "Unused endpoint: POST /request-link", "shortDescription": {"text": "Unused endpoint: POST /request-link"}, "fullDescription": {"text": "`packages/backend/src/routes/translator/portal.ts` declares `POST /request-link` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-822f5812dc9de7a7", "name": "Unused endpoint: GET /verify", "shortDescription": {"text": "Unused endpoint: GET /verify"}, "fullDescription": {"text": "`packages/backend/src/routes/translator/portal.ts` declares `GET /verify` 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-fd1dc91abf32142d", "name": "Unused endpoint: GET /me", "shortDescription": {"text": "Unused endpoint: GET /me"}, "fullDescription": {"text": "`packages/backend/src/routes/translator/portal.ts` declares `GET /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-b15d518d538de57d", "name": "Unused endpoint: GET /sessions", "shortDescription": {"text": "Unused endpoint: GET /sessions"}, "fullDescription": {"text": "`packages/backend/src/routes/translator/portal.ts` declares `GET /sessions` 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-987dbe53cc0348b4", "name": "Unused endpoint: GET /sessions/active", "shortDescription": {"text": "Unused endpoint: GET /sessions/active"}, "fullDescription": {"text": "`packages/backend/src/routes/translator/portal.ts` declares `GET /sessions/active` 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-52f939032aab887f", "name": "Unused endpoint: GET /transactions", "shortDescription": {"text": "Unused endpoint: GET /transactions"}, "fullDescription": {"text": "`packages/backend/src/routes/translator/portal.ts` declares `GET /transactions` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0ae38010c60493f1", "name": "Unused endpoint: POST /webhook", "shortDescription": {"text": "Unused endpoint: POST /webhook"}, "fullDescription": {"text": "`packages/backend/src/routes/translator/stripe.ts` declares `POST /webhook` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-12984392acfe07c4", "name": "Unused endpoint: GET /phone", "shortDescription": {"text": "Unused endpoint: GET /phone"}, "fullDescription": {"text": "`packages/backend/src/routes/translator/index.ts` declares `GET /phone` 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-d467299d5c174fc0", "name": "Unused endpoint: GET /usage", "shortDescription": {"text": "Unused endpoint: GET /usage"}, "fullDescription": {"text": "`packages/backend/src/routes/translator/index.ts` declares `GET /usage` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a2693505ba3f464c", "name": "Unused endpoint: GET /line-status", "shortDescription": {"text": "Unused endpoint: GET /line-status"}, "fullDescription": {"text": "`packages/backend/src/routes/translator/index.ts` declares `GET /line-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-bb80ef2b640dfa02", "name": "Unused endpoint: GET /defaults", "shortDescription": {"text": "Unused endpoint: GET /defaults"}, "fullDescription": {"text": "`packages/backend/src/routes/translator/index.ts` declares `GET /defaults` 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-12ced4a40f05dd1a", "name": "Unused endpoint: PUT /defaults", "shortDescription": {"text": "Unused endpoint: PUT /defaults"}, "fullDescription": {"text": "`packages/backend/src/routes/translator/index.ts` declares `PUT /defaults` 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-c32b4607df0975e2", "name": "Unused endpoint: GET /api-keys", "shortDescription": {"text": "Unused endpoint: GET /api-keys"}, "fullDescription": {"text": "`packages/backend/src/routes/auth/index.ts` declares `GET /api-keys` 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-224cbb7548a6b13c", "name": "Unused endpoint: POST /api-keys", "shortDescription": {"text": "Unused endpoint: POST /api-keys"}, "fullDescription": {"text": "`packages/backend/src/routes/auth/index.ts` declares `POST /api-keys` 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-eb6cbd163e296cdb", "name": "Unused endpoint: DELETE /api-keys/:id", "shortDescription": {"text": "Unused endpoint: DELETE /api-keys/:id"}, "fullDescription": {"text": "`packages/backend/src/routes/auth/index.ts` declares `DELETE /api-keys/: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-304b6f2b403d93f7", "name": "Unused endpoint: POST /register", "shortDescription": {"text": "Unused endpoint: POST /register"}, "fullDescription": {"text": "`packages/backend/src/routes/auth/session.ts` declares `POST /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-618721b912bad1c2", "name": "Unused endpoint: POST /login", "shortDescription": {"text": "Unused endpoint: POST /login"}, "fullDescription": {"text": "`packages/backend/src/routes/auth/session.ts` declares `POST /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-2ee4be5d71be34a5", "name": "Unused endpoint: POST /magic-link", "shortDescription": {"text": "Unused endpoint: POST /magic-link"}, "fullDescription": {"text": "`packages/backend/src/routes/auth/session.ts` declares `POST /magic-link` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e9f8cd7a99618efc", "name": "Unused endpoint: POST /set-password", "shortDescription": {"text": "Unused endpoint: POST /set-password"}, "fullDescription": {"text": "`packages/backend/src/routes/auth/session.ts` declares `POST /set-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-16a5795e651d0a56", "name": "Unused endpoint: POST /collect", "shortDescription": {"text": "Unused endpoint: POST /collect"}, "fullDescription": {"text": "`packages/backend/src/routes/analytics/index.ts` declares `POST /collect` 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-959e83c0a87139d8", "name": "Unused endpoint: GET /current", "shortDescription": {"text": "Unused endpoint: GET /current"}, "fullDescription": {"text": "`packages/backend/src/routes/workspaces/index.ts` declares `GET /current` 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-63f89b40f32eddd3", "name": "Unused endpoint: PATCH /current", "shortDescription": {"text": "Unused endpoint: PATCH /current"}, "fullDescription": {"text": "`packages/backend/src/routes/workspaces/index.ts` declares `PATCH /current` 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-8912a874573ac42d", "name": "Unused endpoint: DELETE /current", "shortDescription": {"text": "Unused endpoint: DELETE /current"}, "fullDescription": {"text": "`packages/backend/src/routes/workspaces/index.ts` declares `DELETE /current` 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-3e8a0a7b406443bc", "name": "Unused endpoint: GET /members", "shortDescription": {"text": "Unused endpoint: GET /members"}, "fullDescription": {"text": "`packages/backend/src/routes/workspaces/index.ts` declares `GET /members` 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-cbaa8c06323c88f9", "name": "Unused endpoint: POST /members", "shortDescription": {"text": "Unused endpoint: POST /members"}, "fullDescription": {"text": "`packages/backend/src/routes/workspaces/index.ts` declares `POST /members` 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-2d965162b8514801", "name": "Unused endpoint: POST /members/invite", "shortDescription": {"text": "Unused endpoint: POST /members/invite"}, "fullDescription": {"text": "`packages/backend/src/routes/workspaces/index.ts` declares `POST /members/invite` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fa8097acf61363a6", "name": "Unused endpoint: DELETE /members/:id", "shortDescription": {"text": "Unused endpoint: DELETE /members/:id"}, "fullDescription": {"text": "`packages/backend/src/routes/workspaces/index.ts` declares `DELETE /members/: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-a403c83ed2c5980b", "name": "Unused endpoint: GET /telegram", "shortDescription": {"text": "Unused endpoint: GET /telegram"}, "fullDescription": {"text": "`packages/backend/src/routes/workspaces/index.ts` declares `GET /telegram` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c900fa95f35d0d3f", "name": "Unused endpoint: PUT /telegram", "shortDescription": {"text": "Unused endpoint: PUT /telegram"}, "fullDescription": {"text": "`packages/backend/src/routes/workspaces/index.ts` declares `PUT /telegram` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/20204"}, "properties": {"repository": "sskorohod/caller", "repoUrl": "https://github.com/sskorohod/caller", "branch": "main"}, "results": [{"ruleId": "foundry_assumption_check", "level": "warning", "message": {"text": "Foundry mined assumption checks: sskorohod/caller"}, "properties": {"repobilityId": 439638, "scanner": "foundry_dataset", "fingerprint": "accc02bbac3e79a9507b227a949ebdb19a1c53acad51925e1b3010a4fd1863c6", "category": "practices", "severity": "medium", "confidence": 0.62, "triageState": "open", "verdict": "needs_review", "isResolved": false, "reason": "Imported from mined Foundry/Fable5 evidence with real GitHub/source provenance. Review source_id before acting.", "evidence": {"meta": {"kind": "comment_chain_pattern_product", "source": "comment_chain_pattern_miner", "product": "assumption_checks", "synthetic": false, "thread_key": "sskorohod/caller#1", "human_labels": ["api_or_backend", "data_schema_persistence", "schema_or_data"], "issue_number": "1", "thread_label": "thread_has_human_issue_and_fix_context", "outcome_label": "claimed_resolved_unverified", "source_backed": true, "max_confidence": 0.822, "repo_full_name": "sskorohod/caller", "training_usage": "gold_candidate", "confidence_tier": "high_confidence", "source_chain_id": "evidence-chain-issue_chain-bb3aceeac02fccf0", "helicopter_views": {"schemas": 2}, "artifact_families": {"ci": 1, "docs": 6, "schemas": 1}, "source_chain_kind": "issue_chain", "changed_file_count": 3, "source_graph_label": "source_backed_multi_signal_graph", "changed_file_labels": {"api_or_backend": 1, "schema_or_data": 2}, "linked_commit_count": 5, "helicopter_view_count": 2, "source_artifact_count": 8, "classification_reasons": ["source_graph_has_real_artifacts", "source_graph_has_verification_artifacts", "repo_has_isolated_helicopter_views", "link_quality_high_confidence", "high_risk_human_feedback_label"], "linked_ci_commit_count": 0, "verification_artifact_count": 2, "design_schema_api_artifact_count": 1}, "text": "Comment chain pattern product: assumption_checks\nRepo: sskorohod/caller\nThread: sskorohod/caller#1\nOutcome: claimed_resolved_unverified\nThread label: thread_has_human_issue_and_fix_context\nSource graph label: source_backed_multi_signal_graph\nReasons: source_graph_has_real_artifacts, source_graph_has_verification_artifacts, repo_has_isolated_helicopter_views, link_quality_high_confidence, high_risk_human_feedback_label\nChain evidence:\nIssue/PR evidence chain: sskorohod/caller#1\nRepo: sskorohod/caller\nThread label: thread_has_human_issue_and_fix_context\nOutcome: claimed_resolved_unverified\nComment count: 1\nLinked commit count: 5\nLinked CI commit count: 0\nLinked CI labels: {}\nChanged file count: 3\nLabels: {'data_schema_persistence': 1}\nPolarities: {'bad': 1}\nChanged file labels: {'schema_or_data': 2, 'api_or_backend': 1}\nExamples:\n[\n  {\n    \"id\": \"github-feedback-comment-67e6ea35de336965\",\n    \"kind\": \"pull_request_body\",\n    \"label\": \"data_schema_persistence\",\n    \"polarity\": \"bad\",\n    \"url\": \"https://github.com/sskorohod/caller/pull/1\",\n    \"text\": \"GitHub feedback: data_schema_persistence\\nPolarity: bad\\nKind: pull_request_body\\nRepo: sskorohod/caller\\nAuthor: sskorohod (User)\\nURL: https://github.com/sskorohod/caller/pull/1\\nTitle: fix(translator): allow conference sessions without a registered subscriber\\nBody:\\n## Summary\\n\\nAdds migration \\\\`00027_nullable_translator_session_subscriber.sql\\\\` so \\\\`translator_sessions.subscriber_id\\\\` is nullable, plus the matching code change.\\n\\nWithout this, inbound calls that aren't tied to a registered translator subscriber abort with a NOT NULL violation before any audio flows through Grok.\\n\\n> **Note:** the original branch \\\\`codex/translator-hang\\\\` also carried two other commits (\\\\`debounce realtime setting reconnects\\\\`, \\\\`avoid cancelling long speech\\\\`). Both have since been superseded on \\\\`main\\\\` by [0efaf26](https://github.com/sskorohod/caller/commit/0efaf26) \u2014 settings now hot-update via \\\\`session.update\\\\` instead of reconnecting (so debounce is moot) and the long-speech barge-in scope was rebuilt with a tighter check. They've been dropped from this PR.\\n\\n## Test plan\\n\\n- [x] Run migration on staging: \\\\`docker compose exec -T backend node dist/migrate.js\\\\`\\n- [x] Trigger an inbound translator call\"\n  }\n]\nChanged files:\n[\n  {\n    \"id\": \"github-pr-file-file-67fd65b4882037df\",\n    \"filename\": \"packages/backend/src/db/schema.ts\",\n    \"label\": \"schema_or_data\",\n    \"status\": \"modified\",\n    \"additions\": 1,\n    \"deletions\": 1,\n    \"changes\": 2,\n    \"blob_url\": \"https://github.com/sskorohod/caller/blob/33135fbbd881ff94e42f455336cb3d1df31c88a5/packages%2Fbackend%2Fsrc%2Fdb%2Fschema.ts\"\n  },\n  {\n    \"id\": \"github-pr-file-file-bef25e3a1187bb29\",\n    \"filename\": \"packages/backend/src/routes/webhooks/media-stream.ts\",\n    \"label\": \"api_or_backend\",\n    \"status\": \"modified\",\n    \"additions\": 19,\n    \"deletions\": 0,\n    \"changes\": 19,\n    \"blob_url\": \"https://githu\n[truncated by importer]", "source": "foundry_mined_dataset", "repo_url": "https://github.com/sskorohod/caller", "source_id": "comment-chain-pattern-assumption_checks-a0ea7f1c4e73827a", "synthetic": false, "gold_label": "", "graph_label": "source_backed_multi_signal_graph", "source_path": "/data/distillate/foundry_data/comment_chain_patterns/assumption_checks/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "sskorohod/caller", "source_dataset": "comment_chain_patterns/assumption_checks", "training_usage": "gold_candidate"}}}, {"ruleId": "foundry_schema_ui_api_gap", "level": "error", "message": {"text": "Foundry mined schema ui api mismatch: sskorohod/caller"}, "properties": {"repobilityId": 453895, "scanner": "foundry_dataset", "fingerprint": "cf95e63cb015d0a5cfcf7692513026ed80c1f3d3d7fb997c423c538e82ba2e2b", "category": "quality", "severity": "high", "confidence": 0.76, "triageState": "open", "verdict": "needs_review", "isResolved": false, "reason": "Imported from mined Foundry/Fable5 evidence with real GitHub/source provenance. Review source_id before acting.", "evidence": {"meta": {"kind": "graph_query_record", "title": "Schema, UI, and API mismatch", "intent": "Assumption-check examples for data-path consistency across layers.", "labels": {"bug_fix": 3, "data_schema": 2, "api_or_backend": 1, "schema_or_data": 2, "data_schema_persistence": 1, "claimed_resolved_unverified": 3, "issue_or_pull_request_thread": 1, "human_reported_issue_then_fix_attempt": 1, "thread_has_human_issue_and_fix_context": 2}, "source": "graph_query_export", "motif_id": "schema_ui_api_mismatch", "outcomes": {"claimed_resolved_unverified": 6}, "polarity": "bad", "query_id": "schema_ui_api_mismatch", "severity": "high", "ci_labels": {}, "synthetic": false, "edge_count": 25, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 1, "thread_has_comment": 1, "thread_touches_file": 3, "chain_has_link_quality": 3, "thread_has_fix_outcome": 1, "thread_has_issue_chain": 1, "issue_chain_touches_file": 3, "thread_has_comment_chain": 1, "comment_chain_links_commit": 5, "comment_chain_touches_file": 3, "issue_chain_has_fix_outcome": 1, "issue_chain_has_comment_chain": 1}, "node_count": 17, "node_types": {"repo": 1, "commit": 5, "thread": 1, "comment": 1, "pr_file": 3, "fix_outcome": 1, "issue_chain": 1, "link_quality": 3, "comment_chain": 1}, "query_type": "motif_query", "thread_key": "sskorohod/caller#1", "issue_number": "1", "quality_tiers": {"high_confidence": 3}, "repo_full_name": "sskorohod/caller", "training_usage": "assumption_check", "source_motif_id": "graph-pattern-motif-thread-3716639c298e5021", "graph_gold_label": "supported_by_high_confidence_link", "changed_file_labels": {"api_or_backend": 4, "schema_or_data": 8}}, "text": "Graph query export: Schema, UI, and API mismatch\nQuery id: schema_ui_api_mismatch\nQuery type: motif_query\nIntent: Assumption-check examples for data-path consistency across layers.\nMotif: schema_ui_api_mismatch\nTraining usage: assumption_check\nGraph gold label: supported_by_high_confidence_link\nRepo: sskorohod/caller\nThread: sskorohod/caller#1\nEvidence:\nGraph motif: Schema, UI, and API evidence do not line up\nMotif id: schema_ui_api_mismatch\nPolarity: bad\nTraining usage: assumption_check\nSeverity: high\nRepo: sskorohod/caller\nThread: sskorohod/caller#1\nGraph gold label: supported_by_high_confidence_link\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: sskorohod/caller#1\nRepo: sskorohod/caller\nIssue/PR number: 1\nGraph consistency label: supported_by_high_confidence_link\nNodes: 17\nEdges: 25\nNode types: {'commit': 5, 'pr_file': 3, 'link_quality': 3, 'thread': 1, 'repo': 1, 'comment': 1, 'comment_chain': 1, 'issue_chain': 1, 'fix_outcome': 1}\nEdge types: {'comment_chain_links_commit': 5, 'thread_touches_file': 3, 'comment_chain_touches_file': 3, 'chain_has_link_quality': 3, 'issue_chain_touches_file': 3, 'repo_has_thread': 1, 'thread_has_comment': 1, 'thread_has_comment_chain': 1, 'comment_has_chain': 1, 'thread_has_issue_chain': 1, 'issue_chain_has_comment_chain': 1, 'thread_has_fix_outcome': 1, 'issue_chain_has_fix_outcome': 1}\nLabels: {'bug_fix': 3, 'claimed_resolved_unverified': 3, 'schema_or_data': 2, 'data_schema': 2, 'thread_has_human_issue_and_fix_context': 2, 'issue_or_pull_request_thread': 1, 'data_schema_persistence': 1, 'api_or_backend': 1, 'human_reported_issue_then_fix_attempt': 1}\nOutcomes: {'claimed_resolved_unverified': 6}\nQuality tiers: {'high_confidence': 3}\nCI labels: {}\nCurriculum targets:\n- Create schema-to-API-to-UI consistency tasks with migrations and tests.\n- Teach models to verify persistence, route contracts, and UI state together.\nAssumption checks:\n- Do schema changes have matching API and UI handling?\n- Are migrations and tests present for the data path?", "source": "foundry_mined_dataset", "repo_url": "https://github.com/sskorohod/caller", "source_id": "graph-query-motif_query-ae27fdae689fd50d", "synthetic": false, "gold_label": "", "graph_label": "", "source_path": "/data/distillate/foundry_data/graph_queries/schema_ui_api_mismatch/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "sskorohod/caller", "source_dataset": "graph_queries/schema_ui_api_mismatch", "training_usage": "assumption_check"}}}, {"ruleId": "scanner-d19d8e3d14fe8ac5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/components/BottomTabBar.tsx:132"}, "properties": {"repobilityId": "e684a67e3931b6ce", "scanner": "scanner-primary", "fingerprint": "d19d8e3d14fe8ac5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-deaa47644891b958", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/components/IncomingCallCard.tsx:155"}, "properties": {"repobilityId": "bf8b1f53353ce929", "scanner": "scanner-primary", "fingerprint": "deaa47644891b958", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-35782dd35ea09306", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/frontend/src/components/JsonLd.tsx:13"}, "properties": {"repobilityId": "a90b584018d29ab4", "scanner": "scanner-primary", "fingerprint": "35782dd35ea09306", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-e3574ee5b096790e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/components/MobilePageHeader.tsx:28"}, "properties": {"repobilityId": "627767103d3af0f8", "scanner": "scanner-primary", "fingerprint": "e3574ee5b096790e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-76d8c92c98791c6c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/components/CollapsibleSection.tsx:38"}, "properties": {"repobilityId": "02ee5e4dadc8636e", "scanner": "scanner-primary", "fingerprint": "76d8c92c98791c6c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9045fdf208dd7eb5", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/frontend/src/app/layout.tsx:73"}, "properties": {"repobilityId": "bb3f83f6eb044e14", "scanner": "scanner-primary", "fingerprint": "9045fdf208dd7eb5", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-f99e0719ade7038e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/dashboard/layout.tsx:85"}, "properties": {"repobilityId": "2a0741444f5a1352", "scanner": "scanner-primary", "fingerprint": "f99e0719ade7038e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7d191c5a5f616a08", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/dashboard/settings/_components/SettingsNav.tsx:64"}, "properties": {"repobilityId": "329d5bc8e5fd55df", "scanner": "scanner-primary", "fingerprint": "7d191c5a5f616a08", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-24af24e7c2ed5314", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/dashboard/settings/_components/GeneralSection.tsx:67"}, "properties": {"repobilityId": "2c2ce08face29dcb", "scanner": "scanner-primary", "fingerprint": "24af24e7c2ed5314", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-839324dcba7924cb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/dashboard/help/_components/SupportChat.tsx:163"}, "properties": {"repobilityId": "2459f4ca001d986e", "scanner": "scanner-primary", "fingerprint": "839324dcba7924cb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-aa3ed3def9de7622", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/frontend/src/app/dashboard/help/_components/HelpArticle.tsx:19"}, "properties": {"repobilityId": "f00bf6d6aa80ecb7", "scanner": "scanner-primary", "fingerprint": "aa3ed3def9de7622", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-262424aef3f641ca", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/dashboard/help/_components/HelpSidebar.tsx:66"}, "properties": {"repobilityId": "7ba11f3380b8a32e", "scanner": "scanner-primary", "fingerprint": "262424aef3f641ca", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9ecca3725befafc6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/dashboard/billing/_components/TransactionHistory.tsx:81"}, "properties": {"repobilityId": "4bab528b76893b1c", "scanner": "scanner-primary", "fingerprint": "9ecca3725befafc6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7945803c4e7af4c6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/dashboard/calls/page.tsx:139"}, "properties": {"repobilityId": "26a442107ec14b87", "scanner": "scanner-primary", "fingerprint": "7945803c4e7af4c6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1f369d9b599026d6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/dashboard/calls/[id]/translate/page.tsx:192"}, "properties": {"repobilityId": "f77609f3e8243582", "scanner": "scanner-primary", "fingerprint": "1f369d9b599026d6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2b6f6b814b06ad45", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/dashboard/_components/RecentCallsTable.tsx:62"}, "properties": {"repobilityId": "65fdc4aec82cf6f8", "scanner": "scanner-primary", "fingerprint": "2b6f6b814b06ad45", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a9f5e83f337dd306", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/oauth/authorize/page.tsx:170"}, "properties": {"repobilityId": "92e04c8b6bf73ec8", "scanner": "scanner-primary", "fingerprint": "a9f5e83f337dd306", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-169f02d9d41bcdbe", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/admin/settings/page.tsx:320"}, "properties": {"repobilityId": "c94c0371df3b2480", "scanner": "scanner-primary", "fingerprint": "169f02d9d41bcdbe", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5d2d5a955e88cafc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/admin/workspaces/page.tsx:243"}, "properties": {"repobilityId": "bc7a7a4f90c6ab0e", "scanner": "scanner-primary", "fingerprint": "5d2d5a955e88cafc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e4d776c2ffa63b15", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/admin/audit/page.tsx:86"}, "properties": {"repobilityId": "1ae1b47513e8a8da", "scanner": "scanner-primary", "fingerprint": "e4d776c2ffa63b15", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b57536da3a61d045", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/admin/finance/page.tsx:160"}, "properties": {"repobilityId": "f5f489ef3566d561", "scanner": "scanner-primary", "fingerprint": "b57536da3a61d045", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-02ea789340b4fdbb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/admin/tickets/page.tsx:118"}, "properties": {"repobilityId": "378c31fdaa437818", "scanner": "scanner-primary", "fingerprint": "02ea789340b4fdbb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e34d45b367717ac9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/admin/contacts/page.tsx:87"}, "properties": {"repobilityId": "c7ba2173df312b07", "scanner": "scanner-primary", "fingerprint": "e34d45b367717ac9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b19c4a12f4f1e81e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/admin/_components/AdminLivePanel.tsx:76"}, "properties": {"repobilityId": "463d5c6765637ed5", "scanner": "scanner-primary", "fingerprint": "b19c4a12f4f1e81e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0d29d03b6297a5fe", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/admin/_components/AdminHealthBlock.tsx:110"}, "properties": {"repobilityId": "d45290aafa07f79d", "scanner": "scanner-primary", "fingerprint": "0d29d03b6297a5fe", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-48047d11837e2de3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/frontend/src/app/calls/[id]/monitor/page.tsx:169"}, "properties": {"repobilityId": "c238e978d0ee4853", "scanner": "scanner-primary", "fingerprint": "48047d11837e2de3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-de527a276ff65f34", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/frontend/src/lib/socket.tsx:27"}, "properties": {"repobilityId": "7e1dd065fda55873", "scanner": "scanner-primary", "fingerprint": "de527a276ff65f34", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f3126e64f1179393", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/backend/src/migrate.ts:27"}, "properties": {"repobilityId": "527d51aa0ab6fda3", "scanner": "scanner-primary", "fingerprint": "f3126e64f1179393", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a2d59964771165de", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine"}, "properties": {"repobilityId": "c41f74ef71e97f9b", "scanner": "scanner-primary", "fingerprint": "a2d59964771165de", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/frontend/Dockerfile"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-a2d59964771165de", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine"}, "properties": {"repobilityId": "0d95ef56c2436817", "scanner": "scanner-primary", "fingerprint": "a2d59964771165de", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/frontend/Dockerfile"}, "region": {"startLine": 24}}}]}, {"ruleId": "scanner-8448aae02c8b5688", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine"}, "properties": {"repobilityId": "133d287b62c4ab05", "scanner": "scanner-primary", "fingerprint": "8448aae02c8b5688", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/backend/Dockerfile"}, "region": {"startLine": 3}}}]}, {"ruleId": "scanner-8448aae02c8b5688", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine"}, "properties": {"repobilityId": "30684d4b8c029d18", "scanner": "scanner-primary", "fingerprint": "8448aae02c8b5688", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/backend/Dockerfile"}, "region": {"startLine": 23}}}]}, {"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-f61e9aef75c40a4e", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in packages/frontend/src/components/JsonLd.tsx:13"}, "properties": {"repobilityId": "afa39d932db3bcfe", "scanner": "scanner-primary", "fingerprint": "f61e9aef75c40a4e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/frontend/src/components/JsonLd.tsx"}, "region": {"startLine": 13}}}]}, {"ruleId": "scanner-b23776f3c671c6df", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in packages/frontend/src/app/layout.tsx:73"}, "properties": {"repobilityId": "9afaa415ede12fe7", "scanner": "scanner-primary", "fingerprint": "b23776f3c671c6df", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/frontend/src/app/layout.tsx"}, "region": {"startLine": 73}}}]}, {"ruleId": "scanner-0672d5fcf0768bfb", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in packages/frontend/src/app/translator/portal/page.tsx:105"}, "properties": {"repobilityId": "47768ae3e25f95fa", "scanner": "scanner-primary", "fingerprint": "0672d5fcf0768bfb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/frontend/src/app/translator/portal/page.tsx"}, "region": {"startLine": 105}}}]}, {"ruleId": "scanner-e113e0f639c3ac32", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in packages/frontend/src/app/auth/verify/page.tsx:37"}, "properties": {"repobilityId": "71c1d1fe8b640ed3", "scanner": "scanner-primary", "fingerprint": "e113e0f639c3ac32", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/frontend/src/app/auth/verify/page.tsx"}, "region": {"startLine": 37}}}]}, {"ruleId": "scanner-e928b1deac9d09cd", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in packages/frontend/src/app/dashboard/help/_components/HelpArticle.tsx:19"}, "properties": {"repobilityId": "eaf4eb679d695bf3", "scanner": "scanner-primary", "fingerprint": "e928b1deac9d09cd", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/frontend/src/app/dashboard/help/_components/HelpArticle.tsx"}, "region": {"startLine": 19}}}]}, {"ruleId": "scanner-a826f69d4003eea3", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in packages/frontend/src/lib/auth-context.tsx:39"}, "properties": {"repobilityId": "523a6fc0aa06d503", "scanner": "scanner-primary", "fingerprint": "a826f69d4003eea3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/frontend/src/lib/auth-context.tsx"}, "region": {"startLine": 39}}}]}, {"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-a0b5df21464e23d9", "level": "note", "message": {"text": "Very large file: packages/frontend/src/app/translator/TranslatorPageClient.tsx (1015 lines)"}, "properties": {"repobilityId": "03e93f01d32f619c", "scanner": "scanner-primary", "fingerprint": "a0b5df21464e23d9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3034b9e27d512538", "level": "note", "message": {"text": "Very large file: packages/frontend/src/app/dashboard/dialer/page.tsx (1030 lines)"}, "properties": {"repobilityId": "a4c75b6e43ad750a", "scanner": "scanner-primary", "fingerprint": "3034b9e27d512538", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-31e7055dd826b4e3", "level": "note", "message": {"text": "Very large file: packages/frontend/src/app/dashboard/calls/page.tsx (945 lines)"}, "properties": {"repobilityId": "c8a175828034d290", "scanner": "scanner-primary", "fingerprint": "31e7055dd826b4e3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d66abe4a4a3d6d03", "level": "note", "message": {"text": "Very large file: packages/frontend/src/lib/i18n/ru.ts (1091 lines)"}, "properties": {"repobilityId": "0ce5db8c3013a603", "scanner": "scanner-primary", "fingerprint": "d66abe4a4a3d6d03", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-82e44987277f3ef8", "level": "note", "message": {"text": "Very large file: packages/backend/src/routes/admin/index.ts (1255 lines)"}, "properties": {"repobilityId": "7e0a3b1530bf9bc2", "scanner": "scanner-primary", "fingerprint": "82e44987277f3ef8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b0a662fe7d31f91b", "level": "note", "message": {"text": "Very large file: packages/backend/src/routes/webhooks/media-stream.ts (1146 lines)"}, "properties": {"repobilityId": "3938be9fbc060c1c", "scanner": "scanner-primary", "fingerprint": "b0a662fe7d31f91b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b1999318b7c18c1e", "level": "note", "message": {"text": "Very large file: packages/backend/src/services/conference-translator.ts (1420 lines)"}, "properties": {"repobilityId": "dd45294ff130b71b", "scanner": "scanner-primary", "fingerprint": "b1999318b7c18c1e", "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": "b661597c5e2425c0", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-faccb9061e9b52a0", "level": "note", "message": {"text": "No README detected"}, "properties": {"repobilityId": "d824ed841d630c0d", "scanner": "scanner-primary", "fingerprint": "faccb9061e9b52a0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["docs", "readme", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "e86875a60408eec4", "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": "093427765d73efa1", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-9d79c4077342a7d0", "level": "warning", "message": {"text": "Runtime service client appears to use placeholder configuration"}, "properties": {"repobilityId": "6b4b9e4bc398a07f", "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": "b0c577cb2b354c7b", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "471f7d1ac7a67f88", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "9d16ce0de86eecac", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "17b143914fbc1469", "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": "23b2894de1ec780f", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-2c5f98b152cddb6d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/launch.json"}, "properties": {"repobilityId": "0de48c0f4ab303d8", "scanner": "scanner-primary", "fingerprint": "2c5f98b152cddb6d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/launch.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4a4e3615d8ad1af9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/frontend/src/app/translator/portal/page.tsx:101"}, "properties": {"repobilityId": "48f13b7b7a696c6d", "scanner": "scanner-primary", "fingerprint": "4a4e3615d8ad1af9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3335c231ac4b0ec2", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/frontend/src/app/translate/[token]/page.tsx:146"}, "properties": {"repobilityId": "7499b3e61dda7c7d", "scanner": "scanner-primary", "fingerprint": "3335c231ac4b0ec2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6f1feb73b21e924e", "level": "none", "message": {"text": "Commented-code block (9 lines) in packages/frontend/src/app/dashboard/settings/_components/GeneralSection.tsx:164"}, "properties": {"repobilityId": "e95273f4d3234dbc", "scanner": "scanner-primary", "fingerprint": "6f1feb73b21e924e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6bbbea037235401a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/frontend/src/app/calls/[id]/monitor/page.tsx:48"}, "properties": {"repobilityId": "5e47d473797bdd52", "scanner": "scanner-primary", "fingerprint": "6bbbea037235401a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5190e91b272af8f1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/frontend/src/lib/api.ts:33"}, "properties": {"repobilityId": "35e758bfa58244c2", "scanner": "scanner-primary", "fingerprint": "5190e91b272af8f1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8a94713bdb0c0fa5", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/frontend/src/lib/use-sandbox-audio.ts:4"}, "properties": {"repobilityId": "a5a71d5982ab2247", "scanner": "scanner-primary", "fingerprint": "8a94713bdb0c0fa5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4991de79b3d3f588", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/frontend/src/lib/use-twilio-device.ts:23"}, "properties": {"repobilityId": "b9d717eeb923195f", "scanner": "scanner-primary", "fingerprint": "4991de79b3d3f588", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d1fa000da2af9afc", "level": "none", "message": {"text": "Commented-code block (6 lines) in packages/backend/src/server.ts:24"}, "properties": {"repobilityId": "e5021c06998d5477", "scanner": "scanner-primary", "fingerprint": "d1fa000da2af9afc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b53f76e47fdc93a6", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/backend/src/middleware/auth.ts:79"}, "properties": {"repobilityId": "290fa895fb780b2d", "scanner": "scanner-primary", "fingerprint": "b53f76e47fdc93a6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8a5731433be9dca1", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/backend/src/routes/auth/session.ts:275"}, "properties": {"repobilityId": "ee4680039267c0aa", "scanner": "scanner-primary", "fingerprint": "8a5731433be9dca1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-34bb6766aabeb9f7", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/backend/src/routes/workspaces/index.ts:86"}, "properties": {"repobilityId": "3ac87257833cf677", "scanner": "scanner-primary", "fingerprint": "34bb6766aabeb9f7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0a37800940d07aaf", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/backend/src/routes/admin/index.ts:487"}, "properties": {"repobilityId": "be4732d00fb54723", "scanner": "scanner-primary", "fingerprint": "0a37800940d07aaf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0620107071b3d8a5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/backend/src/routes/calls/index.ts:254"}, "properties": {"repobilityId": "4152039eca427ac8", "scanner": "scanner-primary", "fingerprint": "0620107071b3d8a5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-02b0bd645d0129c7", "level": "none", "message": {"text": "Commented-code block (6 lines) in packages/backend/src/routes/webhooks/twilio.ts:99"}, "properties": {"repobilityId": "b6b38bf65c0b5943", "scanner": "scanner-primary", "fingerprint": "02b0bd645d0129c7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-229cb902ae50f9e7", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/backend/src/routes/webhooks/media-stream.ts:550"}, "properties": {"repobilityId": "aea527e356ada2e1", "scanner": "scanner-primary", "fingerprint": "229cb902ae50f9e7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-38b9fb7ec83b0861", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/backend/src/routes/webhooks/telegram.ts:45"}, "properties": {"repobilityId": "8c05f9b5ff923db7", "scanner": "scanner-primary", "fingerprint": "38b9fb7ec83b0861", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b87c45e7bd88d733", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/backend/src/services/sms.service.ts:37"}, "properties": {"repobilityId": "875844ec9669282a", "scanner": "scanner-primary", "fingerprint": "b87c45e7bd88d733", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d9a70773f8fcbadb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/backend/src/services/post-call.service.ts:184"}, "properties": {"repobilityId": "6dc2ffa79c2219b7", "scanner": "scanner-primary", "fingerprint": "d9a70773f8fcbadb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8f046cf8feb45d6a", "level": "none", "message": {"text": "Commented-code block (10 lines) in packages/backend/src/services/conference-translator.ts:44"}, "properties": {"repobilityId": "84b732296efbb66c", "scanner": "scanner-primary", "fingerprint": "8f046cf8feb45d6a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a17b3f9805dce535", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/backend/src/services/telegram.service.ts:50"}, "properties": {"repobilityId": "acc4ceac2266fd65", "scanner": "scanner-primary", "fingerprint": "a17b3f9805dce535", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a2ffa721119bab0e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/backend/src/services/recording-storage.service.ts:76"}, "properties": {"repobilityId": "1b851ff9527b1be5", "scanner": "scanner-primary", "fingerprint": "a2ffa721119bab0e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e58ce55992fc5980", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/backend/src/services/stripe-connect.service.ts:46"}, "properties": {"repobilityId": "a15569898da604c0", "scanner": "scanner-primary", "fingerprint": "e58ce55992fc5980", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5d05199b3ac31668", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/backend/src/services/stripe.service.ts:157"}, "properties": {"repobilityId": "d0b9393dfadef79f", "scanner": "scanner-primary", "fingerprint": "5d05199b3ac31668", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-81005bfcdf473b31", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/backend/src/services/stripe.service.ts:91"}, "properties": {"repobilityId": "926e6b45a75955d0", "scanner": "scanner-primary", "fingerprint": "81005bfcdf473b31", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4c1cd8c84dfe81b0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/backend/src/services/tts.service.ts:29"}, "properties": {"repobilityId": "7caef7e6d5114c62", "scanner": "scanner-primary", "fingerprint": "4c1cd8c84dfe81b0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e431fb1d6970adff", "level": "none", "message": {"text": "Commented-code block (6 lines) in packages/backend/src/services/billing.service.ts:146"}, "properties": {"repobilityId": "40618523162ef871", "scanner": "scanner-primary", "fingerprint": "e431fb1d6970adff", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-65da1bd092456dfb", "level": "none", "message": {"text": "Commented-code block (7 lines) in packages/backend/src/db/schema.ts:548"}, "properties": {"repobilityId": "d7086c8b463a61f0", "scanner": "scanner-primary", "fingerprint": "65da1bd092456dfb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dc30a6e56758118a", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/backend/src/realtime/socket-server.ts:289"}, "properties": {"repobilityId": "b69e955440548cf6", "scanner": "scanner-primary", "fingerprint": "dc30a6e56758118a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ad1f2c0971b89ce0", "level": "note", "message": {"text": "10 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "3bfdc60c61f1870e", "scanner": "scanner-primary", "fingerprint": "ad1f2c0971b89ce0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-3a81e797851f8169", "level": "error", "message": {"text": "Dangling fetch: GET /api/calls/${callId}/recording (packages/frontend/src/app/dashboard/calls/page.tsx:270)"}, "properties": {"repobilityId": "161e6a177b34db6f", "scanner": "scanner-primary", "fingerprint": "3a81e797851f8169", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ea169d7578cbefc4", "level": "error", "message": {"text": "Dangling fetch: POST /api/oauth/authorize (packages/frontend/src/app/oauth/authorize/page.tsx:54)"}, "properties": {"repobilityId": "e47f28ab0ff9942f", "scanner": "scanner-primary", "fingerprint": "ea169d7578cbefc4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-11da566d058215d4", "level": "error", "message": {"text": "Dangling fetch: POST /auth/register (packages/frontend/src/lib/api.ts:69)"}, "properties": {"repobilityId": "93a588413bdbb8d3", "scanner": "scanner-primary", "fingerprint": "11da566d058215d4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-c8a042a39053c1c7", "level": "error", "message": {"text": "Dangling fetch: POST /auth/login (packages/frontend/src/lib/api.ts:73)"}, "properties": {"repobilityId": "78ed009b8c43a104", "scanner": "scanner-primary", "fingerprint": "c8a042a39053c1c7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-e214b57cdf0dcf86", "level": "error", "message": {"text": "Dangling fetch: POST https://api.telegram.org/bot${botToken}/sendMessage (packages/backend/src/routes/webhooks/telegram.ts:45)"}, "properties": {"repobilityId": "81fbf725bda3b5d4", "scanner": "scanner-primary", "fingerprint": "e214b57cdf0dcf86", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ec8019a274b4383f", "level": "error", "message": {"text": "Dangling fetch: POST https://api.telegram.org/bot${botToken}/sendVoice (packages/backend/src/routes/webhooks/telegram.ts:118)"}, "properties": {"repobilityId": "2fa4513e0a9d2669", "scanner": "scanner-primary", "fingerprint": "ec8019a274b4383f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-93baafede1ca0958", "level": "error", "message": {"text": "Dangling fetch: POST https://api.telegram.org/bot${botToken}/setMyCommands (packages/backend/src/routes/webhooks/telegram.ts:295)"}, "properties": {"repobilityId": "78d94feae33ca5cf", "scanner": "scanner-primary", "fingerprint": "93baafede1ca0958", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0a3098c3e03d92f5", "level": "error", "message": {"text": "Dangling fetch: POST https://api.telegram.org/bot${botToken}/setWebhook (packages/backend/src/routes/webhooks/telegram.ts:310)"}, "properties": {"repobilityId": "98760bb5e89e03fd", "scanner": "scanner-primary", "fingerprint": "0a3098c3e03d92f5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fad0f1bc083f9d8f", "level": "error", "message": {"text": "Dangling fetch: POST https://api.x.ai/v1/chat/completions (packages/backend/src/services/conference-translator.ts:795)"}, "properties": {"repobilityId": "e0a1dc726dedfb2c", "scanner": "scanner-primary", "fingerprint": "fad0f1bc083f9d8f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-764f276d4871ca88", "level": "error", "message": {"text": "Dangling fetch: POST https://api.telegram.org/bot${botToken}/answerCallbackQuery (packages/backend/src/services/telegram.service.ts:210)"}, "properties": {"repobilityId": "32260001d7e7cd43", "scanner": "scanner-primary", "fingerprint": "764f276d4871ca88", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6dacd4c8bdf45d1e", "level": "error", "message": {"text": "Dangling fetch: GET https://api.telegram.org/bot${botToken}/getFile?file_id=${fileId} (packages/backend/src/services/telegram.service.ts:223)"}, "properties": {"repobilityId": "71ebb20aa3b9af82", "scanner": "scanner-primary", "fingerprint": "6dacd4c8bdf45d1e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c27fe0f14718e430", "level": "error", "message": {"text": "Dangling fetch: GET https://api.telegram.org/file/bot${botToken}/${fileData.result.file_path} (packages/backend/src/services/telegram.service.ts:228)"}, "properties": {"repobilityId": "b6ad3814b0335c6d", "scanner": "scanner-primary", "fingerprint": "c27fe0f14718e430", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1929acf374e5724c", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/audio/transcriptions (packages/backend/src/services/telegram.service.ts:237)"}, "properties": {"repobilityId": "b370fe28553d0a1d", "scanner": "scanner-primary", "fingerprint": "1929acf374e5724c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-219f60908bcde42f", "level": "error", "message": {"text": "Dangling fetch: POST https://connect.stripe.com/oauth/token (packages/backend/src/services/stripe-connect.service.ts:46)"}, "properties": {"repobilityId": "f21b9897c2a7f6d8", "scanner": "scanner-primary", "fingerprint": "219f60908bcde42f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9cdea3bf67fa4ec8", "level": "error", "message": {"text": "Dangling fetch: GET https://api.stripe.com/v1/account (packages/backend/src/services/stripe-connect.service.ts:75)"}, "properties": {"repobilityId": "508b5bb44e62e6e6", "scanner": "scanner-primary", "fingerprint": "9cdea3bf67fa4ec8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ca23ba0b77d1fbb8", "level": "error", "message": {"text": "Dangling fetch: POST https://connect.stripe.com/oauth/deauthorize (packages/backend/src/services/stripe-connect.service.ts:90)"}, "properties": {"repobilityId": "9b5f2d0559bfefa8", "scanner": "scanner-primary", "fingerprint": "ca23ba0b77d1fbb8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b5a6ba42dd801e10", "level": "error", "message": {"text": "Dangling fetch: POST https://api.resend.com/emails (packages/backend/src/services/email.service.ts:21)"}, "properties": {"repobilityId": "5db8dc754262bb7c", "scanner": "scanner-primary", "fingerprint": "b5a6ba42dd801e10", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-dc95f82f11ec499f", "level": "error", "message": {"text": "Dangling fetch: GET https://api.stripe.com/v1${path} (packages/backend/src/services/stripe.service.ts:91)"}, "properties": {"repobilityId": "e091c340d0d29c12", "scanner": "scanner-primary", "fingerprint": "dc95f82f11ec499f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-132e237dd9a80f88", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/audio/speech (packages/backend/src/services/tts.service.ts:83)"}, "properties": {"repobilityId": "f2d7b3b7a220e72a", "scanner": "scanner-primary", "fingerprint": "132e237dd9a80f88", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-079a225de73f87f4", "level": "error", "message": {"text": "Dangling fetch: POST https://api.x.ai/v1/tts (packages/backend/src/services/tts.service.ts:150)"}, "properties": {"repobilityId": "f00932a1559f8390", "scanner": "scanner-primary", "fingerprint": "079a225de73f87f4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9ce039feeb91791f", "level": "note", "message": {"text": "Unused endpoint: POST /auth/set-password"}, "properties": {"repobilityId": "9edc7af2c2dc35a1", "scanner": "scanner-primary", "fingerprint": "9ce039feeb91791f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-031f2448581b7541", "level": "note", "message": {"text": "Unused endpoint: POST /auth/magic-link"}, "properties": {"repobilityId": "69af6c08c9260d37", "scanner": "scanner-primary", "fingerprint": "031f2448581b7541", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8cbf20e974177219", "level": "note", "message": {"text": "Unused endpoint: PUT /translator/defaults"}, "properties": {"repobilityId": "2832b545e58c58ec", "scanner": "scanner-primary", "fingerprint": "8cbf20e974177219", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b38b417c64d7af39", "level": "note", "message": {"text": "Unused endpoint: PUT /workspaces/telegram"}, "properties": {"repobilityId": "c5bf95cb7cbad465", "scanner": "scanner-primary", "fingerprint": "b38b417c64d7af39", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1d347d43d66f048a", "level": "note", "message": {"text": "Unused endpoint: DELETE /workspaces/telegram"}, "properties": {"repobilityId": "5cf182a4301283c4", "scanner": "scanner-primary", "fingerprint": "1d347d43d66f048a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-62442cf9426e3815", "level": "note", "message": {"text": "Unused endpoint: POST /workspaces/test-telegram"}, "properties": {"repobilityId": "3ee81b31f93dfd75", "scanner": "scanner-primary", "fingerprint": "62442cf9426e3815", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cb497b75799bc13e", "level": "note", "message": {"text": "Unused endpoint: DELETE /workspaces/current"}, "properties": {"repobilityId": "1a5f0ea54ceff964", "scanner": "scanner-primary", "fingerprint": "cb497b75799bc13e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-433112f7205b11b4", "level": "note", "message": {"text": "Unused endpoint: POST /telephony/personal-number"}, "properties": {"repobilityId": "cf4b487d3117c090", "scanner": "scanner-primary", "fingerprint": "433112f7205b11b4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8c754233c90bf0cb", "level": "note", "message": {"text": "Unused endpoint: DELETE /telephony/personal-number"}, "properties": {"repobilityId": "443b32cfc77c11a3", "scanner": "scanner-primary", "fingerprint": "8c754233c90bf0cb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c5f3c315dea4ff5d", "level": "note", "message": {"text": "Unused endpoint: DELETE /billing/subscription"}, "properties": {"repobilityId": "129efd30d53bba84", "scanner": "scanner-primary", "fingerprint": "c5f3c315dea4ff5d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7223d9a381d78d50", "level": "note", "message": {"text": "Unused endpoint: POST /billing/downgrade"}, "properties": {"repobilityId": "e8d3ade85f37599f", "scanner": "scanner-primary", "fingerprint": "7223d9a381d78d50", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c7d45e2f691ba823", "level": "note", "message": {"text": "Unused endpoint: POST /billing/reactivate"}, "properties": {"repobilityId": "7cca8363616ec6be", "scanner": "scanner-primary", "fingerprint": "c7d45e2f691ba823", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6ae65195b97962bb", "level": "note", "message": {"text": "Unused endpoint: POST /calls/bulk-delete"}, "properties": {"repobilityId": "a2728668829eb187", "scanner": "scanner-primary", "fingerprint": "6ae65195b97962bb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e82585e3fe92d6e6", "level": "note", "message": {"text": "Unused endpoint: PUT /admin/billing-settings"}, "properties": {"repobilityId": "93e5d754248428ae", "scanner": "scanner-primary", "fingerprint": "e82585e3fe92d6e6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-479353b005c631f2", "level": "note", "message": {"text": "Unused endpoint: PUT /admin/settings"}, "properties": {"repobilityId": "5945c6842644bd1a", "scanner": "scanner-primary", "fingerprint": "479353b005c631f2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d3509b29d27489af", "level": "note", "message": {"text": "Unused endpoint: DELETE /admin/stripe/connect"}, "properties": {"repobilityId": "0abc63e3c23d2789", "scanner": "scanner-primary", "fingerprint": "d3509b29d27489af", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5be00aad8584d4cf", "level": "note", "message": {"text": "Unused endpoint: DELETE /admin/providers/stripe"}, "properties": {"repobilityId": "9d365a8c837a8248", "scanner": "scanner-primary", "fingerprint": "5be00aad8584d4cf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ec33d846c59daaef", "level": "note", "message": {"text": "Unused endpoint: POST /admin/stripe/callback"}, "properties": {"repobilityId": "f095028f843f6099", "scanner": "scanner-primary", "fingerprint": "ec33d846c59daaef", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-86dd25ea09251db5", "level": "note", "message": {"text": "Unused endpoint: GET /admin/promo"}, "properties": {"repobilityId": "32f1658139959337", "scanner": "scanner-primary", "fingerprint": "86dd25ea09251db5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a1a232ab74182748", "level": "note", "message": {"text": "Unused endpoint: POST /admin/promo"}, "properties": {"repobilityId": "0e4355584dce7704", "scanner": "scanner-primary", "fingerprint": "a1a232ab74182748", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6ab2ac3d0b6bc661", "level": "note", "message": {"text": "Unused endpoint: GET /api/billing/plans"}, "properties": {"repobilityId": "946dd97d3396dca5", "scanner": "scanner-primary", "fingerprint": "6ab2ac3d0b6bc661", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0a459f319af665ae", "level": "note", "message": {"text": "Unused endpoint: POST /request-link"}, "properties": {"repobilityId": "ca15c0ce3c130393", "scanner": "scanner-primary", "fingerprint": "0a459f319af665ae", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-822f5812dc9de7a7", "level": "note", "message": {"text": "Unused endpoint: GET /verify"}, "properties": {"repobilityId": "3fef710849982bf0", "scanner": "scanner-primary", "fingerprint": "822f5812dc9de7a7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fd1dc91abf32142d", "level": "note", "message": {"text": "Unused endpoint: GET /me"}, "properties": {"repobilityId": "8cec3a7a50de2f52", "scanner": "scanner-primary", "fingerprint": "fd1dc91abf32142d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b15d518d538de57d", "level": "note", "message": {"text": "Unused endpoint: GET /sessions"}, "properties": {"repobilityId": "ba9a3427fdf51307", "scanner": "scanner-primary", "fingerprint": "b15d518d538de57d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-987dbe53cc0348b4", "level": "note", "message": {"text": "Unused endpoint: GET /sessions/active"}, "properties": {"repobilityId": "541ef2aff307f36f", "scanner": "scanner-primary", "fingerprint": "987dbe53cc0348b4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-52f939032aab887f", "level": "note", "message": {"text": "Unused endpoint: GET /transactions"}, "properties": {"repobilityId": "0410a7565d2bb974", "scanner": "scanner-primary", "fingerprint": "52f939032aab887f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0ae38010c60493f1", "level": "note", "message": {"text": "Unused endpoint: POST /webhook"}, "properties": {"repobilityId": "4cac6cd4ff08865b", "scanner": "scanner-primary", "fingerprint": "0ae38010c60493f1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-12984392acfe07c4", "level": "note", "message": {"text": "Unused endpoint: GET /phone"}, "properties": {"repobilityId": "572d3fc06c1e2ead", "scanner": "scanner-primary", "fingerprint": "12984392acfe07c4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d467299d5c174fc0", "level": "note", "message": {"text": "Unused endpoint: GET /usage"}, "properties": {"repobilityId": "ace5c63fc051db4a", "scanner": "scanner-primary", "fingerprint": "d467299d5c174fc0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a2693505ba3f464c", "level": "note", "message": {"text": "Unused endpoint: GET /line-status"}, "properties": {"repobilityId": "a5868cb379b98023", "scanner": "scanner-primary", "fingerprint": "a2693505ba3f464c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bb80ef2b640dfa02", "level": "note", "message": {"text": "Unused endpoint: GET /defaults"}, "properties": {"repobilityId": "079c65758fdc5f86", "scanner": "scanner-primary", "fingerprint": "bb80ef2b640dfa02", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-12ced4a40f05dd1a", "level": "note", "message": {"text": "Unused endpoint: PUT /defaults"}, "properties": {"repobilityId": "5034b27d7faf81cf", "scanner": "scanner-primary", "fingerprint": "12ced4a40f05dd1a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c32b4607df0975e2", "level": "note", "message": {"text": "Unused endpoint: GET /api-keys"}, "properties": {"repobilityId": "acc8485a01917dda", "scanner": "scanner-primary", "fingerprint": "c32b4607df0975e2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-224cbb7548a6b13c", "level": "note", "message": {"text": "Unused endpoint: POST /api-keys"}, "properties": {"repobilityId": "8e700be4a2bfcddf", "scanner": "scanner-primary", "fingerprint": "224cbb7548a6b13c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-eb6cbd163e296cdb", "level": "note", "message": {"text": "Unused endpoint: DELETE /api-keys/:id"}, "properties": {"repobilityId": "6683857d1c6fc3d1", "scanner": "scanner-primary", "fingerprint": "eb6cbd163e296cdb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-304b6f2b403d93f7", "level": "note", "message": {"text": "Unused endpoint: POST /register"}, "properties": {"repobilityId": "1252f88f4c739ca0", "scanner": "scanner-primary", "fingerprint": "304b6f2b403d93f7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-618721b912bad1c2", "level": "note", "message": {"text": "Unused endpoint: POST /login"}, "properties": {"repobilityId": "56f20b68f4a3ab4b", "scanner": "scanner-primary", "fingerprint": "618721b912bad1c2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2ee4be5d71be34a5", "level": "note", "message": {"text": "Unused endpoint: POST /magic-link"}, "properties": {"repobilityId": "bee2e9425b241fe6", "scanner": "scanner-primary", "fingerprint": "2ee4be5d71be34a5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e9f8cd7a99618efc", "level": "note", "message": {"text": "Unused endpoint: POST /set-password"}, "properties": {"repobilityId": "84aac85bd524800c", "scanner": "scanner-primary", "fingerprint": "e9f8cd7a99618efc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-16a5795e651d0a56", "level": "note", "message": {"text": "Unused endpoint: POST /collect"}, "properties": {"repobilityId": "9b3ba3b9ba624e3e", "scanner": "scanner-primary", "fingerprint": "16a5795e651d0a56", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-959e83c0a87139d8", "level": "note", "message": {"text": "Unused endpoint: GET /current"}, "properties": {"repobilityId": "4cb1250c246bcaa2", "scanner": "scanner-primary", "fingerprint": "959e83c0a87139d8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-63f89b40f32eddd3", "level": "note", "message": {"text": "Unused endpoint: PATCH /current"}, "properties": {"repobilityId": "b5839c50ebc84758", "scanner": "scanner-primary", "fingerprint": "63f89b40f32eddd3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8912a874573ac42d", "level": "note", "message": {"text": "Unused endpoint: DELETE /current"}, "properties": {"repobilityId": "fff7d9daee9545c7", "scanner": "scanner-primary", "fingerprint": "8912a874573ac42d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3e8a0a7b406443bc", "level": "note", "message": {"text": "Unused endpoint: GET /members"}, "properties": {"repobilityId": "5fcd3e81b08349bf", "scanner": "scanner-primary", "fingerprint": "3e8a0a7b406443bc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cbaa8c06323c88f9", "level": "note", "message": {"text": "Unused endpoint: POST /members"}, "properties": {"repobilityId": "8124b6e482746220", "scanner": "scanner-primary", "fingerprint": "cbaa8c06323c88f9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2d965162b8514801", "level": "note", "message": {"text": "Unused endpoint: POST /members/invite"}, "properties": {"repobilityId": "4c807954df262113", "scanner": "scanner-primary", "fingerprint": "2d965162b8514801", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fa8097acf61363a6", "level": "note", "message": {"text": "Unused endpoint: DELETE /members/:id"}, "properties": {"repobilityId": "8f22919bf0acefaa", "scanner": "scanner-primary", "fingerprint": "fa8097acf61363a6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a403c83ed2c5980b", "level": "note", "message": {"text": "Unused endpoint: GET /telegram"}, "properties": {"repobilityId": "c28684d10a6d6ab1", "scanner": "scanner-primary", "fingerprint": "a403c83ed2c5980b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c900fa95f35d0d3f", "level": "note", "message": {"text": "Unused endpoint: PUT /telegram"}, "properties": {"repobilityId": "82a5ccb06094e404", "scanner": "scanner-primary", "fingerprint": "c900fa95f35d0d3f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}