{"version": "2.1.0", "$schema": "https://json.schemastore.org/sarif-2.1.0.json", "runs": [{"tool": {"driver": {"name": "Repobility", "informationUri": "https://repobility.com", "rules": [{"id": "scanner-ec5f31f161e2a6a2", "name": "Possibly dead Python function: verify_api_key", "shortDescription": {"text": "Possibly dead Python function: verify_api_key"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-18f993f6a0926ae9", "name": "Possibly dead Python function: health", "shortDescription": {"text": "Possibly dead Python function: health"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-83dfc01d8efec4b2", "name": "Possibly dead Python function: verify_application_access", "shortDescription": {"text": "Possibly dead Python function: verify_application_access"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a802639ae7e0c06e", "name": "Possibly dead Python function: verify_admin_key", "shortDescription": {"text": "Possibly dead Python function: verify_admin_key"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a957b772d1f6df93", "name": "Possibly dead Python function: check_write_access", "shortDescription": {"text": "Possibly dead Python function: check_write_access"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ab5ab9ef64485a01", "name": "Possibly dead Python function: check_delete_access", "shortDescription": {"text": "Possibly dead Python function: check_delete_access"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6a32c5287d452a98", "name": "Possibly dead Python function: transform_to_patches", "shortDescription": {"text": "Possibly dead Python function: transform_to_patches"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-460e1aaf76a5d697", "name": "Possibly dead Python function: store_memory", "shortDescription": {"text": "Possibly dead Python function: store_memory"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8356dbf2d24d2e24", "name": "Possibly dead Python function: verify_admin_key", "shortDescription": {"text": "Possibly dead Python function: verify_admin_key"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-285b9cef6dc8b779", "name": "Stray `console.log` in TS/JS \u2014 src/dashboard/app.js:902", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/dashboard/app.js:902"}, "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-e066691601852931", "name": "Docker base image is tag-pinned but not digest-pinned: python:3.11-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.11-slim"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9710c8d059e53154", "name": "No frontend routes/components detected", "shortDescription": {"text": "No frontend routes/components detected"}, "fullDescription": {"text": "No React/Vue/Next routes were found. This is fine for backend-only repos."}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5c1f686eb820a32a", "name": "Insecure pattern 'cors_wildcard' in main.py:26", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in main.py:26"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-89042236a22060f4", "name": "Insecure pattern 'cors_wildcard' in src/main.py:83", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in src/main.py:83"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9797530dc165ac69", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/dashboard/app.js:94", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/dashboard/app.js:94"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-28c4a04bd807da0c", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "docker/login-action@v3 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ad6701f0a8405e22", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d298ff6dd2e1a609", "name": "Very large file: src/worker.py (2804 lines)", "shortDescription": {"text": "Very large file: src/worker.py (2804 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-4d1ad4674ef71b36", "name": "Very large file: src/main.py (2789 lines)", "shortDescription": {"text": "Very large file: src/main.py (2789 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-397578a69b068ecb", "name": "Very large file: src/dashboard/router.py (2135 lines)", "shortDescription": {"text": "Very large file: src/dashboard/router.py (2135 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-17c0069b38d20908", "name": "Very large file: src/dashboard/app.js (2628 lines)", "shortDescription": {"text": "Very large file: src/dashboard/app.js (2628 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-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 463 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 24 placeholder/mock markers across 12 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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-9b0f73f2c3f13d7c", "name": "Commented-code block (5 lines) in verify_mcp.py:56", "shortDescription": {"text": "Commented-code block (5 lines) in verify_mcp.py:56"}, "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-10c4e70b03c94aa0", "name": "Legacy-named symbol `expected_legacy` in verify_context_patch_flow.py:26", "shortDescription": {"text": "Legacy-named symbol `expected_legacy` in verify_context_patch_flow.py:26"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-06bda2e96bfb6406", "name": "Commented-code block (8 lines) in tests/unit/test_llm_client_anthropic_and_fallback.py:327", "shortDescription": {"text": "Commented-code block (8 lines) in tests/unit/test_llm_client_anthropic_and_fallback.py:327"}, "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-abdd2eb278ab5c70", "name": "Commented-code block (7 lines) in tests/unit/test_commitment_resolution.py:101", "shortDescription": {"text": "Commented-code block (7 lines) in tests/unit/test_commitment_resolution.py:101"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b43caf115993d6ec", "name": "Commented-code block (18 lines) in tests/benchmark/test_you_marker_gating.py:48", "shortDescription": {"text": "Commented-code block (18 lines) in tests/benchmark/test_you_marker_gating.py:48"}, "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-364137b92e9113a6", "name": "Legacy-named symbol `is_v2` in tests/benchmark/test_extraction_dryrun.py:157", "shortDescription": {"text": "Legacy-named symbol `is_v2` in tests/benchmark/test_extraction_dryrun.py:157"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-495533ef9aa402de", "name": "Commented-code block (5 lines) in scripts/synthesize_passive_learner_history.py:12", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/synthesize_passive_learner_history.py:12"}, "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-a392c03ba9eccf59", "name": "Network/subprocess call without timeout or try/except \u2014 scripts/seed_data.py:139", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/seed_data.py:139"}, "fullDescription": {"text": "`urllib.request.urlopen(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ee91b91db3042c51", "name": "Commented-code block (6 lines) in scripts/backfill_owns_edges.py:90", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/backfill_owns_edges.py:90"}, "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-54aa5acf5254f5f3", "name": "Commented-code block (5 lines) in scripts/verify_data_synthesis.py:129", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/verify_data_synthesis.py:129"}, "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-7644bccb4ee43a87", "name": "Commented-code block (5 lines) in scripts/split_compound_person_patches.py:70", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/split_compound_person_patches.py:70"}, "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-55da3f817aa25838", "name": "Network/subprocess call without timeout or try/except \u2014 scripts/verify_passive_learning.py:39", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/verify_passive_learning.py:39"}, "fullDescription": {"text": "`urllib.request.urlopen(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d7ed756c1866c21c", "name": "Commented-code block (7 lines) in scripts/verify_person_ownership_enforcer.py:53", "shortDescription": {"text": "Commented-code block (7 lines) in scripts/verify_person_ownership_enforcer.py:53"}, "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-0c52e67e2d0d2728", "name": "Network/subprocess call without timeout or try/except \u2014 scripts/verify_person_ownership_enforcer.py:95", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/verify_person_ownership_enforcer.py:95"}, "fullDescription": {"text": "`subprocess.check_output(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-36015d0cd9cc4ccc", "name": "Commented-code block (6 lines) in src/worker.py:341", "shortDescription": {"text": "Commented-code block (6 lines) in src/worker.py:341"}, "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-bc2d5c1abb866e15", "name": "Commented-code block (9 lines) in src/main.py:22", "shortDescription": {"text": "Commented-code block (9 lines) in src/main.py:22"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c44816edd171984c", "name": "Commented-code block (5 lines) in src/dashboard/router.py:400", "shortDescription": {"text": "Commented-code block (5 lines) in src/dashboard/router.py:400"}, "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-09f8d3862412956b", "name": "Commented-code block (7 lines) in src/dashboard/app.js:2401", "shortDescription": {"text": "Commented-code block (7 lines) in src/dashboard/app.js:2401"}, "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-c768f65772bb0314", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/dashboard/app.js:1177", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/dashboard/app.js:1177"}, "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-042b54ea934c73cb", "name": "Commented-code block (5 lines) in src/contextquilt/secrets.py:47", "shortDescription": {"text": "Commented-code block (5 lines) in src/contextquilt/secrets.py:47"}, "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-c2975886e5e0c139", "name": "Legacy-named symbol `stitcher_v2` in src/contextquilt/utils/context_quilt_utils.py:79", "shortDescription": {"text": "Legacy-named symbol `stitcher_v2` in src/contextquilt/utils/context_quilt_utils.py:79"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-18f774cd40167d1e", "name": "Commented-code block (12 lines) in src/contextquilt/services/extraction_schema.py:56", "shortDescription": {"text": "Commented-code block (12 lines) in src/contextquilt/services/extraction_schema.py:56"}, "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-abb43bdb6304550f", "name": "Commented-code block (5 lines) in src/contextquilt/services/recall_scorer.py:48", "shortDescription": {"text": "Commented-code block (5 lines) in src/contextquilt/services/recall_scorer.py:48"}, "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-f7db6675ffb0cd15", "name": "Commented-code block (8 lines) in src/contextquilt/services/recall_formatter.py:24", "shortDescription": {"text": "Commented-code block (8 lines) in src/contextquilt/services/recall_formatter.py: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-022e6399d1ef2beb", "name": "12 env vars used in code but missing from .env.example", "shortDescription": {"text": "12 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `CQ_BASE_URL`, `CQ_GCP_PROJECT`, `CQ_SSH_KEY`, `CQ_SSH_TARGET`, `DATABASE_URL`, `MEETINGS_PATH`, `MODE`, `OPENAI_API_KEY` + 4 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-02525d39071dd2c7", "name": "Near-duplicate function bodies in 5 places", "shortDescription": {"text": "Near-duplicate function bodies in 5 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nscripts/load_seed_data.py:main, scripts/migrate_normalization.py:migrate_normalization, scripts/migrate_profile_identity.py:migrate_profile_identity, scripts/migrate_prompt_versions.py:migrate_prompt_versions\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-be46ea126aa5d8dc", "name": "Near-duplicate function bodies in 3 places", "shortDescription": {"text": "Near-duplicate function bodies in 3 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nscripts/backfill_strip_you_marker.py:main, scripts/backfill_archive_placeholder_persons.py:main, scripts/backfill_person_name_hygiene.py:main\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nscripts/verify_users_query.py:test_users_query, src/dashboard/router.py:get_users\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-62893a3079d25fac", "name": "FastAPI PATCH `update_application` without auth dependency \u2014 src/main.py:2761", "shortDescription": {"text": "FastAPI PATCH `update_application` without auth dependency \u2014 src/main.py:2761"}, "fullDescription": {"text": "`@router.patch` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d05b8f9694b41a05", "name": "Dangling fetch: GET /api/dashboard/patch-types (src/dashboard/app.js:85)", "shortDescription": {"text": "Dangling fetch: GET /api/dashboard/patch-types (src/dashboard/app.js:85)"}, "fullDescription": {"text": "`src/dashboard/app.js:85` calls `GET /api/dashboard/patch-types` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dashboard/patch-types`\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-29277b00feeeb690", "name": "Dangling fetch: PUT /api/dashboard/patch-types/${typeKey} (src/dashboard/app.js:116)", "shortDescription": {"text": "Dangling fetch: PUT /api/dashboard/patch-types/${typeKey} (src/dashboard/app.js:116)"}, "fullDescription": {"text": "`src/dashboard/app.js:116` calls `PUT /api/dashboard/patch-types/${typeKey}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dashboard/patch-types/<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-1148031f9e4a7367", "name": "Dangling fetch: POST /api/dashboard/patch-types (src/dashboard/app.js:133)", "shortDescription": {"text": "Dangling fetch: POST /api/dashboard/patch-types (src/dashboard/app.js:133)"}, "fullDescription": {"text": "`src/dashboard/app.js:133` calls `POST /api/dashboard/patch-types` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dashboard/patch-types`\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-eaacd6eb4b910e0c", "name": "Dangling fetch: GET /api/dashboard/connections (src/dashboard/app.js:146)", "shortDescription": {"text": "Dangling fetch: GET /api/dashboard/connections (src/dashboard/app.js:146)"}, "fullDescription": {"text": "`src/dashboard/app.js:146` calls `GET /api/dashboard/connections` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dashboard/connections`\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-f834dcc3cd080994", "name": "Dangling fetch: POST /api/dashboard/connections (src/dashboard/app.js:181)", "shortDescription": {"text": "Dangling fetch: POST /api/dashboard/connections (src/dashboard/app.js:181)"}, "fullDescription": {"text": "`src/dashboard/app.js:181` calls `POST /api/dashboard/connections` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dashboard/connections`\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-b52e28f0495ebf0b", "name": "Dangling fetch: GET /api/dashboard/metrics/summary?days=30 (src/dashboard/app.js:206)", "shortDescription": {"text": "Dangling fetch: GET /api/dashboard/metrics/summary?days=30 (src/dashboard/app.js:206)"}, "fullDescription": {"text": "`src/dashboard/app.js:206` calls `GET /api/dashboard/metrics/summary?days=30` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dashboard/metrics/summary`\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-b8bd00d44bbc8048", "name": "Dangling fetch: GET /api/dashboard/metrics/cost?days=30 (src/dashboard/app.js:217)", "shortDescription": {"text": "Dangling fetch: GET /api/dashboard/metrics/cost?days=30 (src/dashboard/app.js:217)"}, "fullDescription": {"text": "`src/dashboard/app.js:217` calls `GET /api/dashboard/metrics/cost?days=30` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dashboard/metrics/cost`\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-5cbc8d5327e9716c", "name": "Dangling fetch: GET /api/dashboard/metrics/models?days=30 (src/dashboard/app.js:248)", "shortDescription": {"text": "Dangling fetch: GET /api/dashboard/metrics/models?days=30 (src/dashboard/app.js:248)"}, "fullDescription": {"text": "`src/dashboard/app.js:248` calls `GET /api/dashboard/metrics/models?days=30` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dashboard/metrics/models`\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-6a4787665cd0b3c6", "name": "Dangling fetch: GET /api/dashboard/metrics/recent?limit=50 (src/dashboard/app.js:270)", "shortDescription": {"text": "Dangling fetch: GET /api/dashboard/metrics/recent?limit=50 (src/dashboard/app.js:270)"}, "fullDescription": {"text": "`src/dashboard/app.js:270` calls `GET /api/dashboard/metrics/recent?limit=50` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dashboard/metrics/recent`\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-21018de9b7a886cd", "name": "Dangling fetch: GET /api/dashboard/health-check (src/dashboard/app.js:298)", "shortDescription": {"text": "Dangling fetch: GET /api/dashboard/health-check (src/dashboard/app.js:298)"}, "fullDescription": {"text": "`src/dashboard/app.js:298` calls `GET /api/dashboard/health-check` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dashboard/health-check`\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-895615c901ac1e2d", "name": "Dangling fetch: GET /api/dashboard/backup/status (src/dashboard/app.js:384)", "shortDescription": {"text": "Dangling fetch: GET /api/dashboard/backup/status (src/dashboard/app.js:384)"}, "fullDescription": {"text": "`src/dashboard/app.js:384` calls `GET /api/dashboard/backup/status` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dashboard/backup/status`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a2fcec3c7fb36a3d", "name": "Dangling fetch: GET /api/dashboard/backup/history?limit=30 (src/dashboard/app.js:385)", "shortDescription": {"text": "Dangling fetch: GET /api/dashboard/backup/history?limit=30 (src/dashboard/app.js:385)"}, "fullDescription": {"text": "`src/dashboard/app.js:385` calls `GET /api/dashboard/backup/history?limit=30` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dashboard/backup/history`\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-28953ef071964743", "name": "Dangling fetch: GET /api/dashboard/config (src/dashboard/app.js:464)", "shortDescription": {"text": "Dangling fetch: GET /api/dashboard/config (src/dashboard/app.js:464)"}, "fullDescription": {"text": "`src/dashboard/app.js:464` calls `GET /api/dashboard/config` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dashboard/config`\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-c55085b16c35100b", "name": "Dangling fetch: GET /api/dashboard/prompts (src/dashboard/app.js:490)", "shortDescription": {"text": "Dangling fetch: GET /api/dashboard/prompts (src/dashboard/app.js:490)"}, "fullDescription": {"text": "`src/dashboard/app.js:490` calls `GET /api/dashboard/prompts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dashboard/prompts`\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-df15b2885bbaf746", "name": "Dangling fetch: PUT /api/dashboard/prompts/${key} (src/dashboard/app.js:520)", "shortDescription": {"text": "Dangling fetch: PUT /api/dashboard/prompts/${key} (src/dashboard/app.js:520)"}, "fullDescription": {"text": "`src/dashboard/app.js:520` calls `PUT /api/dashboard/prompts/${key}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dashboard/prompts/<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-b03336865f869f88", "name": "Dangling fetch: GET /api/dashboard/ingestion-log?limit=50 (src/dashboard/app.js:636)", "shortDescription": {"text": "Dangling fetch: GET /api/dashboard/ingestion-log?limit=50 (src/dashboard/app.js:636)"}, "fullDescription": {"text": "`src/dashboard/app.js:636` calls `GET /api/dashboard/ingestion-log?limit=50` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dashboard/ingestion-log`\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-493c8de3be93066d", "name": "Dangling fetch: GET /api/dashboard/patches/history?${params}&granularity=${currentGranularity.unit} (src/dashboard/app.j", "shortDescription": {"text": "Dangling fetch: GET /api/dashboard/patches/history?${params}&granularity=${currentGranularity.unit} (src/dashboard/app.js:686)"}, "fullDescription": {"text": "`src/dashboard/app.js:686` calls `GET /api/dashboard/patches/history?${params}&granularity=${currentGranularity.unit}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dashboard/patches/history`\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-da0d5d65e6d28bc5", "name": "Dangling fetch: GET /api/dashboard/users (src/dashboard/app.js:740)", "shortDescription": {"text": "Dangling fetch: GET /api/dashboard/users (src/dashboard/app.js:740)"}, "fullDescription": {"text": "`src/dashboard/app.js:740` calls `GET /api/dashboard/users` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dashboard/users`\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-3ab40a43c1a76595", "name": "Dangling fetch: GET /api/dashboard/users/${encodeURIComponent(userId)}/quilt (src/dashboard/app.js:921)", "shortDescription": {"text": "Dangling fetch: GET /api/dashboard/users/${encodeURIComponent(userId)}/quilt (src/dashboard/app.js:921)"}, "fullDescription": {"text": "`src/dashboard/app.js:921` calls `GET /api/dashboard/users/${encodeURIComponent(userId)}/quilt` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dashboard/users/<p>/quilt`\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-eabad4c438041b6f", "name": "Dangling fetch: PATCH /api/dashboard/patches/${patchId} (src/dashboard/app.js:1169)", "shortDescription": {"text": "Dangling fetch: PATCH /api/dashboard/patches/${patchId} (src/dashboard/app.js:1169)"}, "fullDescription": {"text": "`src/dashboard/app.js:1169` calls `PATCH /api/dashboard/patches/${patchId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dashboard/patches/<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-fcbb36ea0baf646c", "name": "Dangling fetch: GET /api/dashboard/users/${userId}/quilt (src/dashboard/app.js:1177)", "shortDescription": {"text": "Dangling fetch: GET /api/dashboard/users/${userId}/quilt (src/dashboard/app.js:1177)"}, "fullDescription": {"text": "`src/dashboard/app.js:1177` calls `GET /api/dashboard/users/${userId}/quilt` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dashboard/users/<p>/quilt`\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-ac6b23169006370e", "name": "Dangling fetch: DELETE /api/dashboard/patches/${patchId} (src/dashboard/app.js:1193)", "shortDescription": {"text": "Dangling fetch: DELETE /api/dashboard/patches/${patchId} (src/dashboard/app.js:1193)"}, "fullDescription": {"text": "`src/dashboard/app.js:1193` calls `DELETE /api/dashboard/patches/${patchId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dashboard/patches/<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-7e2d293c9b47de19", "name": "Dangling fetch: GET /api/dashboard/users/${userId}/quilt (src/dashboard/app.js:1199)", "shortDescription": {"text": "Dangling fetch: GET /api/dashboard/users/${userId}/quilt (src/dashboard/app.js:1199)"}, "fullDescription": {"text": "`src/dashboard/app.js:1199` calls `GET /api/dashboard/users/${userId}/quilt` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dashboard/users/<p>/quilt`\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-1cd6975841808ef8", "name": "Dangling fetch: GET /api/dashboard/stats?${params} (src/dashboard/app.js:1594)", "shortDescription": {"text": "Dangling fetch: GET /api/dashboard/stats?${params} (src/dashboard/app.js:1594)"}, "fullDescription": {"text": "`src/dashboard/app.js:1594` calls `GET /api/dashboard/stats?${params}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dashboard/stats`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f243e704c749c6f3", "name": "Dangling fetch: GET /api/dashboard/patches/distribution?group_by=${groupBy}&${params} (src/dashboard/app.js:1779)", "shortDescription": {"text": "Dangling fetch: GET /api/dashboard/patches/distribution?group_by=${groupBy}&${params} (src/dashboard/app.js:1779)"}, "fullDescription": {"text": "`src/dashboard/app.js:1779` calls `GET /api/dashboard/patches/distribution?group_by=${groupBy}&${params}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dashboard/patches/distribution`\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-67f16eb83ffc76c8", "name": "Dangling fetch: POST /api/dashboard/test-pipeline (src/dashboard/app.js:2026)", "shortDescription": {"text": "Dangling fetch: POST /api/dashboard/test-pipeline (src/dashboard/app.js:2026)"}, "fullDescription": {"text": "`src/dashboard/app.js:2026` calls `POST /api/dashboard/test-pipeline` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dashboard/test-pipeline`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f244c1adb41bcd00", "name": "Dangling fetch: GET /api/dashboard/alerts/categories (src/dashboard/app.js:2184)", "shortDescription": {"text": "Dangling fetch: GET /api/dashboard/alerts/categories (src/dashboard/app.js:2184)"}, "fullDescription": {"text": "`src/dashboard/app.js:2184` calls `GET /api/dashboard/alerts/categories` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dashboard/alerts/categories`\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-68515c986d3471e1", "name": "Dangling fetch: GET /api/dashboard/alerts/recipients (src/dashboard/app.js:2211)", "shortDescription": {"text": "Dangling fetch: GET /api/dashboard/alerts/recipients (src/dashboard/app.js:2211)"}, "fullDescription": {"text": "`src/dashboard/app.js:2211` calls `GET /api/dashboard/alerts/recipients` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dashboard/alerts/recipients`\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-d040839a940e4b73", "name": "Dangling fetch: POST /api/dashboard/alerts/recipients (src/dashboard/app.js:2261)", "shortDescription": {"text": "Dangling fetch: POST /api/dashboard/alerts/recipients (src/dashboard/app.js:2261)"}, "fullDescription": {"text": "`src/dashboard/app.js:2261` calls `POST /api/dashboard/alerts/recipients` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dashboard/alerts/recipients`\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-506a34058cd6414b", "name": "Dangling fetch: PATCH /api/dashboard/alerts/recipients/${id} (src/dashboard/app.js:2281)", "shortDescription": {"text": "Dangling fetch: PATCH /api/dashboard/alerts/recipients/${id} (src/dashboard/app.js:2281)"}, "fullDescription": {"text": "`src/dashboard/app.js:2281` calls `PATCH /api/dashboard/alerts/recipients/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dashboard/alerts/recipients/<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-39ab8a4b11a449d0", "name": "Dangling fetch: DELETE /api/dashboard/alerts/recipients/${id} (src/dashboard/app.js:2296)", "shortDescription": {"text": "Dangling fetch: DELETE /api/dashboard/alerts/recipients/${id} (src/dashboard/app.js:2296)"}, "fullDescription": {"text": "`src/dashboard/app.js:2296` calls `DELETE /api/dashboard/alerts/recipients/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dashboard/alerts/recipients/<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-f2daac6448c4aa80", "name": "Dangling fetch: POST /api/dashboard/alerts/test-send (src/dashboard/app.js:2317)", "shortDescription": {"text": "Dangling fetch: POST /api/dashboard/alerts/test-send (src/dashboard/app.js:2317)"}, "fullDescription": {"text": "`src/dashboard/app.js:2317` calls `POST /api/dashboard/alerts/test-send` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dashboard/alerts/test-send`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e42f5434e9942861", "name": "Dangling fetch: GET /api/dashboard/alerts/incidents?limit=100 (src/dashboard/app.js:2351)", "shortDescription": {"text": "Dangling fetch: GET /api/dashboard/alerts/incidents?limit=100 (src/dashboard/app.js:2351)"}, "fullDescription": {"text": "`src/dashboard/app.js:2351` calls `GET /api/dashboard/alerts/incidents?limit=100` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dashboard/alerts/incidents`\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-c0331c6166820dcd", "name": "Dangling fetch: GET /api/dashboard/providers (src/dashboard/app.js:2412)", "shortDescription": {"text": "Dangling fetch: GET /api/dashboard/providers (src/dashboard/app.js:2412)"}, "fullDescription": {"text": "`src/dashboard/app.js:2412` calls `GET /api/dashboard/providers` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dashboard/providers`\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-e70cbcf66bb28da7", "name": "Dangling fetch: GET /api/dashboard/provider-health (src/dashboard/app.js:2413)", "shortDescription": {"text": "Dangling fetch: GET /api/dashboard/provider-health (src/dashboard/app.js:2413)"}, "fullDescription": {"text": "`src/dashboard/app.js:2413` calls `GET /api/dashboard/provider-health` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dashboard/provider-health`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bae6714478f88d1b", "name": "Dangling fetch: POST /api/dashboard/update-key (src/dashboard/app.js:2499)", "shortDescription": {"text": "Dangling fetch: POST /api/dashboard/update-key (src/dashboard/app.js:2499)"}, "fullDescription": {"text": "`src/dashboard/app.js:2499` calls `POST /api/dashboard/update-key` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dashboard/update-key`\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-9c15fd27fa3573af", "name": "Dangling fetch: POST /api/dashboard/test-provider (src/dashboard/app.js:2524)", "shortDescription": {"text": "Dangling fetch: POST /api/dashboard/test-provider (src/dashboard/app.js:2524)"}, "fullDescription": {"text": "`src/dashboard/app.js:2524` calls `POST /api/dashboard/test-provider` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dashboard/test-provider`\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-99545cc510c8bdae", "name": "Dangling fetch: GET /api/dashboard/memory-health?days=30 (src/dashboard/app.js:2567)", "shortDescription": {"text": "Dangling fetch: GET /api/dashboard/memory-health?days=30 (src/dashboard/app.js:2567)"}, "fullDescription": {"text": "`src/dashboard/app.js:2567` calls `GET /api/dashboard/memory-health?days=30` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dashboard/memory-health`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`main.py` declares `GET /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ccc1f1eb89948c62", "name": "Unused endpoint: POST /v1/chat", "shortDescription": {"text": "Unused endpoint: POST /v1/chat"}, "fullDescription": {"text": "`main.py` declares `POST /v1/chat` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1fe09711c5b12bf5", "name": "Unused endpoint: GET /v1/memory/{user_id}", "shortDescription": {"text": "Unused endpoint: GET /v1/memory/{user_id}"}, "fullDescription": {"text": "`main.py` declares `GET /v1/memory/{user_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-0cf7bf86ec5f6e50", "name": "Unused endpoint: PUT /v1/memory/{user_id}", "shortDescription": {"text": "Unused endpoint: PUT /v1/memory/{user_id}"}, "fullDescription": {"text": "`main.py` declares `PUT /v1/memory/{user_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-298c41f530b3b0a0", "name": "Unused endpoint: POST /v1/enrich", "shortDescription": {"text": "Unused endpoint: POST /v1/enrich"}, "fullDescription": {"text": "`src/main.py` declares `POST /v1/enrich` 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-48842a8b0cba21c9", "name": "Unused endpoint: GET /v1/schema", "shortDescription": {"text": "Unused endpoint: GET /v1/schema"}, "fullDescription": {"text": "`src/main.py` declares `GET /v1/schema` 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-3f0577a7043d5c11", "name": "Unused endpoint: POST /v1/recall", "shortDescription": {"text": "Unused endpoint: POST /v1/recall"}, "fullDescription": {"text": "`src/main.py` declares `POST /v1/recall` 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-9fc2464a4283e03f", "name": "Unused endpoint: GET /v1/profile/{user_id}", "shortDescription": {"text": "Unused endpoint: GET /v1/profile/{user_id}"}, "fullDescription": {"text": "`src/main.py` declares `GET /v1/profile/{user_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-239dc28d13c49273", "name": "Unused endpoint: POST /v1/memory", "shortDescription": {"text": "Unused endpoint: POST /v1/memory"}, "fullDescription": {"text": "`src/main.py` declares `POST /v1/memory` 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-4a5591033d1fadfb", "name": "Unused endpoint: POST /v1/prewarm", "shortDescription": {"text": "Unused endpoint: POST /v1/prewarm"}, "fullDescription": {"text": "`src/main.py` declares `POST /v1/prewarm` 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-41d4d409d7a62d4e", "name": "Unused endpoint: POST /v1/auth/token", "shortDescription": {"text": "Unused endpoint: POST /v1/auth/token"}, "fullDescription": {"text": "`src/main.py` declares `POST /v1/auth/token` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d7e2830390e2654a", "name": "Unused endpoint: GET /v1/quilt/{user_id}", "shortDescription": {"text": "Unused endpoint: GET /v1/quilt/{user_id}"}, "fullDescription": {"text": "`src/main.py` declares `GET /v1/quilt/{user_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-3483220caa4f921e", "name": "Unused endpoint: PATCH /v1/quilt/{user_id}/patches/{patch_id}", "shortDescription": {"text": "Unused endpoint: PATCH /v1/quilt/{user_id}/patches/{patch_id}"}, "fullDescription": {"text": "`src/main.py` declares `PATCH /v1/quilt/{user_id}/patches/{patch_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-c273e9ba8bada49a", "name": "Unused endpoint: POST /v1/quilt/{user_id}/patches/{patch_id}/complete", "shortDescription": {"text": "Unused endpoint: POST /v1/quilt/{user_id}/patches/{patch_id}/complete"}, "fullDescription": {"text": "`src/main.py` declares `POST /v1/quilt/{user_id}/patches/{patch_id}/complete` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-057460aea215adde", "name": "Unused endpoint: DELETE /v1/quilt/{user_id}/patches/{patch_id}", "shortDescription": {"text": "Unused endpoint: DELETE /v1/quilt/{user_id}/patches/{patch_id}"}, "fullDescription": {"text": "`src/main.py` declares `DELETE /v1/quilt/{user_id}/patches/{patch_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-e30eedec4972f84c", "name": "Unused endpoint: DELETE /v1/quilt/{user_id}", "shortDescription": {"text": "Unused endpoint: DELETE /v1/quilt/{user_id}"}, "fullDescription": {"text": "`src/main.py` declares `DELETE /v1/quilt/{user_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-9592f2a562a09a1b", "name": "Unused endpoint: POST /v1/quilt/{user_id}/patches", "shortDescription": {"text": "Unused endpoint: POST /v1/quilt/{user_id}/patches"}, "fullDescription": {"text": "`src/main.py` declares `POST /v1/quilt/{user_id}/patches` 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-df774ddd874db66b", "name": "Unused endpoint: POST /v1/quilt/{user_id}/connections", "shortDescription": {"text": "Unused endpoint: POST /v1/quilt/{user_id}/connections"}, "fullDescription": {"text": "`src/main.py` declares `POST /v1/quilt/{user_id}/connections` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-db3bf8bd679ac390", "name": "Unused endpoint: DELETE /v1/quilt/{user_id}/connections", "shortDescription": {"text": "Unused endpoint: DELETE /v1/quilt/{user_id}/connections"}, "fullDescription": {"text": "`src/main.py` declares `DELETE /v1/quilt/{user_id}/connections` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6259aad39cc9fbde", "name": "Unused endpoint: POST /v1/quilt/{user_id}/rename-speaker", "shortDescription": {"text": "Unused endpoint: POST /v1/quilt/{user_id}/rename-speaker"}, "fullDescription": {"text": "`src/main.py` declares `POST /v1/quilt/{user_id}/rename-speaker` 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-86782712d4feac11", "name": "Unused endpoint: POST /v1/quilt/{user_id}/reassign-speaker", "shortDescription": {"text": "Unused endpoint: POST /v1/quilt/{user_id}/reassign-speaker"}, "fullDescription": {"text": "`src/main.py` declares `POST /v1/quilt/{user_id}/reassign-speaker` 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-f2f1054871f10aa7", "name": "Unused endpoint: GET /v1/projects/{user_id}", "shortDescription": {"text": "Unused endpoint: GET /v1/projects/{user_id}"}, "fullDescription": {"text": "`src/main.py` declares `GET /v1/projects/{user_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-cacc332966970f61", "name": "Unused endpoint: POST /v1/projects/{user_id}", "shortDescription": {"text": "Unused endpoint: POST /v1/projects/{user_id}"}, "fullDescription": {"text": "`src/main.py` declares `POST /v1/projects/{user_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-b35861c1682ad644", "name": "Unused endpoint: PATCH /v1/projects/{user_id}/{project_id}", "shortDescription": {"text": "Unused endpoint: PATCH /v1/projects/{user_id}/{project_id}"}, "fullDescription": {"text": "`src/main.py` declares `PATCH /v1/projects/{user_id}/{project_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-15bba83c8cdc1141", "name": "Unused endpoint: POST /v1/origins/{user_id}/{origin_type}/{origin_id}/assign-project", "shortDescription": {"text": "Unused endpoint: POST /v1/origins/{user_id}/{origin_type}/{origin_id}/assign-project"}, "fullDescription": {"text": "`src/main.py` declares `POST /v1/origins/{user_id}/{origin_type}/{origin_id}/assign-project` 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-e5d44bd25e1177c0", "name": "Unused endpoint: GET /verify-key", "shortDescription": {"text": "Unused endpoint: GET /verify-key"}, "fullDescription": {"text": "`src/dashboard/router.py` declares `GET /verify-key` 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-cd8dc4599ec52a08", "name": "Unused endpoint: GET /stats", "shortDescription": {"text": "Unused endpoint: GET /stats"}, "fullDescription": {"text": "`src/dashboard/router.py` declares `GET /stats` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-338d20c16afac08a", "name": "Unused endpoint: GET /patches/recent", "shortDescription": {"text": "Unused endpoint: GET /patches/recent"}, "fullDescription": {"text": "`src/dashboard/router.py` declares `GET /patches/recent` 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-4adc05445b1456fe", "name": "Unused endpoint: GET /patches/history", "shortDescription": {"text": "Unused endpoint: GET /patches/history"}, "fullDescription": {"text": "`src/dashboard/router.py` declares `GET /patches/history` 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-69f5db4a8116b8ad", "name": "Unused endpoint: GET /ingestion-log", "shortDescription": {"text": "Unused endpoint: GET /ingestion-log"}, "fullDescription": {"text": "`src/dashboard/router.py` declares `GET /ingestion-log` 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-9f0c1251a3e19f3c", "name": "Unused endpoint: GET /apps", "shortDescription": {"text": "Unused endpoint: GET /apps"}, "fullDescription": {"text": "`src/dashboard/router.py` declares `GET /apps` 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-01a333a34760fca3", "name": "Unused endpoint: GET /prompts", "shortDescription": {"text": "Unused endpoint: GET /prompts"}, "fullDescription": {"text": "`src/dashboard/router.py` declares `GET /prompts` 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-f6b26aa438710bab", "name": "Unused endpoint: PUT /prompts/{prompt_key}", "shortDescription": {"text": "Unused endpoint: PUT /prompts/{prompt_key}"}, "fullDescription": {"text": "`src/dashboard/router.py` declares `PUT /prompts/{prompt_key}` 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-6435fa49bf8a6b16", "name": "Unused endpoint: GET /patches/distribution", "shortDescription": {"text": "Unused endpoint: GET /patches/distribution"}, "fullDescription": {"text": "`src/dashboard/router.py` declares `GET /patches/distribution` 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-841e50bf821e4158", "name": "Unused endpoint: GET /users", "shortDescription": {"text": "Unused endpoint: GET /users"}, "fullDescription": {"text": "`src/dashboard/router.py` declares `GET /users` 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-cd6ae0d8c41a6338", "name": "Unused endpoint: GET /users/{user_id}/quilt", "shortDescription": {"text": "Unused endpoint: GET /users/{user_id}/quilt"}, "fullDescription": {"text": "`src/dashboard/router.py` declares `GET /users/{user_id}/quilt` 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-bbd0713f2370d0bf", "name": "Unused endpoint: PATCH /patches/{patch_id}", "shortDescription": {"text": "Unused endpoint: PATCH /patches/{patch_id}"}, "fullDescription": {"text": "`src/dashboard/router.py` declares `PATCH /patches/{patch_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-d6642ba898816e53", "name": "Unused endpoint: DELETE /patches/{patch_id}", "shortDescription": {"text": "Unused endpoint: DELETE /patches/{patch_id}"}, "fullDescription": {"text": "`src/dashboard/router.py` declares `DELETE /patches/{patch_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-82ef798efc39bfb8", "name": "Unused endpoint: GET /patch-types", "shortDescription": {"text": "Unused endpoint: GET /patch-types"}, "fullDescription": {"text": "`src/dashboard/router.py` declares `GET /patch-types` 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-788e83d7c343cadf", "name": "Unused endpoint: POST /patch-types", "shortDescription": {"text": "Unused endpoint: POST /patch-types"}, "fullDescription": {"text": "`src/dashboard/router.py` declares `POST /patch-types` 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-214377d5bc0221ed", "name": "Unused endpoint: PUT /patch-types/{type_key}", "shortDescription": {"text": "Unused endpoint: PUT /patch-types/{type_key}"}, "fullDescription": {"text": "`src/dashboard/router.py` declares `PUT /patch-types/{type_key}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d66620f80b8de740", "name": "Unused endpoint: GET /connections", "shortDescription": {"text": "Unused endpoint: GET /connections"}, "fullDescription": {"text": "`src/dashboard/router.py` declares `GET /connections` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ff5506d508a76790", "name": "Unused endpoint: POST /connections", "shortDescription": {"text": "Unused endpoint: POST /connections"}, "fullDescription": {"text": "`src/dashboard/router.py` declares `POST /connections` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8c8ff6616246403e", "name": "Unused endpoint: PUT /connections/{label}", "shortDescription": {"text": "Unused endpoint: PUT /connections/{label}"}, "fullDescription": {"text": "`src/dashboard/router.py` declares `PUT /connections/{label}` 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-e21cf4ee09f7c6a9", "name": "Unused endpoint: GET /providers", "shortDescription": {"text": "Unused endpoint: GET /providers"}, "fullDescription": {"text": "`src/dashboard/router.py` declares `GET /providers` 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-bb0f1bc0e4a1a740", "name": "Unused endpoint: POST /update-key", "shortDescription": {"text": "Unused endpoint: POST /update-key"}, "fullDescription": {"text": "`src/dashboard/router.py` declares `POST /update-key` 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-06b84b3da233bf08", "name": "Unused endpoint: POST /test-provider", "shortDescription": {"text": "Unused endpoint: POST /test-provider"}, "fullDescription": {"text": "`src/dashboard/router.py` declares `POST /test-provider` 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-84a4f2d35feb7b30", "name": "Unused endpoint: GET /provider-health", "shortDescription": {"text": "Unused endpoint: GET /provider-health"}, "fullDescription": {"text": "`src/dashboard/router.py` declares `GET /provider-health` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a6f48e60c30777ab", "name": "Unused endpoint: GET /config", "shortDescription": {"text": "Unused endpoint: GET /config"}, "fullDescription": {"text": "`src/dashboard/router.py` declares `GET /config` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c5aa2b12717b3df5", "name": "Unused endpoint: POST /test-pipeline", "shortDescription": {"text": "Unused endpoint: POST /test-pipeline"}, "fullDescription": {"text": "`src/dashboard/router.py` declares `POST /test-pipeline` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/19093"}, "properties": {"repository": "scottxxxxx/contextquilt", "repoUrl": "https://github.com/scottxxxxx/contextquilt", "branch": "main"}, "results": [{"ruleId": "scanner-ec5f31f161e2a6a2", "level": "note", "message": {"text": "Possibly dead Python function: verify_api_key"}, "properties": {"repobilityId": "7e20521df243db65", "scanner": "scanner-primary", "fingerprint": "ec5f31f161e2a6a2", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "main.py:100"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-18f993f6a0926ae9", "level": "note", "message": {"text": "Possibly dead Python function: health"}, "properties": {"repobilityId": "b0dbdc8073a0048c", "scanner": "scanner-primary", "fingerprint": "18f993f6a0926ae9", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/mcp_server.py:512"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-83dfc01d8efec4b2", "level": "note", "message": {"text": "Possibly dead Python function: verify_application_access"}, "properties": {"repobilityId": "687a886401609182", "scanner": "scanner-primary", "fingerprint": "83dfc01d8efec4b2", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/main.py:292"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a802639ae7e0c06e", "level": "note", "message": {"text": "Possibly dead Python function: verify_admin_key"}, "properties": {"repobilityId": "ac0095d3a3c9b469", "scanner": "scanner-primary", "fingerprint": "a802639ae7e0c06e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/dashboard/router.py:25"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a957b772d1f6df93", "level": "note", "message": {"text": "Possibly dead Python function: check_write_access"}, "properties": {"repobilityId": "5f41fb6ee47b62ab", "scanner": "scanner-primary", "fingerprint": "a957b772d1f6df93", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/contextquilt/access.py:32"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ab5ab9ef64485a01", "level": "note", "message": {"text": "Possibly dead Python function: check_delete_access"}, "properties": {"repobilityId": "d8ba87c17c43213f", "scanner": "scanner-primary", "fingerprint": "ab5ab9ef64485a01", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/contextquilt/access.py:46"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6a32c5287d452a98", "level": "note", "message": {"text": "Possibly dead Python function: transform_to_patches"}, "properties": {"repobilityId": "5cf249b05f02ea7f", "scanner": "scanner-primary", "fingerprint": "6a32c5287d452a98", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/contextquilt/utils/context_quilt_utils.py:50"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-460e1aaf76a5d697", "level": "note", "message": {"text": "Possibly dead Python function: store_memory"}, "properties": {"repobilityId": "f99f1ef827044b8f", "scanner": "scanner-primary", "fingerprint": "460e1aaf76a5d697", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/contextquilt/memory/layer.py:69"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8356dbf2d24d2e24", "level": "note", "message": {"text": "Possibly dead Python function: verify_admin_key"}, "properties": {"repobilityId": "ac0095d3a3c9b469", "scanner": "scanner-primary", "fingerprint": "8356dbf2d24d2e24", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/contextquilt/routers/app_schemas.py:31"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-285b9cef6dc8b779", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/dashboard/app.js:902"}, "properties": {"repobilityId": "efb4871541eecbe6", "scanner": "scanner-primary", "fingerprint": "285b9cef6dc8b779", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e066691601852931", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.11-slim"}, "properties": {"repobilityId": "b799a2fad1ba0e46", "scanner": "scanner-primary", "fingerprint": "e066691601852931", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 7}}}]}, {"ruleId": "scanner-e066691601852931", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.11-slim"}, "properties": {"repobilityId": "dad0388cbd9e7b4d", "scanner": "scanner-primary", "fingerprint": "e066691601852931", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 25}}}]}, {"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-9710c8d059e53154", "level": "none", "message": {"text": "No frontend routes/components detected"}, "properties": {"repobilityId": "44ca61485762e494", "scanner": "scanner-primary", "fingerprint": "9710c8d059e53154", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-5c1f686eb820a32a", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in main.py:26"}, "properties": {"repobilityId": "7efce937690fb5d6", "scanner": "scanner-primary", "fingerprint": "5c1f686eb820a32a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "main.py"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-89042236a22060f4", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in src/main.py:83"}, "properties": {"repobilityId": "6144d0ac5646b0ac", "scanner": "scanner-primary", "fingerprint": "89042236a22060f4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/main.py"}, "region": {"startLine": 83}}}]}, {"ruleId": "scanner-9797530dc165ac69", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/dashboard/app.js:94"}, "properties": {"repobilityId": "f930c8e6ecb2c038", "scanner": "scanner-primary", "fingerprint": "9797530dc165ac69", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/dashboard/app.js"}, "region": {"startLine": 94}}}]}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "5206950cf3c3cb8f", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 25}}}]}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "a996444fe9d8260b", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 32}}}]}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "0bc463708914950e", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 45}}}]}, {"ruleId": "scanner-ad6701f0a8405e22", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "8384c23520d55657", "scanner": "scanner-primary", "fingerprint": "ad6701f0a8405e22", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d298ff6dd2e1a609", "level": "note", "message": {"text": "Very large file: src/worker.py (2804 lines)"}, "properties": {"repobilityId": "456a3109cc2dd568", "scanner": "scanner-primary", "fingerprint": "d298ff6dd2e1a609", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4d1ad4674ef71b36", "level": "note", "message": {"text": "Very large file: src/main.py (2789 lines)"}, "properties": {"repobilityId": "44c823c0d6ffefa1", "scanner": "scanner-primary", "fingerprint": "4d1ad4674ef71b36", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-397578a69b068ecb", "level": "note", "message": {"text": "Very large file: src/dashboard/router.py (2135 lines)"}, "properties": {"repobilityId": "142bad18a4279c97", "scanner": "scanner-primary", "fingerprint": "397578a69b068ecb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-17c0069b38d20908", "level": "note", "message": {"text": "Very large file: src/dashboard/app.js (2628 lines)"}, "properties": {"repobilityId": "841e026989906ff7", "scanner": "scanner-primary", "fingerprint": "17c0069b38d20908", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "10f2ec0394d756bf", "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": "78827a0e1d524574", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "d7d40e89422c86ed", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "aaea4e3087520d38", "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": "c87d71503ba679ea", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-9b0f73f2c3f13d7c", "level": "none", "message": {"text": "Commented-code block (5 lines) in verify_mcp.py:56"}, "properties": {"repobilityId": "0156eac71081b79f", "scanner": "scanner-primary", "fingerprint": "9b0f73f2c3f13d7c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-10c4e70b03c94aa0", "level": "note", "message": {"text": "Legacy-named symbol `expected_legacy` in verify_context_patch_flow.py:26"}, "properties": {"repobilityId": "7284cb9ffe4069ef", "scanner": "scanner-primary", "fingerprint": "10c4e70b03c94aa0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-06bda2e96bfb6406", "level": "none", "message": {"text": "Commented-code block (8 lines) in tests/unit/test_llm_client_anthropic_and_fallback.py:327"}, "properties": {"repobilityId": "9058da86d21aaa2a", "scanner": "scanner-primary", "fingerprint": "06bda2e96bfb6406", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-abdd2eb278ab5c70", "level": "none", "message": {"text": "Commented-code block (7 lines) in tests/unit/test_commitment_resolution.py:101"}, "properties": {"repobilityId": "cab388fc637146c9", "scanner": "scanner-primary", "fingerprint": "abdd2eb278ab5c70", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b43caf115993d6ec", "level": "none", "message": {"text": "Commented-code block (18 lines) in tests/benchmark/test_you_marker_gating.py:48"}, "properties": {"repobilityId": "28b2db4c49f405a0", "scanner": "scanner-primary", "fingerprint": "b43caf115993d6ec", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-364137b92e9113a6", "level": "note", "message": {"text": "Legacy-named symbol `is_v2` in tests/benchmark/test_extraction_dryrun.py:157"}, "properties": {"repobilityId": "bd7fc619a90b81ae", "scanner": "scanner-primary", "fingerprint": "364137b92e9113a6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-495533ef9aa402de", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/synthesize_passive_learner_history.py:12"}, "properties": {"repobilityId": "4a541468e1044fb4", "scanner": "scanner-primary", "fingerprint": "495533ef9aa402de", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a392c03ba9eccf59", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/seed_data.py:139"}, "properties": {"repobilityId": "7e2dcdee710bfeed", "scanner": "scanner-primary", "fingerprint": "a392c03ba9eccf59", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ee91b91db3042c51", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/backfill_owns_edges.py:90"}, "properties": {"repobilityId": "863cf7c253e8ab59", "scanner": "scanner-primary", "fingerprint": "ee91b91db3042c51", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-54aa5acf5254f5f3", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/verify_data_synthesis.py:129"}, "properties": {"repobilityId": "a753c09b0c25b499", "scanner": "scanner-primary", "fingerprint": "54aa5acf5254f5f3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7644bccb4ee43a87", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/split_compound_person_patches.py:70"}, "properties": {"repobilityId": "8a23f7c7d5b6e815", "scanner": "scanner-primary", "fingerprint": "7644bccb4ee43a87", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-55da3f817aa25838", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/verify_passive_learning.py:39"}, "properties": {"repobilityId": "c7134f969a52fa3b", "scanner": "scanner-primary", "fingerprint": "55da3f817aa25838", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d7ed756c1866c21c", "level": "none", "message": {"text": "Commented-code block (7 lines) in scripts/verify_person_ownership_enforcer.py:53"}, "properties": {"repobilityId": "dee9da1afe3561ce", "scanner": "scanner-primary", "fingerprint": "d7ed756c1866c21c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0c52e67e2d0d2728", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/verify_person_ownership_enforcer.py:95"}, "properties": {"repobilityId": "816fc31b8ffe7927", "scanner": "scanner-primary", "fingerprint": "0c52e67e2d0d2728", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-36015d0cd9cc4ccc", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/worker.py:341"}, "properties": {"repobilityId": "f1adbc9154d9b78b", "scanner": "scanner-primary", "fingerprint": "36015d0cd9cc4ccc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bc2d5c1abb866e15", "level": "none", "message": {"text": "Commented-code block (9 lines) in src/main.py:22"}, "properties": {"repobilityId": "b5722c061279ac63", "scanner": "scanner-primary", "fingerprint": "bc2d5c1abb866e15", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c44816edd171984c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/dashboard/router.py:400"}, "properties": {"repobilityId": "912c8f60aa5ce1fa", "scanner": "scanner-primary", "fingerprint": "c44816edd171984c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-09f8d3862412956b", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/dashboard/app.js:2401"}, "properties": {"repobilityId": "bfef7ad253f2dbed", "scanner": "scanner-primary", "fingerprint": "09f8d3862412956b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c768f65772bb0314", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/dashboard/app.js:1177"}, "properties": {"repobilityId": "5b55b71f6a29cb31", "scanner": "scanner-primary", "fingerprint": "c768f65772bb0314", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-042b54ea934c73cb", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/contextquilt/secrets.py:47"}, "properties": {"repobilityId": "2cd9b400531c98bd", "scanner": "scanner-primary", "fingerprint": "042b54ea934c73cb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c2975886e5e0c139", "level": "note", "message": {"text": "Legacy-named symbol `stitcher_v2` in src/contextquilt/utils/context_quilt_utils.py:79"}, "properties": {"repobilityId": "f1566a4789b2d2bc", "scanner": "scanner-primary", "fingerprint": "c2975886e5e0c139", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-18f774cd40167d1e", "level": "none", "message": {"text": "Commented-code block (12 lines) in src/contextquilt/services/extraction_schema.py:56"}, "properties": {"repobilityId": "81e911c900896b23", "scanner": "scanner-primary", "fingerprint": "18f774cd40167d1e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-abb43bdb6304550f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/contextquilt/services/recall_scorer.py:48"}, "properties": {"repobilityId": "d8aca7e4a21d8d32", "scanner": "scanner-primary", "fingerprint": "abb43bdb6304550f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f7db6675ffb0cd15", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/contextquilt/services/recall_formatter.py:24"}, "properties": {"repobilityId": "0f99dc14cb58ba04", "scanner": "scanner-primary", "fingerprint": "f7db6675ffb0cd15", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-022e6399d1ef2beb", "level": "note", "message": {"text": "12 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "7bf4178327da75a2", "scanner": "scanner-primary", "fingerprint": "022e6399d1ef2beb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-02525d39071dd2c7", "level": "note", "message": {"text": "Near-duplicate function bodies in 5 places"}, "properties": {"repobilityId": "35c4913c3cd8888b", "scanner": "scanner-primary", "fingerprint": "02525d39071dd2c7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "40237b053534410c", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "fa3a6f4e11172d79", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "26e37c8e251ffc99", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-02525d39071dd2c7", "level": "note", "message": {"text": "Near-duplicate function bodies in 5 places"}, "properties": {"repobilityId": "7096d9643587bc52", "scanner": "scanner-primary", "fingerprint": "02525d39071dd2c7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "d39f54f28f186c29", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "58b063c537150d5a", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "dda63c16140c8e73", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "8e636cb1195b5d45", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "b4595ce522d23f30", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-62893a3079d25fac", "level": "error", "message": {"text": "FastAPI PATCH `update_application` without auth dependency \u2014 src/main.py:2761"}, "properties": {"repobilityId": "dd6e4bf5e18cbf45", "scanner": "scanner-primary", "fingerprint": "62893a3079d25fac", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/main.py"}, "region": {"startLine": 2761}}}]}, {"ruleId": "scanner-d05b8f9694b41a05", "level": "error", "message": {"text": "Dangling fetch: GET /api/dashboard/patch-types (src/dashboard/app.js:85)"}, "properties": {"repobilityId": "5724d4e4e5247b8b", "scanner": "scanner-primary", "fingerprint": "d05b8f9694b41a05", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-29277b00feeeb690", "level": "error", "message": {"text": "Dangling fetch: PUT /api/dashboard/patch-types/${typeKey} (src/dashboard/app.js:116)"}, "properties": {"repobilityId": "173daf1977a19ea9", "scanner": "scanner-primary", "fingerprint": "29277b00feeeb690", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1148031f9e4a7367", "level": "error", "message": {"text": "Dangling fetch: POST /api/dashboard/patch-types (src/dashboard/app.js:133)"}, "properties": {"repobilityId": "9fbceca3b31b6b76", "scanner": "scanner-primary", "fingerprint": "1148031f9e4a7367", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-eaacd6eb4b910e0c", "level": "error", "message": {"text": "Dangling fetch: GET /api/dashboard/connections (src/dashboard/app.js:146)"}, "properties": {"repobilityId": "e85115287c1b0d41", "scanner": "scanner-primary", "fingerprint": "eaacd6eb4b910e0c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f834dcc3cd080994", "level": "error", "message": {"text": "Dangling fetch: POST /api/dashboard/connections (src/dashboard/app.js:181)"}, "properties": {"repobilityId": "2515c295658d59ef", "scanner": "scanner-primary", "fingerprint": "f834dcc3cd080994", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b52e28f0495ebf0b", "level": "error", "message": {"text": "Dangling fetch: GET /api/dashboard/metrics/summary?days=30 (src/dashboard/app.js:206)"}, "properties": {"repobilityId": "669d8c6c34017f70", "scanner": "scanner-primary", "fingerprint": "b52e28f0495ebf0b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b8bd00d44bbc8048", "level": "error", "message": {"text": "Dangling fetch: GET /api/dashboard/metrics/cost?days=30 (src/dashboard/app.js:217)"}, "properties": {"repobilityId": "843be3d377ef5761", "scanner": "scanner-primary", "fingerprint": "b8bd00d44bbc8048", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5cbc8d5327e9716c", "level": "error", "message": {"text": "Dangling fetch: GET /api/dashboard/metrics/models?days=30 (src/dashboard/app.js:248)"}, "properties": {"repobilityId": "08207e41a094cff0", "scanner": "scanner-primary", "fingerprint": "5cbc8d5327e9716c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6a4787665cd0b3c6", "level": "error", "message": {"text": "Dangling fetch: GET /api/dashboard/metrics/recent?limit=50 (src/dashboard/app.js:270)"}, "properties": {"repobilityId": "d04bc1b44571a1c9", "scanner": "scanner-primary", "fingerprint": "6a4787665cd0b3c6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-21018de9b7a886cd", "level": "error", "message": {"text": "Dangling fetch: GET /api/dashboard/health-check (src/dashboard/app.js:298)"}, "properties": {"repobilityId": "31ca73e90d0e0838", "scanner": "scanner-primary", "fingerprint": "21018de9b7a886cd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-895615c901ac1e2d", "level": "error", "message": {"text": "Dangling fetch: GET /api/dashboard/backup/status (src/dashboard/app.js:384)"}, "properties": {"repobilityId": "a88a1bbb0f67d2bf", "scanner": "scanner-primary", "fingerprint": "895615c901ac1e2d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a2fcec3c7fb36a3d", "level": "error", "message": {"text": "Dangling fetch: GET /api/dashboard/backup/history?limit=30 (src/dashboard/app.js:385)"}, "properties": {"repobilityId": "80a16d92368e08dd", "scanner": "scanner-primary", "fingerprint": "a2fcec3c7fb36a3d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-28953ef071964743", "level": "error", "message": {"text": "Dangling fetch: GET /api/dashboard/config (src/dashboard/app.js:464)"}, "properties": {"repobilityId": "c5622e66c2aa2ab3", "scanner": "scanner-primary", "fingerprint": "28953ef071964743", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c55085b16c35100b", "level": "error", "message": {"text": "Dangling fetch: GET /api/dashboard/prompts (src/dashboard/app.js:490)"}, "properties": {"repobilityId": "7b3f06957353be4f", "scanner": "scanner-primary", "fingerprint": "c55085b16c35100b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-df15b2885bbaf746", "level": "error", "message": {"text": "Dangling fetch: PUT /api/dashboard/prompts/${key} (src/dashboard/app.js:520)"}, "properties": {"repobilityId": "3ca26d9801dfa49c", "scanner": "scanner-primary", "fingerprint": "df15b2885bbaf746", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b03336865f869f88", "level": "error", "message": {"text": "Dangling fetch: GET /api/dashboard/ingestion-log?limit=50 (src/dashboard/app.js:636)"}, "properties": {"repobilityId": "59b497c3fcb5fe68", "scanner": "scanner-primary", "fingerprint": "b03336865f869f88", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-493c8de3be93066d", "level": "error", "message": {"text": "Dangling fetch: GET /api/dashboard/patches/history?${params}&granularity=${currentGranularity.unit} (src/dashboard/app.js:686)"}, "properties": {"repobilityId": "5092344f22c090ba", "scanner": "scanner-primary", "fingerprint": "493c8de3be93066d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-da0d5d65e6d28bc5", "level": "error", "message": {"text": "Dangling fetch: GET /api/dashboard/users (src/dashboard/app.js:740)"}, "properties": {"repobilityId": "d2bb050206fe617d", "scanner": "scanner-primary", "fingerprint": "da0d5d65e6d28bc5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3ab40a43c1a76595", "level": "error", "message": {"text": "Dangling fetch: GET /api/dashboard/users/${encodeURIComponent(userId)}/quilt (src/dashboard/app.js:921)"}, "properties": {"repobilityId": "0cea75ba6baabc22", "scanner": "scanner-primary", "fingerprint": "3ab40a43c1a76595", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-eabad4c438041b6f", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/dashboard/patches/${patchId} (src/dashboard/app.js:1169)"}, "properties": {"repobilityId": "66cacf00a5123cbe", "scanner": "scanner-primary", "fingerprint": "eabad4c438041b6f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fcbb36ea0baf646c", "level": "error", "message": {"text": "Dangling fetch: GET /api/dashboard/users/${userId}/quilt (src/dashboard/app.js:1177)"}, "properties": {"repobilityId": "bdc264bc11270f50", "scanner": "scanner-primary", "fingerprint": "fcbb36ea0baf646c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ac6b23169006370e", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/dashboard/patches/${patchId} (src/dashboard/app.js:1193)"}, "properties": {"repobilityId": "d799b131e426a403", "scanner": "scanner-primary", "fingerprint": "ac6b23169006370e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7e2d293c9b47de19", "level": "error", "message": {"text": "Dangling fetch: GET /api/dashboard/users/${userId}/quilt (src/dashboard/app.js:1199)"}, "properties": {"repobilityId": "8a0b31da1a35660a", "scanner": "scanner-primary", "fingerprint": "7e2d293c9b47de19", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1cd6975841808ef8", "level": "error", "message": {"text": "Dangling fetch: GET /api/dashboard/stats?${params} (src/dashboard/app.js:1594)"}, "properties": {"repobilityId": "a18735c5cdf30600", "scanner": "scanner-primary", "fingerprint": "1cd6975841808ef8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f243e704c749c6f3", "level": "error", "message": {"text": "Dangling fetch: GET /api/dashboard/patches/distribution?group_by=${groupBy}&${params} (src/dashboard/app.js:1779)"}, "properties": {"repobilityId": "9137f6e053dd4452", "scanner": "scanner-primary", "fingerprint": "f243e704c749c6f3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-67f16eb83ffc76c8", "level": "error", "message": {"text": "Dangling fetch: POST /api/dashboard/test-pipeline (src/dashboard/app.js:2026)"}, "properties": {"repobilityId": "95dc12054fc26983", "scanner": "scanner-primary", "fingerprint": "67f16eb83ffc76c8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f244c1adb41bcd00", "level": "error", "message": {"text": "Dangling fetch: GET /api/dashboard/alerts/categories (src/dashboard/app.js:2184)"}, "properties": {"repobilityId": "4c9cc49eac179c3b", "scanner": "scanner-primary", "fingerprint": "f244c1adb41bcd00", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-68515c986d3471e1", "level": "error", "message": {"text": "Dangling fetch: GET /api/dashboard/alerts/recipients (src/dashboard/app.js:2211)"}, "properties": {"repobilityId": "aa04be5386b31d91", "scanner": "scanner-primary", "fingerprint": "68515c986d3471e1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d040839a940e4b73", "level": "error", "message": {"text": "Dangling fetch: POST /api/dashboard/alerts/recipients (src/dashboard/app.js:2261)"}, "properties": {"repobilityId": "463ca0124a4a1a7c", "scanner": "scanner-primary", "fingerprint": "d040839a940e4b73", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-506a34058cd6414b", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/dashboard/alerts/recipients/${id} (src/dashboard/app.js:2281)"}, "properties": {"repobilityId": "2f9dd1243b92b144", "scanner": "scanner-primary", "fingerprint": "506a34058cd6414b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-39ab8a4b11a449d0", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/dashboard/alerts/recipients/${id} (src/dashboard/app.js:2296)"}, "properties": {"repobilityId": "3bd0ed044e0ce0bb", "scanner": "scanner-primary", "fingerprint": "39ab8a4b11a449d0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f2daac6448c4aa80", "level": "error", "message": {"text": "Dangling fetch: POST /api/dashboard/alerts/test-send (src/dashboard/app.js:2317)"}, "properties": {"repobilityId": "7f008031186debfa", "scanner": "scanner-primary", "fingerprint": "f2daac6448c4aa80", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e42f5434e9942861", "level": "error", "message": {"text": "Dangling fetch: GET /api/dashboard/alerts/incidents?limit=100 (src/dashboard/app.js:2351)"}, "properties": {"repobilityId": "f1639b56722c8437", "scanner": "scanner-primary", "fingerprint": "e42f5434e9942861", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c0331c6166820dcd", "level": "error", "message": {"text": "Dangling fetch: GET /api/dashboard/providers (src/dashboard/app.js:2412)"}, "properties": {"repobilityId": "5cc486a570dd60e4", "scanner": "scanner-primary", "fingerprint": "c0331c6166820dcd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e70cbcf66bb28da7", "level": "error", "message": {"text": "Dangling fetch: GET /api/dashboard/provider-health (src/dashboard/app.js:2413)"}, "properties": {"repobilityId": "2e8adade8964754d", "scanner": "scanner-primary", "fingerprint": "e70cbcf66bb28da7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bae6714478f88d1b", "level": "error", "message": {"text": "Dangling fetch: POST /api/dashboard/update-key (src/dashboard/app.js:2499)"}, "properties": {"repobilityId": "a3a022012f28fa8c", "scanner": "scanner-primary", "fingerprint": "bae6714478f88d1b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9c15fd27fa3573af", "level": "error", "message": {"text": "Dangling fetch: POST /api/dashboard/test-provider (src/dashboard/app.js:2524)"}, "properties": {"repobilityId": "709666b55b2035b6", "scanner": "scanner-primary", "fingerprint": "9c15fd27fa3573af", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-99545cc510c8bdae", "level": "error", "message": {"text": "Dangling fetch: GET /api/dashboard/memory-health?days=30 (src/dashboard/app.js:2567)"}, "properties": {"repobilityId": "868b2174fcbbfd70", "scanner": "scanner-primary", "fingerprint": "99545cc510c8bdae", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "6b8de433dc23649f", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ccc1f1eb89948c62", "level": "note", "message": {"text": "Unused endpoint: POST /v1/chat"}, "properties": {"repobilityId": "c02310796bb2a156", "scanner": "scanner-primary", "fingerprint": "ccc1f1eb89948c62", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1fe09711c5b12bf5", "level": "note", "message": {"text": "Unused endpoint: GET /v1/memory/{user_id}"}, "properties": {"repobilityId": "5ea2609882abdd75", "scanner": "scanner-primary", "fingerprint": "1fe09711c5b12bf5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0cf7bf86ec5f6e50", "level": "note", "message": {"text": "Unused endpoint: PUT /v1/memory/{user_id}"}, "properties": {"repobilityId": "c70959d4dcd6db29", "scanner": "scanner-primary", "fingerprint": "0cf7bf86ec5f6e50", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-298c41f530b3b0a0", "level": "note", "message": {"text": "Unused endpoint: POST /v1/enrich"}, "properties": {"repobilityId": "f429d87776cf517d", "scanner": "scanner-primary", "fingerprint": "298c41f530b3b0a0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-48842a8b0cba21c9", "level": "note", "message": {"text": "Unused endpoint: GET /v1/schema"}, "properties": {"repobilityId": "80504f82bb59617b", "scanner": "scanner-primary", "fingerprint": "48842a8b0cba21c9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3f0577a7043d5c11", "level": "note", "message": {"text": "Unused endpoint: POST /v1/recall"}, "properties": {"repobilityId": "5f380df9eef7993e", "scanner": "scanner-primary", "fingerprint": "3f0577a7043d5c11", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9fc2464a4283e03f", "level": "note", "message": {"text": "Unused endpoint: GET /v1/profile/{user_id}"}, "properties": {"repobilityId": "e8613a90e71b0040", "scanner": "scanner-primary", "fingerprint": "9fc2464a4283e03f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-239dc28d13c49273", "level": "note", "message": {"text": "Unused endpoint: POST /v1/memory"}, "properties": {"repobilityId": "e0002c50efbb3f1a", "scanner": "scanner-primary", "fingerprint": "239dc28d13c49273", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4a5591033d1fadfb", "level": "note", "message": {"text": "Unused endpoint: POST /v1/prewarm"}, "properties": {"repobilityId": "fdd192339f1efd53", "scanner": "scanner-primary", "fingerprint": "4a5591033d1fadfb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-41d4d409d7a62d4e", "level": "note", "message": {"text": "Unused endpoint: POST /v1/auth/token"}, "properties": {"repobilityId": "76d17eab2399c560", "scanner": "scanner-primary", "fingerprint": "41d4d409d7a62d4e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d7e2830390e2654a", "level": "note", "message": {"text": "Unused endpoint: GET /v1/quilt/{user_id}"}, "properties": {"repobilityId": "b7feb63bebb7d19d", "scanner": "scanner-primary", "fingerprint": "d7e2830390e2654a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3483220caa4f921e", "level": "note", "message": {"text": "Unused endpoint: PATCH /v1/quilt/{user_id}/patches/{patch_id}"}, "properties": {"repobilityId": "62f10804ce21d63e", "scanner": "scanner-primary", "fingerprint": "3483220caa4f921e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c273e9ba8bada49a", "level": "note", "message": {"text": "Unused endpoint: POST /v1/quilt/{user_id}/patches/{patch_id}/complete"}, "properties": {"repobilityId": "00c9924efd34000d", "scanner": "scanner-primary", "fingerprint": "c273e9ba8bada49a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-057460aea215adde", "level": "note", "message": {"text": "Unused endpoint: DELETE /v1/quilt/{user_id}/patches/{patch_id}"}, "properties": {"repobilityId": "d7f517ffb2eda1f4", "scanner": "scanner-primary", "fingerprint": "057460aea215adde", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e30eedec4972f84c", "level": "note", "message": {"text": "Unused endpoint: DELETE /v1/quilt/{user_id}"}, "properties": {"repobilityId": "006e2f8e8fa620b7", "scanner": "scanner-primary", "fingerprint": "e30eedec4972f84c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9592f2a562a09a1b", "level": "note", "message": {"text": "Unused endpoint: POST /v1/quilt/{user_id}/patches"}, "properties": {"repobilityId": "941fe2d6231290ed", "scanner": "scanner-primary", "fingerprint": "9592f2a562a09a1b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-df774ddd874db66b", "level": "note", "message": {"text": "Unused endpoint: POST /v1/quilt/{user_id}/connections"}, "properties": {"repobilityId": "987fd183736d8ab1", "scanner": "scanner-primary", "fingerprint": "df774ddd874db66b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-db3bf8bd679ac390", "level": "note", "message": {"text": "Unused endpoint: DELETE /v1/quilt/{user_id}/connections"}, "properties": {"repobilityId": "195cc823408158e3", "scanner": "scanner-primary", "fingerprint": "db3bf8bd679ac390", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6259aad39cc9fbde", "level": "note", "message": {"text": "Unused endpoint: POST /v1/quilt/{user_id}/rename-speaker"}, "properties": {"repobilityId": "6a175e6e34461e30", "scanner": "scanner-primary", "fingerprint": "6259aad39cc9fbde", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-86782712d4feac11", "level": "note", "message": {"text": "Unused endpoint: POST /v1/quilt/{user_id}/reassign-speaker"}, "properties": {"repobilityId": "db6deea9315bd946", "scanner": "scanner-primary", "fingerprint": "86782712d4feac11", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f2f1054871f10aa7", "level": "note", "message": {"text": "Unused endpoint: GET /v1/projects/{user_id}"}, "properties": {"repobilityId": "b1624ccef8e77408", "scanner": "scanner-primary", "fingerprint": "f2f1054871f10aa7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cacc332966970f61", "level": "note", "message": {"text": "Unused endpoint: POST /v1/projects/{user_id}"}, "properties": {"repobilityId": "5161da3e14d04d80", "scanner": "scanner-primary", "fingerprint": "cacc332966970f61", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b35861c1682ad644", "level": "note", "message": {"text": "Unused endpoint: PATCH /v1/projects/{user_id}/{project_id}"}, "properties": {"repobilityId": "c28d3e8568d13d45", "scanner": "scanner-primary", "fingerprint": "b35861c1682ad644", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-15bba83c8cdc1141", "level": "note", "message": {"text": "Unused endpoint: POST /v1/origins/{user_id}/{origin_type}/{origin_id}/assign-project"}, "properties": {"repobilityId": "b2dbc53c611dbf6f", "scanner": "scanner-primary", "fingerprint": "15bba83c8cdc1141", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e5d44bd25e1177c0", "level": "note", "message": {"text": "Unused endpoint: GET /verify-key"}, "properties": {"repobilityId": "2a2a306ba1ed90a7", "scanner": "scanner-primary", "fingerprint": "e5d44bd25e1177c0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cd8dc4599ec52a08", "level": "note", "message": {"text": "Unused endpoint: GET /stats"}, "properties": {"repobilityId": "c3380e5608143fb5", "scanner": "scanner-primary", "fingerprint": "cd8dc4599ec52a08", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-338d20c16afac08a", "level": "note", "message": {"text": "Unused endpoint: GET /patches/recent"}, "properties": {"repobilityId": "d381c1289890e5e3", "scanner": "scanner-primary", "fingerprint": "338d20c16afac08a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4adc05445b1456fe", "level": "note", "message": {"text": "Unused endpoint: GET /patches/history"}, "properties": {"repobilityId": "73d6f85ae75290fc", "scanner": "scanner-primary", "fingerprint": "4adc05445b1456fe", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-69f5db4a8116b8ad", "level": "note", "message": {"text": "Unused endpoint: GET /ingestion-log"}, "properties": {"repobilityId": "10595acf63c619c7", "scanner": "scanner-primary", "fingerprint": "69f5db4a8116b8ad", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9f0c1251a3e19f3c", "level": "note", "message": {"text": "Unused endpoint: GET /apps"}, "properties": {"repobilityId": "4231bb1cdb7b0330", "scanner": "scanner-primary", "fingerprint": "9f0c1251a3e19f3c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-01a333a34760fca3", "level": "note", "message": {"text": "Unused endpoint: GET /prompts"}, "properties": {"repobilityId": "c87b433b4a1cd93b", "scanner": "scanner-primary", "fingerprint": "01a333a34760fca3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f6b26aa438710bab", "level": "note", "message": {"text": "Unused endpoint: PUT /prompts/{prompt_key}"}, "properties": {"repobilityId": "624eb407acadf928", "scanner": "scanner-primary", "fingerprint": "f6b26aa438710bab", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6435fa49bf8a6b16", "level": "note", "message": {"text": "Unused endpoint: GET /patches/distribution"}, "properties": {"repobilityId": "40d8f5c4b6711800", "scanner": "scanner-primary", "fingerprint": "6435fa49bf8a6b16", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-841e50bf821e4158", "level": "note", "message": {"text": "Unused endpoint: GET /users"}, "properties": {"repobilityId": "2a177982167ba59b", "scanner": "scanner-primary", "fingerprint": "841e50bf821e4158", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cd6ae0d8c41a6338", "level": "note", "message": {"text": "Unused endpoint: GET /users/{user_id}/quilt"}, "properties": {"repobilityId": "16d4ac8b514bdc78", "scanner": "scanner-primary", "fingerprint": "cd6ae0d8c41a6338", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bbd0713f2370d0bf", "level": "note", "message": {"text": "Unused endpoint: PATCH /patches/{patch_id}"}, "properties": {"repobilityId": "da139f62ea30201a", "scanner": "scanner-primary", "fingerprint": "bbd0713f2370d0bf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d6642ba898816e53", "level": "note", "message": {"text": "Unused endpoint: DELETE /patches/{patch_id}"}, "properties": {"repobilityId": "fd822228d80a10f0", "scanner": "scanner-primary", "fingerprint": "d6642ba898816e53", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-82ef798efc39bfb8", "level": "note", "message": {"text": "Unused endpoint: GET /patch-types"}, "properties": {"repobilityId": "6b4c7abd7655ba2b", "scanner": "scanner-primary", "fingerprint": "82ef798efc39bfb8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-788e83d7c343cadf", "level": "note", "message": {"text": "Unused endpoint: POST /patch-types"}, "properties": {"repobilityId": "04ecde81e0963234", "scanner": "scanner-primary", "fingerprint": "788e83d7c343cadf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-214377d5bc0221ed", "level": "note", "message": {"text": "Unused endpoint: PUT /patch-types/{type_key}"}, "properties": {"repobilityId": "23c17c4463160967", "scanner": "scanner-primary", "fingerprint": "214377d5bc0221ed", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d66620f80b8de740", "level": "note", "message": {"text": "Unused endpoint: GET /connections"}, "properties": {"repobilityId": "8ef5b285749ae353", "scanner": "scanner-primary", "fingerprint": "d66620f80b8de740", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ff5506d508a76790", "level": "note", "message": {"text": "Unused endpoint: POST /connections"}, "properties": {"repobilityId": "f34727294865ee58", "scanner": "scanner-primary", "fingerprint": "ff5506d508a76790", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8c8ff6616246403e", "level": "note", "message": {"text": "Unused endpoint: PUT /connections/{label}"}, "properties": {"repobilityId": "ee7d52c3aba36c80", "scanner": "scanner-primary", "fingerprint": "8c8ff6616246403e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e21cf4ee09f7c6a9", "level": "note", "message": {"text": "Unused endpoint: GET /providers"}, "properties": {"repobilityId": "d09be8fed282bb40", "scanner": "scanner-primary", "fingerprint": "e21cf4ee09f7c6a9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bb0f1bc0e4a1a740", "level": "note", "message": {"text": "Unused endpoint: POST /update-key"}, "properties": {"repobilityId": "ce678f2021745935", "scanner": "scanner-primary", "fingerprint": "bb0f1bc0e4a1a740", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-06b84b3da233bf08", "level": "note", "message": {"text": "Unused endpoint: POST /test-provider"}, "properties": {"repobilityId": "5648ee64b4aed9dd", "scanner": "scanner-primary", "fingerprint": "06b84b3da233bf08", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-84a4f2d35feb7b30", "level": "note", "message": {"text": "Unused endpoint: GET /provider-health"}, "properties": {"repobilityId": "2628e28a80543c63", "scanner": "scanner-primary", "fingerprint": "84a4f2d35feb7b30", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a6f48e60c30777ab", "level": "note", "message": {"text": "Unused endpoint: GET /config"}, "properties": {"repobilityId": "56aac1d552713f90", "scanner": "scanner-primary", "fingerprint": "a6f48e60c30777ab", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c5aa2b12717b3df5", "level": "note", "message": {"text": "Unused endpoint: POST /test-pipeline"}, "properties": {"repobilityId": "56657bd303e8f1a7", "scanner": "scanner-primary", "fingerprint": "c5aa2b12717b3df5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}