{"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-8a258c72c2d1d229", "name": "Possibly dead Python function: connect_loop", "shortDescription": {"text": "Possibly dead Python function: connect_loop"}, "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-436989a09fc8aa36", "name": "Possibly dead Python function: generate_placeholder_embedding", "shortDescription": {"text": "Possibly dead Python function: generate_placeholder_embedding"}, "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-75c86dcd05cf15a9", "name": "Possibly dead Python function: normalize_memory_type", "shortDescription": {"text": "Possibly dead Python function: normalize_memory_type"}, "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-d12fb84f1b123c78", "name": "Possibly dead Python function: enrichment_worker", "shortDescription": {"text": "Possibly dead Python function: enrichment_worker"}, "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-a28975b6fea88f52", "name": "Possibly dead Python function: enrichment_worker", "shortDescription": {"text": "Possibly dead Python function: enrichment_worker"}, "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-bc3686cb03518021", "name": "Possibly dead Python function: temporal_cutoff", "shortDescription": {"text": "Possibly dead Python function: temporal_cutoff"}, "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-f5ba743bed438b77", "name": "Possibly dead Python function: find_temporal_relationships", "shortDescription": {"text": "Possibly dead Python function: find_temporal_relationships"}, "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-d87ee51a950c7425", "name": "Possibly dead Python function: detect_patterns", "shortDescription": {"text": "Possibly dead Python function: detect_patterns"}, "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-5048064c96162d42", "name": "Possibly dead Python function: link_semantic_neighbors", "shortDescription": {"text": "Possibly dead Python function: link_semantic_neighbors"}, "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-b48f3a9306cd6c08", "name": "Possibly dead Python function: temporal_cutoff", "shortDescription": {"text": "Possibly dead Python function: temporal_cutoff"}, "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-f726e8aea77c92da", "name": "Possibly dead Python function: find_temporal_relationships", "shortDescription": {"text": "Possibly dead Python function: find_temporal_relationships"}, "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-d24fa0baa6adb549", "name": "Possibly dead Python function: detect_patterns", "shortDescription": {"text": "Possibly dead Python function: detect_patterns"}, "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-53458fcb582d49d8", "name": "Possibly dead Python function: link_semantic_neighbors", "shortDescription": {"text": "Possibly dead Python function: link_semantic_neighbors"}, "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-2c02a7c7d2d5d99a", "name": "Possibly dead Python function: sync_worker", "shortDescription": {"text": "Possibly dead Python function: sync_worker"}, "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-3f56d1afc4decee5", "name": "Possibly dead Python function: run_sync_check", "shortDescription": {"text": "Possibly dead Python function: run_sync_check"}, "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-30951641904a9bc7", "name": "Possibly dead Python function: run_sync_check", "shortDescription": {"text": "Possibly dead Python function: run_sync_check"}, "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-ad75df7f18f7c97f", "name": "Possibly dead Python function: sync_worker", "shortDescription": {"text": "Possibly dead Python function: sync_worker"}, "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-7e27639b86a94ce8", "name": "Possibly dead Python function: startup_recall", "shortDescription": {"text": "Possibly dead Python function: startup_recall"}, "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-35c36e4cb6ec1416", "name": "Possibly dead Python function: analyze_memories", "shortDescription": {"text": "Possibly dead Python function: analyze_memories"}, "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-c1893837ee6fcab5", "name": "Possibly dead Python function: create_association", "shortDescription": {"text": "Possibly dead Python function: create_association"}, "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-557a99f31c904cd3", "name": "Possibly dead Python function: consolidate_memories", "shortDescription": {"text": "Possibly dead Python function: consolidate_memories"}, "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-85674e436a31bb44", "name": "Possibly dead Python function: consolidation_status", "shortDescription": {"text": "Possibly dead Python function: consolidation_status"}, "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-7a906447c72c85a8", "name": "Possibly dead Python function: run_consolidation_tick", "shortDescription": {"text": "Possibly dead Python function: run_consolidation_tick"}, "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-250154d03be15688", "name": "Stray `console.log` in TS/JS \u2014 tests/benchmarks/core_adapter/evaluate.js:196", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/benchmarks/core_adapter/evaluate.js:196"}, "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-33b15f2fde28e0e1", "name": "Stray `console.log` in TS/JS \u2014 mcp-sse-server/server.js:41", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 mcp-sse-server/server.js:41"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d63da3583b14afc0", "name": "Dockerfile runs as root: Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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-1eaf80240506e53f", "name": "Dockerfile runs as root: mcp-sse-server/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: mcp-sse-server/Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bea8971aade531e0", "name": "Docker base image is tag-pinned but not digest-pinned: node:18-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:18-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-6372cebde0220094", "name": "No auth library detected", "shortDescription": {"text": "No auth library detected"}, "fullDescription": {"text": "The scanner did not find any standard auth library (JWT, OAuth, NextAuth, Auth0, etc.). The repo has auth/admin/session surface indicators, so auth may live in custom code, in a separate service, or be missing."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cbe310f193a6df9f", "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-5e9d4a7e1b0eabc1", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 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": "low", "confidence": 1.0}}, {"id": "scanner-58a5e1818b0a66c3", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 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": "low", "confidence": 1.0}}, {"id": "scanner-8f461f8f3d0b3913", "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-27924aa79fa4a517", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/setup-python@v5 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": "low", "confidence": 1.0}}, {"id": "scanner-f54d0d3a389cb4de", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 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": "low", "confidence": 1.0}}, {"id": "scanner-4724e05098b6722d", "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-96dfef14bb016d26", "name": "Very large file: tests/test_api_endpoints.py (4480 lines)", "shortDescription": {"text": "Very large file: tests/test_api_endpoints.py (4480 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-3a4ce238c4a3cbd9", "name": "Very large file: tests/benchmarks/test_locomo.py (2318 lines)", "shortDescription": {"text": "Very large file: tests/benchmarks/test_locomo.py (2318 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-7ad1645570da4050", "name": "Very large file: automem/api/recall.py (2936 lines)", "shortDescription": {"text": "Very large file: automem/api/recall.py (2936 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 382 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 27 placeholder/mock markers across 8 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-17d866d91a7c451e", "name": "Agent instruction/config may expose a secret: CLAUDE.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: CLAUDE.md"}, "fullDescription": {"text": "Agent-facing files are routinely pasted into LLM/tool contexts. Move literal tokens, keys, and passwords into a secret manager or document them as placeholders only."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-34b6b890643f8cd5", "name": "Legacy-named symbol `test_compute_metadata_score_gate_zero_default_matches_legacy` in tests/test_api_endpoints.py:543", "shortDescription": {"text": "Legacy-named symbol `test_compute_metadata_score_gate_zero_default_matches_legacy` in tests/test_api_endpoints.py:543"}, "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-b5cbd4dae8eeb998", "name": "Legacy-named symbol `restore_from_backup` in tests/test_backup_endpoint.py:14", "shortDescription": {"text": "Legacy-named symbol `restore_from_backup` in tests/test_backup_endpoint.py:14"}, "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-7a019ed39e7f9efe", "name": "Legacy-named symbol `test_prompt_flag_off_is_byte_identical_to_legacy` in tests/benchmarks/longmemeval/test_answer_promp", "shortDescription": {"text": "Legacy-named symbol `test_prompt_flag_off_is_byte_identical_to_legacy` in tests/benchmarks/longmemeval/test_answer_prompt.py:100"}, "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-baa93bcf83439bd0", "name": "Legacy-named symbol `avg_old` in scripts/rescore_relevance.py:204", "shortDescription": {"text": "Legacy-named symbol `avg_old` in scripts/rescore_relevance.py:204"}, "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-136a2ba09fd03bef", "name": "Legacy-named symbol `load_from_backup` in scripts/audit_relevance.py:34", "shortDescription": {"text": "Legacy-named symbol `load_from_backup` in scripts/audit_relevance.py:34"}, "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-32c1f6114f9e6031", "name": "Legacy-named symbol `restore_from_backup` in scripts/restore_from_backup.py:8", "shortDescription": {"text": "Legacy-named symbol `restore_from_backup` in scripts/restore_from_backup.py:8"}, "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-541eb1aac5af9e66", "name": "Legacy-named symbol `run_backup` in scripts/backup_automem.py:166", "shortDescription": {"text": "Legacy-named symbol `run_backup` in scripts/backup_automem.py:166"}, "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-71ebc0c8abb886a9", "name": "Commented-code block (5 lines) in scripts/reclassify_with_llm.py:275", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/reclassify_with_llm.py:275"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-552c2ecbbacb8537", "name": "Legacy-named symbol `fix_v1` in scripts/lab/run_recall_test.py:12", "shortDescription": {"text": "Legacy-named symbol `fix_v1` in scripts/lab/run_recall_test.py:12"}, "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-9a232b4f4295936c", "name": "Network/subprocess call without timeout or try/except \u2014 scripts/lab/run_recall_test.py:179", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/lab/run_recall_test.py:179"}, "fullDescription": {"text": "`subprocess.run(...)` 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-ddd250416d36cb19", "name": "Stub function `flush` (body is just `pass`/`return`) \u2014 automem/backup.py:362", "shortDescription": {"text": "Stub function `flush` (body is just `pass`/`return`) \u2014 automem/backup.py:362"}, "fullDescription": {"text": "Likely an AI scaffold that was never filled in. Remove or implement."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-05ef91cf66655c2b", "name": "Commented-code block (8 lines) in automem/config.py:127", "shortDescription": {"text": "Commented-code block (8 lines) in automem/config.py:127"}, "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-0f5a13d5c08b543f", "name": "Commented-code block (5 lines) in automem/api/recall.py:884", "shortDescription": {"text": "Commented-code block (5 lines) in automem/api/recall.py:884"}, "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-0f9d6acb5471cad3", "name": "Commented-code block (6 lines) in automem/utils/scoring.py:198", "shortDescription": {"text": "Commented-code block (6 lines) in automem/utils/scoring.py:198"}, "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-3201df037c48cc4e", "name": "Commented-code block (7 lines) in automem/utils/entity_quality.py:469", "shortDescription": {"text": "Commented-code block (7 lines) in automem/utils/entity_quality.py:469"}, "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-05d7d56b6d1b827d", "name": "Commented-code block (7 lines) in mcp-sse-server/server.js:1", "shortDescription": {"text": "Commented-code block (7 lines) in mcp-sse-server/server.js:1"}, "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-46c64c55c4cbdb72", "name": "`fetch()` without try/.catch or AbortSignal \u2014 mcp-sse-server/test/server.test.js:686", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mcp-sse-server/test/server.test.js:686"}, "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-3c37538349b900f1", "name": "109 env vars used in code but missing from .env.example", "shortDescription": {"text": "109 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `AUTOMEM_API_URL`, `AUTOMEM_BACKUP_DIR`, `AUTOMEM_ENDPOINT`, `AUTOMEM_MODELS_DIR`, `AUTOMEM_TEST_API_TOKEN`, `AUTOMEM_TEST_BASE_URL`, `AUTOMEM_URL`, `CLASSIFICATION_API_KEY` + 101 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-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/bench/compare_results.py:load_results, scripts/bench/analyze_locomo_results.py:load_results\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:\nautomem/api/recall.py:startup_recall, automem/api/entity.py:merge_candidates, automem/api/consolidation.py:status\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-49c98f7cedd9c977", "name": "Near-duplicate function bodies in 4 places", "shortDescription": {"text": "Near-duplicate function bodies in 4 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nautomem/embedding/openai.py:dimension, automem/embedding/fastembed.py:dimension, automem/embedding/placeholder.py:dimension, automem/embedding/voyage.py:dimension\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-a97d73df1cb2e7ab", "name": "Flask mutation route `_store` without `@login_required` \u2014 automem/api/memory.py:148", "shortDescription": {"text": "Flask mutation route `_store` without `@login_required` \u2014 automem/api/memory.py:148"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-66895b0b65d8b907", "name": "Flask mutation route `_update` without `@login_required` \u2014 automem/api/memory.py:152", "shortDescription": {"text": "Flask mutation route `_update` without `@login_required` \u2014 automem/api/memory.py:152"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2269e02b8cd0c169", "name": "Flask mutation route `_delete` without `@login_required` \u2014 automem/api/memory.py:156", "shortDescription": {"text": "Flask mutation route `_delete` without `@login_required` \u2014 automem/api/memory.py:156"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e2ef8579d0d46cd9", "name": "Flask mutation route `_by_tag` without `@login_required` \u2014 automem/api/memory.py:160", "shortDescription": {"text": "Flask mutation route `_by_tag` without `@login_required` \u2014 automem/api/memory.py:160"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8c0d2b412b96f05a", "name": "Flask mutation route `_associate` without `@login_required` \u2014 automem/api/memory.py:168", "shortDescription": {"text": "Flask mutation route `_associate` without `@login_required` \u2014 automem/api/memory.py:168"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ec9ed9d0ebb11e5b", "name": "Flask mutation route `store` without `@login_required` \u2014 automem/api/memory.py:203", "shortDescription": {"text": "Flask mutation route `store` without `@login_required` \u2014 automem/api/memory.py:203"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0f15d14fbf592099", "name": "Flask mutation route `update` without `@login_required` \u2014 automem/api/memory.py:513", "shortDescription": {"text": "Flask mutation route `update` without `@login_required` \u2014 automem/api/memory.py:513"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-19bfc38c115249b2", "name": "Flask mutation route `delete` without `@login_required` \u2014 automem/api/memory.py:666", "shortDescription": {"text": "Flask mutation route `delete` without `@login_required` \u2014 automem/api/memory.py:666"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-de367ba7073481b7", "name": "Flask mutation route `by_tag` without `@login_required` \u2014 automem/api/memory.py:688", "shortDescription": {"text": "Flask mutation route `by_tag` without `@login_required` \u2014 automem/api/memory.py:688"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d7e7ea550ea35b91", "name": "Flask mutation route `associate` without `@login_required` \u2014 automem/api/memory.py:765", "shortDescription": {"text": "Flask mutation route `associate` without `@login_required` \u2014 automem/api/memory.py:765"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-07b6e0090c58f5ae", "name": "Flask mutation route `store_batch` without `@login_required` \u2014 automem/api/memory.py:833", "shortDescription": {"text": "Flask mutation route `store_batch` without `@login_required` \u2014 automem/api/memory.py:833"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d845c7955b727c95", "name": "Flask mutation route `reembed` without `@login_required` \u2014 automem/api/admin.py:76", "shortDescription": {"text": "Flask mutation route `reembed` without `@login_required` \u2014 automem/api/admin.py:76"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-987200077c8197d4", "name": "Flask mutation route `sync_missing` without `@login_required` \u2014 automem/api/admin.py:233", "shortDescription": {"text": "Flask mutation route `sync_missing` without `@login_required` \u2014 automem/api/admin.py:233"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0659f13bd2f60781", "name": "Flask mutation route `enrichment_reprocess` without `@login_required` \u2014 automem/api/enrichment.py:36", "shortDescription": {"text": "Flask mutation route `enrichment_reprocess` without `@login_required` \u2014 automem/api/enrichment.py:36"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-519e58c69812fcd7", "name": "Flask mutation route `merge_entity` without `@login_required` \u2014 automem/api/entity.py:400", "shortDescription": {"text": "Flask mutation route `merge_entity` without `@login_required` \u2014 automem/api/entity.py:400"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8575fe4478493554", "name": "Flask mutation route `consolidate` without `@login_required` \u2014 automem/api/consolidation.py:22", "shortDescription": {"text": "Flask mutation route `consolidate` without `@login_required` \u2014 automem/api/consolidation.py:22"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4ee8b97aeaf118ee", "name": "Dangling fetch: POST http://127.0.0.1:${port}/mcp (mcp-sse-server/test/server.test.js:325)", "shortDescription": {"text": "Dangling fetch: POST http://127.0.0.1:${port}/mcp (mcp-sse-server/test/server.test.js:325)"}, "fullDescription": {"text": "`mcp-sse-server/test/server.test.js:325` calls `POST http://127.0.0.1:${port}/mcp` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:/<p>/mcp`\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-9d7602ade3a0bef7", "name": "Dangling fetch: POST http://127.0.0.1:${port}/mcp (mcp-sse-server/test/server.test.js:360)", "shortDescription": {"text": "Dangling fetch: POST http://127.0.0.1:${port}/mcp (mcp-sse-server/test/server.test.js:360)"}, "fullDescription": {"text": "`mcp-sse-server/test/server.test.js:360` calls `POST http://127.0.0.1:${port}/mcp` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:/<p>/mcp`\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-795ebf843dd0c8b8", "name": "Dangling fetch: POST http://127.0.0.1:${port}/mcp/ (mcp-sse-server/test/server.test.js:406)", "shortDescription": {"text": "Dangling fetch: POST http://127.0.0.1:${port}/mcp/ (mcp-sse-server/test/server.test.js:406)"}, "fullDescription": {"text": "`mcp-sse-server/test/server.test.js:406` calls `POST http://127.0.0.1:${port}/mcp/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:/<p>/mcp`\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-ef1d805fffb57fd0", "name": "Dangling fetch: POST http://127.0.0.1:${port}/mcp/ (mcp-sse-server/test/server.test.js:447)", "shortDescription": {"text": "Dangling fetch: POST http://127.0.0.1:${port}/mcp/ (mcp-sse-server/test/server.test.js:447)"}, "fullDescription": {"text": "`mcp-sse-server/test/server.test.js:447` calls `POST http://127.0.0.1:${port}/mcp/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:/<p>/mcp`\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-26ea97c9ad9cbdc7", "name": "Dangling fetch: POST http://127.0.0.1:${port}/mcp (mcp-sse-server/test/server.test.js:491)", "shortDescription": {"text": "Dangling fetch: POST http://127.0.0.1:${port}/mcp (mcp-sse-server/test/server.test.js:491)"}, "fullDescription": {"text": "`mcp-sse-server/test/server.test.js:491` calls `POST http://127.0.0.1:${port}/mcp` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:/<p>/mcp`\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-df198da70333c5b9", "name": "Dangling fetch: GET http://127.0.0.1:${port}/mcp/sse (mcp-sse-server/test/server.test.js:686)", "shortDescription": {"text": "Dangling fetch: GET http://127.0.0.1:${port}/mcp/sse (mcp-sse-server/test/server.test.js:686)"}, "fullDescription": {"text": "`mcp-sse-server/test/server.test.js:686` calls `GET http://127.0.0.1:${port}/mcp/sse` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:/<p>/mcp/sse`\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-434f82e519486cbc", "name": "Unused endpoint: ANY /backup", "shortDescription": {"text": "Unused endpoint: ANY /backup"}, "fullDescription": {"text": "`automem/api/backup.py` declares `ANY /backup` 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-39441390b3b44870", "name": "Unused endpoint: ANY /stream", "shortDescription": {"text": "Unused endpoint: ANY /stream"}, "fullDescription": {"text": "`automem/api/stream.py` declares `ANY /stream` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e8340dec135e05a1", "name": "Unused endpoint: ANY /stream/status", "shortDescription": {"text": "Unused endpoint: ANY /stream/status"}, "fullDescription": {"text": "`automem/api/stream.py` declares `ANY /stream/status` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9b9db4af011642f4", "name": "Unused endpoint: ANY /recall", "shortDescription": {"text": "Unused endpoint: ANY /recall"}, "fullDescription": {"text": "`automem/api/recall.py` declares `ANY /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-75c865c889293627", "name": "Unused endpoint: ANY /startup-recall", "shortDescription": {"text": "Unused endpoint: ANY /startup-recall"}, "fullDescription": {"text": "`automem/api/recall.py` declares `ANY /startup-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-71534283a20e67bd", "name": "Unused endpoint: ANY /analyze", "shortDescription": {"text": "Unused endpoint: ANY /analyze"}, "fullDescription": {"text": "`automem/api/recall.py` declares `ANY /analyze` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7d81da685ac5e5d8", "name": "Unused endpoint: ANY /memories/<memory_id>/related", "shortDescription": {"text": "Unused endpoint: ANY /memories/<memory_id>/related"}, "fullDescription": {"text": "`automem/api/recall.py` declares `ANY /memories/<memory_id>/related` 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-fafed0b3bb36aff4", "name": "Unused endpoint: ANY /memory", "shortDescription": {"text": "Unused endpoint: ANY /memory"}, "fullDescription": {"text": "`automem/api/memory.py` declares `ANY /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-284532a8798d68d2", "name": "Unused endpoint: ANY /memory/<memory_id>", "shortDescription": {"text": "Unused endpoint: ANY /memory/<memory_id>"}, "fullDescription": {"text": "`automem/api/memory.py` declares `ANY /memory/<memory_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-1191b7310e296271", "name": "Unused endpoint: ANY /memory/by-tag", "shortDescription": {"text": "Unused endpoint: ANY /memory/by-tag"}, "fullDescription": {"text": "`automem/api/memory.py` declares `ANY /memory/by-tag` 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-f492a87d824fc60d", "name": "Unused endpoint: ANY /associate", "shortDescription": {"text": "Unused endpoint: ANY /associate"}, "fullDescription": {"text": "`automem/api/memory.py` declares `ANY /associate` 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-9cba061a05b4c148", "name": "Unused endpoint: ANY /memory/batch", "shortDescription": {"text": "Unused endpoint: ANY /memory/batch"}, "fullDescription": {"text": "`automem/api/memory.py` declares `ANY /memory/batch` 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-c9f530ce5469cc20", "name": "Unused endpoint: ANY /snapshot", "shortDescription": {"text": "Unused endpoint: ANY /snapshot"}, "fullDescription": {"text": "`automem/api/graph.py` declares `ANY /snapshot` 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-9c4500733029d7e9", "name": "Unused endpoint: ANY /neighbors/<memory_id>", "shortDescription": {"text": "Unused endpoint: ANY /neighbors/<memory_id>"}, "fullDescription": {"text": "`automem/api/graph.py` declares `ANY /neighbors/<memory_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-b45e064b63184b76", "name": "Unused endpoint: ANY /stats", "shortDescription": {"text": "Unused endpoint: ANY /stats"}, "fullDescription": {"text": "`automem/api/graph.py` declares `ANY /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-ebfb1bb48cc94361", "name": "Unused endpoint: ANY /types", "shortDescription": {"text": "Unused endpoint: ANY /types"}, "fullDescription": {"text": "`automem/api/graph.py` declares `ANY /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-edd68f1fa4e566c1", "name": "Unused endpoint: ANY /relations", "shortDescription": {"text": "Unused endpoint: ANY /relations"}, "fullDescription": {"text": "`automem/api/graph.py` declares `ANY /relations` 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-327af5f67b025924", "name": "Unused endpoint: ANY /admin/reembed", "shortDescription": {"text": "Unused endpoint: ANY /admin/reembed"}, "fullDescription": {"text": "`automem/api/admin.py` declares `ANY /admin/reembed` 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-495d432f2d3f03f4", "name": "Unused endpoint: ANY /admin/sync", "shortDescription": {"text": "Unused endpoint: ANY /admin/sync"}, "fullDescription": {"text": "`automem/api/admin.py` declares `ANY /admin/sync` 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-5911742c149188b3", "name": "Unused endpoint: ANY /enrichment/status", "shortDescription": {"text": "Unused endpoint: ANY /enrichment/status"}, "fullDescription": {"text": "`automem/api/enrichment.py` declares `ANY /enrichment/status` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1e6c7a2803050b35", "name": "Unused endpoint: ANY /enrichment/reprocess", "shortDescription": {"text": "Unused endpoint: ANY /enrichment/reprocess"}, "fullDescription": {"text": "`automem/api/enrichment.py` declares `ANY /enrichment/reprocess` 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-99d00cfcdff609d8", "name": "Unused endpoint: ANY /entities", "shortDescription": {"text": "Unused endpoint: ANY /entities"}, "fullDescription": {"text": "`automem/api/entity.py` declares `ANY /entities` 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-233c3a94aa509e06", "name": "Unused endpoint: ANY /entity/<slug>", "shortDescription": {"text": "Unused endpoint: ANY /entity/<slug>"}, "fullDescription": {"text": "`automem/api/entity.py` declares `ANY /entity/<slug>` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-05b9d8cfecbeacad", "name": "Unused endpoint: ANY /entities/merge-candidates", "shortDescription": {"text": "Unused endpoint: ANY /entities/merge-candidates"}, "fullDescription": {"text": "`automem/api/entity.py` declares `ANY /entities/merge-candidates` 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-7d80bbfe165395ef", "name": "Unused endpoint: ANY /entities/audit", "shortDescription": {"text": "Unused endpoint: ANY /entities/audit"}, "fullDescription": {"text": "`automem/api/entity.py` declares `ANY /entities/audit` 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-81c5e81b0b0e6f94", "name": "Unused endpoint: ANY /entity/<slug>/merge", "shortDescription": {"text": "Unused endpoint: ANY /entity/<slug>/merge"}, "fullDescription": {"text": "`automem/api/entity.py` declares `ANY /entity/<slug>/merge` 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-1a6d91f2236825bf", "name": "Unused endpoint: ANY /", "shortDescription": {"text": "Unused endpoint: ANY /"}, "fullDescription": {"text": "`automem/api/viewer.py` declares `ANY /` 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-b011c4e3dbecb920", "name": "Unused endpoint: ANY /<path:path>", "shortDescription": {"text": "Unused endpoint: ANY /<path:path>"}, "fullDescription": {"text": "`automem/api/viewer.py` declares `ANY /<path:path>` 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-62c3bec944e8916a", "name": "Unused endpoint: ANY /consolidate", "shortDescription": {"text": "Unused endpoint: ANY /consolidate"}, "fullDescription": {"text": "`automem/api/consolidation.py` declares `ANY /consolidate` 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-2a89bdaddc08bad9", "name": "Unused endpoint: ANY /consolidate/status", "shortDescription": {"text": "Unused endpoint: ANY /consolidate/status"}, "fullDescription": {"text": "`automem/api/consolidation.py` declares `ANY /consolidate/status` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8c236625afb6a8cb", "name": "Unused endpoint: GET /ready", "shortDescription": {"text": "Unused endpoint: GET /ready"}, "fullDescription": {"text": "`mcp-sse-server/server.js` declares `GET /ready` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-453d111844b1c242", "name": "Unused endpoint: POST /alexa", "shortDescription": {"text": "Unused endpoint: POST /alexa"}, "fullDescription": {"text": "`mcp-sse-server/server.js` declares `POST /alexa` 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-efbc80312c5027b5", "name": "Unused endpoint: ALL /mcp", "shortDescription": {"text": "Unused endpoint: ALL /mcp"}, "fullDescription": {"text": "`mcp-sse-server/server.js` declares `ALL /mcp` 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-84cf759495734b24", "name": "Unused endpoint: GET /mcp/sse", "shortDescription": {"text": "Unused endpoint: GET /mcp/sse"}, "fullDescription": {"text": "`mcp-sse-server/server.js` declares `GET /mcp/sse` 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-e0d20bced1980c22", "name": "Unused endpoint: POST /mcp/messages", "shortDescription": {"text": "Unused endpoint: POST /mcp/messages"}, "fullDescription": {"text": "`mcp-sse-server/server.js` declares `POST /mcp/messages` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/22160"}, "properties": {"repository": "verygoodplugins/automem", "repoUrl": "https://github.com/verygoodplugins/automem", "branch": "main"}, "results": [{"ruleId": "scanner-8a258c72c2d1d229", "level": "note", "message": {"text": "Possibly dead Python function: connect_loop"}, "properties": {"repobilityId": "2cb00af62b1dff46", "scanner": "scanner-primary", "fingerprint": "8a258c72c2d1d229", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/automem_watch.py:367"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-436989a09fc8aa36", "level": "note", "message": {"text": "Possibly dead Python function: generate_placeholder_embedding"}, "properties": {"repobilityId": "d5630d1abd9aff32", "scanner": "scanner-primary", "fingerprint": "436989a09fc8aa36", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "automem/app_helper_bindings.py:51"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-75c86dcd05cf15a9", "level": "note", "message": {"text": "Possibly dead Python function: normalize_memory_type"}, "properties": {"repobilityId": "f7d10754018ab650", "scanner": "scanner-primary", "fingerprint": "75c86dcd05cf15a9", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "automem/config.py:203"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d12fb84f1b123c78", "level": "note", "message": {"text": "Possibly dead Python function: enrichment_worker"}, "properties": {"repobilityId": "cd6937760cfdfc1f", "scanner": "scanner-primary", "fingerprint": "d12fb84f1b123c78", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "automem/enrichment/runtime_worker.py:77"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a28975b6fea88f52", "level": "note", "message": {"text": "Possibly dead Python function: enrichment_worker"}, "properties": {"repobilityId": "cd6937760cfdfc1f", "scanner": "scanner-primary", "fingerprint": "a28975b6fea88f52", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "automem/enrichment/runtime_queue_bindings.py:66"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bc3686cb03518021", "level": "note", "message": {"text": "Possibly dead Python function: temporal_cutoff"}, "properties": {"repobilityId": "a5adc8a1aca9e6ae", "scanner": "scanner-primary", "fingerprint": "bc3686cb03518021", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "automem/enrichment/runtime_bindings.py:50"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f5ba743bed438b77", "level": "note", "message": {"text": "Possibly dead Python function: find_temporal_relationships"}, "properties": {"repobilityId": "309de16991ba6736", "scanner": "scanner-primary", "fingerprint": "f5ba743bed438b77", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "automem/enrichment/runtime_bindings.py:53"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d87ee51a950c7425", "level": "note", "message": {"text": "Possibly dead Python function: detect_patterns"}, "properties": {"repobilityId": "3054f76a4516c991", "scanner": "scanner-primary", "fingerprint": "d87ee51a950c7425", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "automem/enrichment/runtime_bindings.py:63"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5048064c96162d42", "level": "note", "message": {"text": "Possibly dead Python function: link_semantic_neighbors"}, "properties": {"repobilityId": "b68aa4fd340ac27f", "scanner": "scanner-primary", "fingerprint": "5048064c96162d42", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "automem/enrichment/runtime_bindings.py:74"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b48f3a9306cd6c08", "level": "note", "message": {"text": "Possibly dead Python function: temporal_cutoff"}, "properties": {"repobilityId": "a5adc8a1aca9e6ae", "scanner": "scanner-primary", "fingerprint": "b48f3a9306cd6c08", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "automem/enrichment/runtime_helpers.py:10"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f726e8aea77c92da", "level": "note", "message": {"text": "Possibly dead Python function: find_temporal_relationships"}, "properties": {"repobilityId": "309de16991ba6736", "scanner": "scanner-primary", "fingerprint": "f726e8aea77c92da", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "automem/enrichment/runtime_helpers.py:15"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d24fa0baa6adb549", "level": "note", "message": {"text": "Possibly dead Python function: detect_patterns"}, "properties": {"repobilityId": "3054f76a4516c991", "scanner": "scanner-primary", "fingerprint": "d24fa0baa6adb549", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "automem/enrichment/runtime_helpers.py:74"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-53458fcb582d49d8", "level": "note", "message": {"text": "Possibly dead Python function: link_semantic_neighbors"}, "properties": {"repobilityId": "b68aa4fd340ac27f", "scanner": "scanner-primary", "fingerprint": "53458fcb582d49d8", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "automem/enrichment/runtime_helpers.py:177"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2c02a7c7d2d5d99a", "level": "note", "message": {"text": "Possibly dead Python function: sync_worker"}, "properties": {"repobilityId": "17369067cc40963d", "scanner": "scanner-primary", "fingerprint": "2c02a7c7d2d5d99a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "automem/sync/runtime_worker.py:30"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3f56d1afc4decee5", "level": "note", "message": {"text": "Possibly dead Python function: run_sync_check"}, "properties": {"repobilityId": "181a433d47af4947", "scanner": "scanner-primary", "fingerprint": "3f56d1afc4decee5", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "automem/sync/runtime_worker.py:50"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-30951641904a9bc7", "level": "note", "message": {"text": "Possibly dead Python function: run_sync_check"}, "properties": {"repobilityId": "181a433d47af4947", "scanner": "scanner-primary", "fingerprint": "30951641904a9bc7", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "automem/sync/runtime_bindings.py:33"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ad75df7f18f7c97f", "level": "note", "message": {"text": "Possibly dead Python function: sync_worker"}, "properties": {"repobilityId": "17369067cc40963d", "scanner": "scanner-primary", "fingerprint": "ad75df7f18f7c97f", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "automem/sync/runtime_bindings.py:44"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7e27639b86a94ce8", "level": "note", "message": {"text": "Possibly dead Python function: startup_recall"}, "properties": {"repobilityId": "2af91982ea5535cc", "scanner": "scanner-primary", "fingerprint": "7e27639b86a94ce8", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "automem/analytics/runtime_helpers.py:25"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-35c36e4cb6ec1416", "level": "note", "message": {"text": "Possibly dead Python function: analyze_memories"}, "properties": {"repobilityId": "b9a6996dfaa0f199", "scanner": "scanner-primary", "fingerprint": "35c36e4cb6ec1416", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "automem/analytics/runtime_helpers.py:99"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c1893837ee6fcab5", "level": "note", "message": {"text": "Possibly dead Python function: create_association"}, "properties": {"repobilityId": "8cca1e30006a5b61", "scanner": "scanner-primary", "fingerprint": "c1893837ee6fcab5", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "automem/consolidation/runtime_routes.py:7"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-557a99f31c904cd3", "level": "note", "message": {"text": "Possibly dead Python function: consolidate_memories"}, "properties": {"repobilityId": "249e7243ce25da23", "scanner": "scanner-primary", "fingerprint": "557a99f31c904cd3", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "automem/consolidation/runtime_routes.py:96"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-85674e436a31bb44", "level": "note", "message": {"text": "Possibly dead Python function: consolidation_status"}, "properties": {"repobilityId": "dd42e4edce9b0822", "scanner": "scanner-primary", "fingerprint": "85674e436a31bb44", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "automem/consolidation/runtime_routes.py:135"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7a906447c72c85a8", "level": "note", "message": {"text": "Possibly dead Python function: run_consolidation_tick"}, "properties": {"repobilityId": "e8fc911160aaa5a6", "scanner": "scanner-primary", "fingerprint": "7a906447c72c85a8", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "automem/consolidation/runtime_scheduler.py:6"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-250154d03be15688", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/benchmarks/core_adapter/evaluate.js:196"}, "properties": {"repobilityId": "6936050233d189d5", "scanner": "scanner-primary", "fingerprint": "250154d03be15688", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-33b15f2fde28e0e1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 mcp-sse-server/server.js:41"}, "properties": {"repobilityId": "25108978c9bc2950", "scanner": "scanner-primary", "fingerprint": "33b15f2fde28e0e1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d63da3583b14afc0", "level": "warning", "message": {"text": "Dockerfile runs as root: Dockerfile"}, "properties": {"repobilityId": "a2ed1bd120e507db", "scanner": "scanner-primary", "fingerprint": "d63da3583b14afc0", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-e066691601852931", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.11-slim"}, "properties": {"repobilityId": "e0971d810a1dce99", "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": 2}}}]}, {"ruleId": "scanner-1eaf80240506e53f", "level": "warning", "message": {"text": "Dockerfile runs as root: mcp-sse-server/Dockerfile"}, "properties": {"repobilityId": "6dec9193c0952bb3", "scanner": "scanner-primary", "fingerprint": "1eaf80240506e53f", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-bea8971aade531e0", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:18-slim"}, "properties": {"repobilityId": "f11313d91a1192b9", "scanner": "scanner-primary", "fingerprint": "bea8971aade531e0", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "mcp-sse-server/Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"ruleId": "scanner-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-6372cebde0220094", "level": "warning", "message": {"text": "No auth library detected"}, "properties": {"repobilityId": "a5b6035a5bbf8054", "scanner": "scanner-primary", "fingerprint": "6372cebde0220094", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["coverage", "auth"]}}, {"ruleId": "scanner-cbe310f193a6df9f", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "573212e145c44806", "scanner": "scanner-primary", "fingerprint": "cbe310f193a6df9f", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release-please.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5e9d4a7e1b0eabc1", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "274de9fb1c890e5e", "scanner": "scanner-primary", "fingerprint": "5e9d4a7e1b0eabc1", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/backup.yml"}, "region": {"startLine": 16}}}]}, {"ruleId": "scanner-5e9d4a7e1b0eabc1", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "06fcd9acd3623110", "scanner": "scanner-primary", "fingerprint": "5e9d4a7e1b0eabc1", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/backup.yml"}, "region": {"startLine": 19}}}]}, {"ruleId": "scanner-58a5e1818b0a66c3", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "d2348335431c0d9a", "scanner": "scanner-primary", "fingerprint": "58a5e1818b0a66c3", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-build-mcp-automem.yml"}, "region": {"startLine": 49}}}]}, {"ruleId": "scanner-58a5e1818b0a66c3", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "e9f1e66e73442849", "scanner": "scanner-primary", "fingerprint": "58a5e1818b0a66c3", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-build-mcp-automem.yml"}, "region": {"startLine": 52}}}]}, {"ruleId": "scanner-58a5e1818b0a66c3", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "0f8b80399542c84f", "scanner": "scanner-primary", "fingerprint": "58a5e1818b0a66c3", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-build-mcp-automem.yml"}, "region": {"startLine": 56}}}]}, {"ruleId": "scanner-58a5e1818b0a66c3", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "3f8d791f93c447fd", "scanner": "scanner-primary", "fingerprint": "58a5e1818b0a66c3", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-build-mcp-automem.yml"}, "region": {"startLine": 64}}}]}, {"ruleId": "scanner-58a5e1818b0a66c3", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "478c7e1ff66adea5", "scanner": "scanner-primary", "fingerprint": "58a5e1818b0a66c3", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-build-mcp-automem.yml"}, "region": {"startLine": 82}}}]}, {"ruleId": "scanner-58a5e1818b0a66c3", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "16a706c87b197f40", "scanner": "scanner-primary", "fingerprint": "58a5e1818b0a66c3", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-build-mcp-automem.yml"}, "region": {"startLine": 94}}}]}, {"ruleId": "scanner-8f461f8f3d0b3913", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "aa766eee1b67a420", "scanner": "scanner-primary", "fingerprint": "8f461f8f3d0b3913", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-build-mcp-automem.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "04f57d208548fcef", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 27}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "09f7885b77bbfb50", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 32}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "989a74409a402368", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 42}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "04f57d208548fcef", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 68}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "04f57d208548fcef", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 98}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "a3c03147ef1f40b5", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 114}}}]}, {"ruleId": "scanner-f54d0d3a389cb4de", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "93666d037cc96330", "scanner": "scanner-primary", "fingerprint": "f54d0d3a389cb4de", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-build.yml"}, "region": {"startLine": 51}}}]}, {"ruleId": "scanner-f54d0d3a389cb4de", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "524cd7f22306d448", "scanner": "scanner-primary", "fingerprint": "f54d0d3a389cb4de", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-build.yml"}, "region": {"startLine": 54}}}]}, {"ruleId": "scanner-f54d0d3a389cb4de", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "f992a0f3a9da3b1a", "scanner": "scanner-primary", "fingerprint": "f54d0d3a389cb4de", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-build.yml"}, "region": {"startLine": 58}}}]}, {"ruleId": "scanner-f54d0d3a389cb4de", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "4bda0db7b1e7a219", "scanner": "scanner-primary", "fingerprint": "f54d0d3a389cb4de", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-build.yml"}, "region": {"startLine": 66}}}]}, {"ruleId": "scanner-f54d0d3a389cb4de", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "a60afc9f26129783", "scanner": "scanner-primary", "fingerprint": "f54d0d3a389cb4de", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-build.yml"}, "region": {"startLine": 82}}}]}, {"ruleId": "scanner-f54d0d3a389cb4de", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "e381f11fe2080dee", "scanner": "scanner-primary", "fingerprint": "f54d0d3a389cb4de", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-build.yml"}, "region": {"startLine": 94}}}]}, {"ruleId": "scanner-4724e05098b6722d", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "a669f23915d1d93d", "scanner": "scanner-primary", "fingerprint": "4724e05098b6722d", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-build.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-96dfef14bb016d26", "level": "note", "message": {"text": "Very large file: tests/test_api_endpoints.py (4480 lines)"}, "properties": {"repobilityId": "ed10d6caff0399f3", "scanner": "scanner-primary", "fingerprint": "96dfef14bb016d26", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3a4ce238c4a3cbd9", "level": "note", "message": {"text": "Very large file: tests/benchmarks/test_locomo.py (2318 lines)"}, "properties": {"repobilityId": "e1aac00396389e70", "scanner": "scanner-primary", "fingerprint": "3a4ce238c4a3cbd9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-7ad1645570da4050", "level": "note", "message": {"text": "Very large file: automem/api/recall.py (2936 lines)"}, "properties": {"repobilityId": "b1e422daeab1db50", "scanner": "scanner-primary", "fingerprint": "7ad1645570da4050", "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": "613b8e90e5eeb3c6", "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": "d5ad47fb91e5040e", "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": "f3e846bc1db81f67", "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": "efe398c40693b0dd", "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": "6a184678dbbc2dbe", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-17d866d91a7c451e", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: CLAUDE.md"}, "properties": {"repobilityId": "ccce5984e58a48f0", "scanner": "scanner-primary", "fingerprint": "17d866d91a7c451e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "CLAUDE.md"}, "region": {"startLine": 149}}}]}, {"ruleId": "scanner-34b6b890643f8cd5", "level": "note", "message": {"text": "Legacy-named symbol `test_compute_metadata_score_gate_zero_default_matches_legacy` in tests/test_api_endpoints.py:543"}, "properties": {"repobilityId": "b694d4e42d4a7077", "scanner": "scanner-primary", "fingerprint": "34b6b890643f8cd5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b5cbd4dae8eeb998", "level": "note", "message": {"text": "Legacy-named symbol `restore_from_backup` in tests/test_backup_endpoint.py:14"}, "properties": {"repobilityId": "dbbf2a23f6c7dd3c", "scanner": "scanner-primary", "fingerprint": "b5cbd4dae8eeb998", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-7a019ed39e7f9efe", "level": "note", "message": {"text": "Legacy-named symbol `test_prompt_flag_off_is_byte_identical_to_legacy` in tests/benchmarks/longmemeval/test_answer_prompt.py:100"}, "properties": {"repobilityId": "4ba5d03c626261dd", "scanner": "scanner-primary", "fingerprint": "7a019ed39e7f9efe", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-baa93bcf83439bd0", "level": "note", "message": {"text": "Legacy-named symbol `avg_old` in scripts/rescore_relevance.py:204"}, "properties": {"repobilityId": "b9fc4d6d163b8c70", "scanner": "scanner-primary", "fingerprint": "baa93bcf83439bd0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-136a2ba09fd03bef", "level": "note", "message": {"text": "Legacy-named symbol `load_from_backup` in scripts/audit_relevance.py:34"}, "properties": {"repobilityId": "5a2b3315c488c6b0", "scanner": "scanner-primary", "fingerprint": "136a2ba09fd03bef", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-32c1f6114f9e6031", "level": "note", "message": {"text": "Legacy-named symbol `restore_from_backup` in scripts/restore_from_backup.py:8"}, "properties": {"repobilityId": "8e1a12bc77c575ad", "scanner": "scanner-primary", "fingerprint": "32c1f6114f9e6031", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-541eb1aac5af9e66", "level": "note", "message": {"text": "Legacy-named symbol `run_backup` in scripts/backup_automem.py:166"}, "properties": {"repobilityId": "19ce9ae6bf12fea4", "scanner": "scanner-primary", "fingerprint": "541eb1aac5af9e66", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-71ebc0c8abb886a9", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/reclassify_with_llm.py:275"}, "properties": {"repobilityId": "c64162f96285796a", "scanner": "scanner-primary", "fingerprint": "71ebc0c8abb886a9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-552c2ecbbacb8537", "level": "note", "message": {"text": "Legacy-named symbol `fix_v1` in scripts/lab/run_recall_test.py:12"}, "properties": {"repobilityId": "01ad372e4460ef4b", "scanner": "scanner-primary", "fingerprint": "552c2ecbbacb8537", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-9a232b4f4295936c", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/lab/run_recall_test.py:179"}, "properties": {"repobilityId": "1441097edf90b82d", "scanner": "scanner-primary", "fingerprint": "9a232b4f4295936c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ddd250416d36cb19", "level": "note", "message": {"text": "Stub function `flush` (body is just `pass`/`return`) \u2014 automem/backup.py:362"}, "properties": {"repobilityId": "1f8a7cc3fdcab061", "scanner": "scanner-primary", "fingerprint": "ddd250416d36cb19", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "empty-handler", "dead-code"]}}, {"ruleId": "scanner-05ef91cf66655c2b", "level": "none", "message": {"text": "Commented-code block (8 lines) in automem/config.py:127"}, "properties": {"repobilityId": "3e5930c09b544a96", "scanner": "scanner-primary", "fingerprint": "05ef91cf66655c2b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0f5a13d5c08b543f", "level": "none", "message": {"text": "Commented-code block (5 lines) in automem/api/recall.py:884"}, "properties": {"repobilityId": "2faaa5bba9e4ef93", "scanner": "scanner-primary", "fingerprint": "0f5a13d5c08b543f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0f9d6acb5471cad3", "level": "none", "message": {"text": "Commented-code block (6 lines) in automem/utils/scoring.py:198"}, "properties": {"repobilityId": "681167bc8851ba53", "scanner": "scanner-primary", "fingerprint": "0f9d6acb5471cad3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3201df037c48cc4e", "level": "none", "message": {"text": "Commented-code block (7 lines) in automem/utils/entity_quality.py:469"}, "properties": {"repobilityId": "650b2aa7b2845700", "scanner": "scanner-primary", "fingerprint": "3201df037c48cc4e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-05d7d56b6d1b827d", "level": "none", "message": {"text": "Commented-code block (7 lines) in mcp-sse-server/server.js:1"}, "properties": {"repobilityId": "c0fe7230ca25e7ce", "scanner": "scanner-primary", "fingerprint": "05d7d56b6d1b827d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-46c64c55c4cbdb72", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mcp-sse-server/test/server.test.js:686"}, "properties": {"repobilityId": "50c17aae6054ca33", "scanner": "scanner-primary", "fingerprint": "46c64c55c4cbdb72", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3c37538349b900f1", "level": "note", "message": {"text": "109 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "7f57fb17091e98e6", "scanner": "scanner-primary", "fingerprint": "3c37538349b900f1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "73cb0b0e76e5ad6e", "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": "515c39f7fa196324", "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": "32dfaf6cdaed04b2", "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": "9772e2c7b58c46d2", "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": "9961b602f2d3cf4c", "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": "3abc99cec9869c9b", "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": "7beef985c16357c7", "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": "2bf40eb0cad49633", "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": "23203abdf0eb58a4", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "7ecabb25f0a00b3a", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "88a9f197e9bd0fa7", "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": "1466d71c04d8d916", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-a97d73df1cb2e7ab", "level": "error", "message": {"text": "Flask mutation route `_store` without `@login_required` \u2014 automem/api/memory.py:148"}, "properties": {"repobilityId": "ac8cc28106c93994", "scanner": "scanner-primary", "fingerprint": "a97d73df1cb2e7ab", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "automem/api/memory.py"}, "region": {"startLine": 148}}}]}, {"ruleId": "scanner-66895b0b65d8b907", "level": "error", "message": {"text": "Flask mutation route `_update` without `@login_required` \u2014 automem/api/memory.py:152"}, "properties": {"repobilityId": "002b9e89da62c3e6", "scanner": "scanner-primary", "fingerprint": "66895b0b65d8b907", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "automem/api/memory.py"}, "region": {"startLine": 152}}}]}, {"ruleId": "scanner-2269e02b8cd0c169", "level": "error", "message": {"text": "Flask mutation route `_delete` without `@login_required` \u2014 automem/api/memory.py:156"}, "properties": {"repobilityId": "4a6b1a15892992b0", "scanner": "scanner-primary", "fingerprint": "2269e02b8cd0c169", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "automem/api/memory.py"}, "region": {"startLine": 156}}}]}, {"ruleId": "scanner-e2ef8579d0d46cd9", "level": "error", "message": {"text": "Flask mutation route `_by_tag` without `@login_required` \u2014 automem/api/memory.py:160"}, "properties": {"repobilityId": "ac1d3bf4be52a36f", "scanner": "scanner-primary", "fingerprint": "e2ef8579d0d46cd9", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "automem/api/memory.py"}, "region": {"startLine": 160}}}]}, {"ruleId": "scanner-8c0d2b412b96f05a", "level": "error", "message": {"text": "Flask mutation route `_associate` without `@login_required` \u2014 automem/api/memory.py:168"}, "properties": {"repobilityId": "a098c4ca9451cd0f", "scanner": "scanner-primary", "fingerprint": "8c0d2b412b96f05a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "automem/api/memory.py"}, "region": {"startLine": 168}}}]}, {"ruleId": "scanner-ec9ed9d0ebb11e5b", "level": "error", "message": {"text": "Flask mutation route `store` without `@login_required` \u2014 automem/api/memory.py:203"}, "properties": {"repobilityId": "61c6527245eb002a", "scanner": "scanner-primary", "fingerprint": "ec9ed9d0ebb11e5b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "automem/api/memory.py"}, "region": {"startLine": 203}}}]}, {"ruleId": "scanner-0f15d14fbf592099", "level": "error", "message": {"text": "Flask mutation route `update` without `@login_required` \u2014 automem/api/memory.py:513"}, "properties": {"repobilityId": "104b0827d1c60ade", "scanner": "scanner-primary", "fingerprint": "0f15d14fbf592099", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "automem/api/memory.py"}, "region": {"startLine": 513}}}]}, {"ruleId": "scanner-19bfc38c115249b2", "level": "error", "message": {"text": "Flask mutation route `delete` without `@login_required` \u2014 automem/api/memory.py:666"}, "properties": {"repobilityId": "d6537c8aeda7a1dc", "scanner": "scanner-primary", "fingerprint": "19bfc38c115249b2", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "automem/api/memory.py"}, "region": {"startLine": 666}}}]}, {"ruleId": "scanner-de367ba7073481b7", "level": "error", "message": {"text": "Flask mutation route `by_tag` without `@login_required` \u2014 automem/api/memory.py:688"}, "properties": {"repobilityId": "43babc7e8d0f7d28", "scanner": "scanner-primary", "fingerprint": "de367ba7073481b7", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "automem/api/memory.py"}, "region": {"startLine": 688}}}]}, {"ruleId": "scanner-d7e7ea550ea35b91", "level": "error", "message": {"text": "Flask mutation route `associate` without `@login_required` \u2014 automem/api/memory.py:765"}, "properties": {"repobilityId": "1faba8ca0f8c3703", "scanner": "scanner-primary", "fingerprint": "d7e7ea550ea35b91", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "automem/api/memory.py"}, "region": {"startLine": 765}}}]}, {"ruleId": "scanner-07b6e0090c58f5ae", "level": "error", "message": {"text": "Flask mutation route `store_batch` without `@login_required` \u2014 automem/api/memory.py:833"}, "properties": {"repobilityId": "b1cfe1c333a702b3", "scanner": "scanner-primary", "fingerprint": "07b6e0090c58f5ae", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "automem/api/memory.py"}, "region": {"startLine": 833}}}]}, {"ruleId": "scanner-d845c7955b727c95", "level": "error", "message": {"text": "Flask mutation route `reembed` without `@login_required` \u2014 automem/api/admin.py:76"}, "properties": {"repobilityId": "5174275c38b61648", "scanner": "scanner-primary", "fingerprint": "d845c7955b727c95", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "automem/api/admin.py"}, "region": {"startLine": 76}}}]}, {"ruleId": "scanner-987200077c8197d4", "level": "error", "message": {"text": "Flask mutation route `sync_missing` without `@login_required` \u2014 automem/api/admin.py:233"}, "properties": {"repobilityId": "ab6b33a343cae931", "scanner": "scanner-primary", "fingerprint": "987200077c8197d4", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "automem/api/admin.py"}, "region": {"startLine": 233}}}]}, {"ruleId": "scanner-0659f13bd2f60781", "level": "error", "message": {"text": "Flask mutation route `enrichment_reprocess` without `@login_required` \u2014 automem/api/enrichment.py:36"}, "properties": {"repobilityId": "dca5d17447fc985f", "scanner": "scanner-primary", "fingerprint": "0659f13bd2f60781", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "automem/api/enrichment.py"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-519e58c69812fcd7", "level": "error", "message": {"text": "Flask mutation route `merge_entity` without `@login_required` \u2014 automem/api/entity.py:400"}, "properties": {"repobilityId": "0b65de8cd3fa7b3e", "scanner": "scanner-primary", "fingerprint": "519e58c69812fcd7", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "automem/api/entity.py"}, "region": {"startLine": 400}}}]}, {"ruleId": "scanner-8575fe4478493554", "level": "error", "message": {"text": "Flask mutation route `consolidate` without `@login_required` \u2014 automem/api/consolidation.py:22"}, "properties": {"repobilityId": "caed55707198cc77", "scanner": "scanner-primary", "fingerprint": "8575fe4478493554", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "automem/api/consolidation.py"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-4ee8b97aeaf118ee", "level": "error", "message": {"text": "Dangling fetch: POST http://127.0.0.1:${port}/mcp (mcp-sse-server/test/server.test.js:325)"}, "properties": {"repobilityId": "2fbaac0ddb774a0f", "scanner": "scanner-primary", "fingerprint": "4ee8b97aeaf118ee", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9d7602ade3a0bef7", "level": "error", "message": {"text": "Dangling fetch: POST http://127.0.0.1:${port}/mcp (mcp-sse-server/test/server.test.js:360)"}, "properties": {"repobilityId": "7b6fd9a830b44713", "scanner": "scanner-primary", "fingerprint": "9d7602ade3a0bef7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-795ebf843dd0c8b8", "level": "error", "message": {"text": "Dangling fetch: POST http://127.0.0.1:${port}/mcp/ (mcp-sse-server/test/server.test.js:406)"}, "properties": {"repobilityId": "f9a58c8045d0418a", "scanner": "scanner-primary", "fingerprint": "795ebf843dd0c8b8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ef1d805fffb57fd0", "level": "error", "message": {"text": "Dangling fetch: POST http://127.0.0.1:${port}/mcp/ (mcp-sse-server/test/server.test.js:447)"}, "properties": {"repobilityId": "67cf9892a6c0bee5", "scanner": "scanner-primary", "fingerprint": "ef1d805fffb57fd0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-26ea97c9ad9cbdc7", "level": "error", "message": {"text": "Dangling fetch: POST http://127.0.0.1:${port}/mcp (mcp-sse-server/test/server.test.js:491)"}, "properties": {"repobilityId": "2708a3eb883a77e0", "scanner": "scanner-primary", "fingerprint": "26ea97c9ad9cbdc7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-df198da70333c5b9", "level": "error", "message": {"text": "Dangling fetch: GET http://127.0.0.1:${port}/mcp/sse (mcp-sse-server/test/server.test.js:686)"}, "properties": {"repobilityId": "86d84b2af5d0a175", "scanner": "scanner-primary", "fingerprint": "df198da70333c5b9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-434f82e519486cbc", "level": "note", "message": {"text": "Unused endpoint: ANY /backup"}, "properties": {"repobilityId": "48e288e21cadc846", "scanner": "scanner-primary", "fingerprint": "434f82e519486cbc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-39441390b3b44870", "level": "note", "message": {"text": "Unused endpoint: ANY /stream"}, "properties": {"repobilityId": "30464dc8ccfe2903", "scanner": "scanner-primary", "fingerprint": "39441390b3b44870", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e8340dec135e05a1", "level": "note", "message": {"text": "Unused endpoint: ANY /stream/status"}, "properties": {"repobilityId": "37162a7da1a2779d", "scanner": "scanner-primary", "fingerprint": "e8340dec135e05a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9b9db4af011642f4", "level": "note", "message": {"text": "Unused endpoint: ANY /recall"}, "properties": {"repobilityId": "260cc121f3a50959", "scanner": "scanner-primary", "fingerprint": "9b9db4af011642f4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-75c865c889293627", "level": "note", "message": {"text": "Unused endpoint: ANY /startup-recall"}, "properties": {"repobilityId": "f5154e36e4fc234f", "scanner": "scanner-primary", "fingerprint": "75c865c889293627", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-71534283a20e67bd", "level": "note", "message": {"text": "Unused endpoint: ANY /analyze"}, "properties": {"repobilityId": "b902555fad70e963", "scanner": "scanner-primary", "fingerprint": "71534283a20e67bd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7d81da685ac5e5d8", "level": "note", "message": {"text": "Unused endpoint: ANY /memories/<memory_id>/related"}, "properties": {"repobilityId": "3f26b2c3af224c16", "scanner": "scanner-primary", "fingerprint": "7d81da685ac5e5d8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fafed0b3bb36aff4", "level": "note", "message": {"text": "Unused endpoint: ANY /memory"}, "properties": {"repobilityId": "7ba17ef82fc252e2", "scanner": "scanner-primary", "fingerprint": "fafed0b3bb36aff4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-284532a8798d68d2", "level": "note", "message": {"text": "Unused endpoint: ANY /memory/<memory_id>"}, "properties": {"repobilityId": "f4770d2e2c5994ad", "scanner": "scanner-primary", "fingerprint": "284532a8798d68d2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1191b7310e296271", "level": "note", "message": {"text": "Unused endpoint: ANY /memory/by-tag"}, "properties": {"repobilityId": "a4f1b197cf956685", "scanner": "scanner-primary", "fingerprint": "1191b7310e296271", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f492a87d824fc60d", "level": "note", "message": {"text": "Unused endpoint: ANY /associate"}, "properties": {"repobilityId": "625e9878df7b06f0", "scanner": "scanner-primary", "fingerprint": "f492a87d824fc60d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9cba061a05b4c148", "level": "note", "message": {"text": "Unused endpoint: ANY /memory/batch"}, "properties": {"repobilityId": "a5a7007489d38475", "scanner": "scanner-primary", "fingerprint": "9cba061a05b4c148", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c9f530ce5469cc20", "level": "note", "message": {"text": "Unused endpoint: ANY /snapshot"}, "properties": {"repobilityId": "1c5347e363b951a8", "scanner": "scanner-primary", "fingerprint": "c9f530ce5469cc20", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9c4500733029d7e9", "level": "note", "message": {"text": "Unused endpoint: ANY /neighbors/<memory_id>"}, "properties": {"repobilityId": "acecc55f5f0b8655", "scanner": "scanner-primary", "fingerprint": "9c4500733029d7e9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b45e064b63184b76", "level": "note", "message": {"text": "Unused endpoint: ANY /stats"}, "properties": {"repobilityId": "638903d074f90c04", "scanner": "scanner-primary", "fingerprint": "b45e064b63184b76", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ebfb1bb48cc94361", "level": "note", "message": {"text": "Unused endpoint: ANY /types"}, "properties": {"repobilityId": "a5f5a6f40d3b39ed", "scanner": "scanner-primary", "fingerprint": "ebfb1bb48cc94361", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-edd68f1fa4e566c1", "level": "note", "message": {"text": "Unused endpoint: ANY /relations"}, "properties": {"repobilityId": "27a99f6342e94cb3", "scanner": "scanner-primary", "fingerprint": "edd68f1fa4e566c1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-327af5f67b025924", "level": "note", "message": {"text": "Unused endpoint: ANY /admin/reembed"}, "properties": {"repobilityId": "06831c8eb44f91cf", "scanner": "scanner-primary", "fingerprint": "327af5f67b025924", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-495d432f2d3f03f4", "level": "note", "message": {"text": "Unused endpoint: ANY /admin/sync"}, "properties": {"repobilityId": "55c491fa1632e84b", "scanner": "scanner-primary", "fingerprint": "495d432f2d3f03f4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5911742c149188b3", "level": "note", "message": {"text": "Unused endpoint: ANY /enrichment/status"}, "properties": {"repobilityId": "d074a32ad31478eb", "scanner": "scanner-primary", "fingerprint": "5911742c149188b3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1e6c7a2803050b35", "level": "note", "message": {"text": "Unused endpoint: ANY /enrichment/reprocess"}, "properties": {"repobilityId": "21c24fe8889e85be", "scanner": "scanner-primary", "fingerprint": "1e6c7a2803050b35", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-99d00cfcdff609d8", "level": "note", "message": {"text": "Unused endpoint: ANY /entities"}, "properties": {"repobilityId": "7ad22e6c620a9049", "scanner": "scanner-primary", "fingerprint": "99d00cfcdff609d8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-233c3a94aa509e06", "level": "note", "message": {"text": "Unused endpoint: ANY /entity/<slug>"}, "properties": {"repobilityId": "07b727d5f204c918", "scanner": "scanner-primary", "fingerprint": "233c3a94aa509e06", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-05b9d8cfecbeacad", "level": "note", "message": {"text": "Unused endpoint: ANY /entities/merge-candidates"}, "properties": {"repobilityId": "636a6e2054646f21", "scanner": "scanner-primary", "fingerprint": "05b9d8cfecbeacad", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7d80bbfe165395ef", "level": "note", "message": {"text": "Unused endpoint: ANY /entities/audit"}, "properties": {"repobilityId": "0205a41c65566d2c", "scanner": "scanner-primary", "fingerprint": "7d80bbfe165395ef", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-81c5e81b0b0e6f94", "level": "note", "message": {"text": "Unused endpoint: ANY /entity/<slug>/merge"}, "properties": {"repobilityId": "e81ecbe0eb164323", "scanner": "scanner-primary", "fingerprint": "81c5e81b0b0e6f94", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1a6d91f2236825bf", "level": "note", "message": {"text": "Unused endpoint: ANY /"}, "properties": {"repobilityId": "289ae2fc77ed556f", "scanner": "scanner-primary", "fingerprint": "1a6d91f2236825bf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b011c4e3dbecb920", "level": "note", "message": {"text": "Unused endpoint: ANY /<path:path>"}, "properties": {"repobilityId": "36309d857ec6e3a4", "scanner": "scanner-primary", "fingerprint": "b011c4e3dbecb920", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-62c3bec944e8916a", "level": "note", "message": {"text": "Unused endpoint: ANY /consolidate"}, "properties": {"repobilityId": "8717e5e3774fbd4d", "scanner": "scanner-primary", "fingerprint": "62c3bec944e8916a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2a89bdaddc08bad9", "level": "note", "message": {"text": "Unused endpoint: ANY /consolidate/status"}, "properties": {"repobilityId": "f2b90ebcdca3ea34", "scanner": "scanner-primary", "fingerprint": "2a89bdaddc08bad9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8c236625afb6a8cb", "level": "note", "message": {"text": "Unused endpoint: GET /ready"}, "properties": {"repobilityId": "a7166901846d4b9a", "scanner": "scanner-primary", "fingerprint": "8c236625afb6a8cb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-453d111844b1c242", "level": "note", "message": {"text": "Unused endpoint: POST /alexa"}, "properties": {"repobilityId": "c37024fdfd69eb94", "scanner": "scanner-primary", "fingerprint": "453d111844b1c242", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-efbc80312c5027b5", "level": "note", "message": {"text": "Unused endpoint: ALL /mcp"}, "properties": {"repobilityId": "23b87a9273fe6021", "scanner": "scanner-primary", "fingerprint": "efbc80312c5027b5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-84cf759495734b24", "level": "note", "message": {"text": "Unused endpoint: GET /mcp/sse"}, "properties": {"repobilityId": "90b89b9384ea42b9", "scanner": "scanner-primary", "fingerprint": "84cf759495734b24", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e0d20bced1980c22", "level": "note", "message": {"text": "Unused endpoint: POST /mcp/messages"}, "properties": {"repobilityId": "0a46fac9c266f972", "scanner": "scanner-primary", "fingerprint": "e0d20bced1980c22", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}