The best-benchmarked open-source AI memory system. And it's free.
This report presents the forensic synthetic code analysis of MemPalace/mempalace, a Python project with 58,702 GitHub stars. SynthScan v2.0 examined 281,060 lines of code across 484 source files, recording 6162 pattern matches distributed across 20 syntactic categories. The overall adjusted score of 27.8 places this repository in the Moderate AI signal band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 6162 distinct pattern matches across 20 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tools/find_orphan_claude_jsonls.sh | 3 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tools/find_orphan_claude_jsonls.sh | 14 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_closets.py | 222 | # ── Tier 6a — date + line-range pointer segment ──────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_closets.py | 506 | # ── _extract_drawer_ids_from_closet ─────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_closets.py | 526 | # ── search_memories closet-first path ──────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_closets.py | 586 | # ── entity metadata ────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_closets.py | 699 | # ── BM25 hybrid search (real IDF over candidate corpus) ────────────── | COMMENT |
| MEDIUM | tests/test_closets.py | 66 | # ── mine_lock ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_closets.py | 149 | # ── build_closet_lines ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_closets.py | 350 | # ── upsert_closet_lines ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_closets.py | 389 | # ── purge_file_closets ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_closets.py | 409 | # ── project miner: closet rebuild end-to-end ────────────────────────── | COMMENT |
| MEDIUM | tests/test_closets.py | 761 | # ── diary ingest ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_closets.py | 939 | # ── #1539: per-entry drawers, oversized-entry chunking ───────── | COMMENT |
| MEDIUM | tests/test_closets.py | 1218 | # ── cross-wing tunnels ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_closets.py | 1292 | # ── regression: symmetry, durability, validation, concurrency ───── | COMMENT |
| MEDIUM | tests/test_closets.py | 1392 | # ── drawer-grep neighbor expansion ──────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_hallways_palace_scoped.py | 24 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_hallways_palace_scoped.py | 26 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_hallways_palace_scoped.py | 53 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_hallways_palace_scoped.py | 55 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_hallways_palace_scoped.py | 101 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_hallways_palace_scoped.py | 103 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_searcher.py | 69 | # ── search_memories (API) ────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_searcher.py | 728 | # ── _tokenize stop-word filter ───────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_searcher.py | 1071 | # ── _result_drawer_id logical-id resolution (#2185) ──────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_searcher.py | 1100 | # ── since/before date window (#463) ──────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_searcher.py | 27 | # ── build_where_filter (unit) ────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_searcher.py | 319 | # ── BM25 internals: None / empty document safety ───────────────────── | COMMENT |
| MEDIUM | tests/test_searcher.py | 357 | # ── search() (CLI print function) ───────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_backups.py | 244 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_backups.py | 246 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_miner_fts5_validation.py | 124 | # ── 1. Helper returns silently on a clean palace ──────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_miner_fts5_validation.py | 135 | # ── 2. Helper raises MineValidationError on corrupt sqlite ────────── | COMMENT |
| MEDIUM⚡ | tests/test_miner_fts5_validation.py | 174 | # ── 3. cmd_mine surfaces MineValidationError as exit-1 + banner ───── | COMMENT |
| MEDIUM⚡ | tests/test_miner_fts5_validation.py | 222 | # ── 4. Dry-run skips validation ───────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_miner_fts5_validation.py | 24 | # ── Helpers ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_split_mega_files.py | 6 | # ── Config loading ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_split_mega_files.py | 61 | # ── Config: force_reload and invalid JSON ────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_split_mega_files.py | 101 | # ── is_true_session_start ────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_split_mega_files.py | 182 | # ── extract_timestamp ────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_split_mega_files.py | 205 | # ── extract_subject ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_split_mega_files.py | 238 | # ── split_file ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_split_mega_files.py | 133 | # ── find_session_boundaries ──────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_palace_graph_tunnels.py | 517 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_palace_graph_tunnels.py | 519 | # ============================================================================= | COMMENT |
| MEDIUM | tests/test_palace_graph_tunnels.py | 590 | # ============================================================================= | COMMENT |
| MEDIUM | tests/test_palace_graph_tunnels.py | 592 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_logstream_sync.py | 90 | # ── HLC ─────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_logstream_sync.py | 140 | # ── Replica identity ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_logstream_sync.py | 173 | # ── Migration / backfill ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_logstream_sync.py | 368 | # ── HTTP endpoints + CLI (real wire) ───────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_logstream_sync.py | 225 | # ── Sync primitives ─────────────────────────────────────────────────────── | STRING |
| MEDIUM | tests/test_logstream_sync.py | 315 | # ── Convergence (engine over simulated wire) ───────────────────────────── | STRING |
| MEDIUM⚡ | tests/test_corpus_origin_integration.py | 1049 | # ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_corpus_origin_integration.py | 1056 | # ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_corpus_origin_integration.py | 1721 | # ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_corpus_origin_integration.py | 1730 | # ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_corpus_origin_integration.py | 114 | # ── Baseline test: pin v3.3.3 behavior ──────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_corpus_origin_integration.py | 152 | # ── corpus-origin test: with corpus_origin, personas reclassify ─────────── | COMMENT |
| 956 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | CONTRIBUTING.md | 46 | def test_function_never_fabricates_output_on_random_input(s): | CODE |
| LOW⚡ | tests/test_closets.py | 210 | def test_emits_fallback_line_when_nothing_extractable(self): | CODE |
| LOW⚡ | tests/test_closets.py | 217 | def test_pointer_references_first_three_drawers(self): | CODE |
| LOW⚡ | tests/test_closets.py | 224 | def test_includes_date_line_segment_when_metas_provided(self): | CODE |
| LOW⚡ | tests/test_closets.py | 510 | def test_parses_single_pointer(self): | CODE |
| LOW⚡ | tests/test_closets.py | 513 | def test_parses_multiple_pointers_per_line(self): | CODE |
| LOW⚡ | tests/test_closets.py | 517 | def test_dedupes_across_lines(self): | CODE |
| LOW⚡ | tests/test_closets.py | 521 | def test_empty_doc_returns_empty(self): | CODE |
| LOW⚡ | tests/test_closets.py | 530 | def test_pure_drawer_when_no_closets(self, palace_path, seeded_collection): | CODE |
| LOW⚡ | tests/test_closets.py | 540 | def test_closet_boost_marks_hit_as_drawer_plus_closet(self, palace_path, seeded_collection): | CODE |
| LOW⚡ | tests/test_closets.py | 590 | def test_extracts_capitalized_names(self): | CODE |
| LOW⚡ | tests/test_closets.py | 596 | def test_empty_for_no_entities(self): | CODE |
| LOW⚡ | tests/test_closets.py | 605 | def test_stoplist_filters_sentence_starters(self): | CODE |
| LOW⚡ | tests/test_closets.py | 703 | def test_scores_positive_for_matching_doc(self): | CODE |
| LOW⚡ | tests/test_closets.py | 711 | def test_scores_zero_when_no_overlap(self): | CODE |
| LOW⚡ | tests/test_closets.py | 715 | def test_idf_downweights_terms_present_in_every_doc(self): | CODE |
| LOW | tests/test_closets.py | 88 | def test_lock_acquires_and_releases(self, tmp_path): | CODE |
| LOW | tests/test_closets.py | 99 | def test_lock_blocks_concurrent_access(self, tmp_path): | CODE |
| LOW | tests/test_closets.py | 153 | def test_emits_pointer_line_shape(self): | CODE |
| LOW | tests/test_closets.py | 174 | def test_extracts_section_headers_as_topics(self): | CODE |
| LOW | tests/test_closets.py | 181 | def test_entity_stoplist_filters_sentence_starters(self): | CODE |
| LOW | tests/test_closets.py | 199 | def test_real_proper_nouns_survive_stoplist(self): | CODE |
| LOW | tests/test_closets.py | 299 | def test_date_segment_uses_filed_at_date_portion_only(self): | CODE |
| LOW | tests/test_closets.py | 320 | def test_content_date_preferred_over_filed_at(self): | CODE |
| LOW | tests/test_closets.py | 354 | def test_overwrites_existing_closet_does_not_append(self, palace_path): | CODE |
| LOW | tests/test_closets.py | 372 | def test_packs_into_multiple_closets_without_splitting_lines(self, palace_path): | CODE |
| LOW | tests/test_closets.py | 393 | def test_deletes_only_the_targeted_source(self, palace_path): | CODE |
| LOW | tests/test_closets.py | 413 | def test_remine_replaces_closets_completely(self, tmp_path): | CODE |
| LOW | tests/test_closets.py | 570 | def test_max_distance_filters_hybrid_hits(self, palace_path, seeded_collection): | CODE |
| LOW | tests/test_closets.py | 620 | def test_capped_list_never_truncates_a_name(self): | CODE |
| LOW | tests/test_closets.py | 664 | def test_known_registry_is_cached_by_mtime(self, monkeypatch, tmp_path): | CODE |
| LOW | tests/test_closets.py | 728 | def test_empty_inputs_return_zeros(self): | CODE |
| LOW | tests/test_closets.py | 733 | def test_hybrid_rank_promotes_keyword_match(self): | CODE |
| LOW | tests/test_closets.py | 746 | def test_hybrid_rank_absolute_normalization(self): | CODE |
| LOW | tests/test_closets.py | 765 | def test_ingest_creates_drawers_and_closets(self, tmp_path): | CODE |
| LOW | tests/test_closets.py | 779 | def test_ingest_skips_unchanged_on_second_run(self, tmp_path): | CODE |
| LOW | tests/test_closets.py | 793 | def test_ingest_detects_same_size_content_edit(self, tmp_path): | CODE |
| LOW | tests/test_closets.py | 830 | def test_legacy_state_backfills_content_hash(self, tmp_path): | CODE |
| LOW | tests/test_closets.py | 871 | def test_state_file_lives_outside_diary_dir(self, tmp_path): | CODE |
| LOW | tests/test_closets.py | 901 | def test_wing_prefixed_drawer_id_prevents_cross_diary_collision(self, tmp_path): | CODE |
| LOW | tests/test_closets.py | 941 | def test_diary_multiple_entries_one_drawer_each(self, tmp_path): | CODE |
| LOW | tests/test_closets.py | 962 | def test_large_diary_with_oversized_entry_chunks_within_entry(self, tmp_path): | CODE |
| LOW | tests/test_closets.py | 997 | def test_incremental_appends_new_entry_only(self, tmp_path): | CODE |
| LOW | tests/test_closets.py | 1024 | def test_entry_count_watermark_matches_drawer_count(self, tmp_path): | CODE |
| LOW | tests/test_closets.py | 1051 | def test_diary_chunk_index_is_global_across_entries(self, tmp_path): | CODE |
| LOW | tests/test_closets.py | 1088 | def test_diary_entry_deletion_purges_orphan_drawers(self, tmp_path): | CODE |
| LOW | tests/test_closets.py | 1123 | def test_diary_header_only_entry_produces_drawer(self, tmp_path): | CODE |
| LOW | tests/test_closets.py | 1149 | def test_diary_atomic_batched_upsert_on_failure(self, tmp_path, monkeypatch): | CODE |
| LOW | tests/test_closets.py | 1260 | def test_list_tunnels_with_and_without_filter(self): | CODE |
| LOW | tests/test_closets.py | 1274 | def test_dedup_same_endpoints_updates_label(self): | CODE |
| LOW | tests/test_closets.py | 1281 | def test_follow_tunnels_returns_connected_endpoints(self): | CODE |
| LOW | tests/test_closets.py | 1304 | def test_follow_tunnels_works_from_either_endpoint(self): | CODE |
| LOW | tests/test_closets.py | 1317 | def test_empty_endpoint_fields_rejected(self): | CODE |
| LOW | tests/test_closets.py | 1332 | def test_corrupt_tunnel_file_does_not_lose_new_writes(self): | CODE |
| LOW | tests/test_closets.py | 1350 | def test_atomic_write_leaves_no_stray_tmp_file(self): | CODE |
| LOW | tests/test_closets.py | 1359 | def test_concurrent_creates_preserve_all_tunnels(self): | CODE |
| LOW | tests/test_closets.py | 1385 | def test_created_at_is_timezone_aware(self): | CODE |
| LOW | tests/test_closets.py | 1421 | def test_expand_returns_matched_plus_neighbors(self, palace_path): | CODE |
| LOW | tests/test_closets.py | 1440 | def test_expand_at_start_of_file_only_has_next_neighbor(self, palace_path): | CODE |
| LOW | tests/test_closets.py | 1454 | def test_expand_at_end_of_file_only_has_prev_neighbor(self, palace_path): | CODE |
| 3981 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/find_orphan_claude_jsonls.sh | 55 | except Exception: | CODE |
| LOW | tools/find_orphan_claude_jsonls.sh | 89 | except Exception: | CODE |
| MEDIUM | tests/test_closets.py | 1366 | def worker(i): | CODE |
| LOW | tests/test_closets.py | 1370 | except Exception as e: | CODE |
| LOW | tests/test_hybrid_search.py | 29 | except Exception: | CODE |
| LOW | tests/conftest.py | 165 | except Exception: | CODE |
| LOW | tests/conftest.py | 180 | except Exception: | CODE |
| LOW | tests/conftest.py | 224 | except Exception: | CODE |
| LOW | tests/test_milvus_backend.py | 368 | except Exception: | CODE |
| LOW | tests/test_mine_lock_lifecycle.py | 217 | except Exception: | CODE |
| LOW | tests/test_mine_lock_lifecycle.py | 223 | except Exception: | CODE |
| LOW | tests/test_mcp_server.py | 1097 | except Exception: | CODE |
| MEDIUM | tests/test_sqlite_exact_backend.py | 711 | def owner_a(): | CODE |
| LOW | tests/test_sqlite_exact_backend.py | 1056 | except Exception as exc: | STRING |
| LOW | tests/test_live_pgvector_conformance.py | 61 | except Exception: | CODE |
| LOW | tests/test_live_pgvector_conformance.py | 278 | except Exception as exc: # noqa: BLE001 - collected for the report | CODE |
| LOW | tests/test_live_pgvector_conformance.py | 315 | except Exception as exc: # noqa: BLE001 - collected for the report | CODE |
| LOW | tests/test_hooks_cli.py | 904 | except Exception: | CODE |
| LOW⚡ | tests/test_daemon.py | 257 | except Exception: # noqa: BLE001 - best-effort; we force-shutdown below | CODE |
| LOW⚡ | tests/test_daemon.py | 264 | except Exception: # noqa: BLE001 | CODE |
| LOW⚡ | tests/test_daemon.py | 268 | except Exception: # noqa: BLE001 | CODE |
| LOW | tests/test_repair.py | 3027 | except Exception: | CODE |
| MEDIUM | tests/test_pgvector_backend.py | 781 | def racing_connect(dsn): | CODE |
| LOW | tests/test_pgvector_backend.py | 728 | except Exception: | CODE |
| LOW | tests/test_pgvector_backend.py | 799 | except Exception as exc: | CODE |
| LOW | tests/test_migrate.py | 314 | except Exception: | CODE |
| LOW | tests/test_migrate.py | 360 | except Exception: | CODE |
| LOW | tests/test_encoding_repair.py | 923 | except Exception: | CODE |
| LOW | tests/test_qdrant_backend.py | 557 | except Exception: | CODE |
| LOW⚡ | tests/test_service_palace_env.py | 38 | except Exception: # noqa: BLE001 - the call's outcome is not what this asserts | CODE |
| LOW⚡ | tests/test_service_palace_env.py | 51 | except Exception: # noqa: BLE001 | CODE |
| LOW | tests/benchmarks/conftest.py | 107 | except Exception: | CODE |
| LOW | tests/benchmarks/conftest.py | 114 | except Exception: | CODE |
| LOW | tests/benchmarks/conftest.py | 138 | except Exception: | CODE |
| LOW | tests/benchmarks/test_knowledge_graph_bench.py | 191 | except Exception: | CODE |
| LOW | tests/benchmarks/test_knowledge_graph_bench.py | 233 | except Exception: | CODE |
| LOW | tests/benchmarks/test_knowledge_graph_bench.py | 244 | except Exception: | CODE |
| LOW⚡ | mempalace/repair.py | 387 | except Exception: | CODE |
| LOW⚡ | mempalace/repair.py | 390 | except Exception as exc: | CODE |
| LOW⚡ | mempalace/repair.py | 396 | except Exception: | CODE |
| LOW | mempalace/repair.py | 95 | except Exception: | CODE |
| LOW | mempalace/repair.py | 116 | except Exception: | CODE |
| LOW | mempalace/repair.py | 128 | except Exception: | CODE |
| LOW | mempalace/repair.py | 138 | except Exception: | CODE |
| LOW | mempalace/repair.py | 167 | except Exception: | CODE |
| LOW | mempalace/repair.py | 194 | except Exception: | CODE |
| LOW | mempalace/repair.py | 207 | except Exception: | CODE |
| LOW | mempalace/repair.py | 210 | except Exception as fallback_exc: | CODE |
| LOW | mempalace/repair.py | 256 | except Exception: | CODE |
| LOW | mempalace/repair.py | 453 | except Exception: | CODE |
| LOW | mempalace/repair.py | 514 | except Exception: | CODE |
| LOW | mempalace/repair.py | 522 | except Exception: | CODE |
| LOW | mempalace/repair.py | 588 | except Exception: | CODE |
| LOW | mempalace/repair.py | 593 | except Exception: | CODE |
| LOW | mempalace/repair.py | 726 | except Exception: | CODE |
| LOW | mempalace/repair.py | 1153 | except Exception as exc: | CODE |
| LOW | mempalace/repair.py | 1233 | except Exception: | CODE |
| LOW | mempalace/repair.py | 1373 | except Exception as exc: | CODE |
| LOW | mempalace/repair.py | 1496 | except Exception as e: | CODE |
| LOW | mempalace/repair.py | 1576 | except Exception as promote_error: | CODE |
| 358 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_miner_fts5_validation.py | 10 | CODE | |
| LOW | tests/test_corpus_origin_integration.py | 25 | CODE | |
| LOW | tests/test_hook_write_routing.py | 1 | CODE | |
| LOW | tests/test_mine_lock_lifecycle.py | 1 | CODE | |
| LOW | tests/test_search_distinct_closet_results.py | 1 | CODE | |
| LOW | tests/test_sync.py | 1429 | CODE | |
| LOW | tests/test_codex_plugin_manifest.py | 3 | CODE | |
| LOW | tests/test_repair_lock_safety.py | 16 | CODE | |
| LOW | tests/test_hooks_shell.py | 20 | CODE | |
| LOW | tests/test_cursor_plugin_manifest.py | 29 | CODE | |
| LOW | tests/test_vector_write_gate.py | 14 | CODE | |
| LOW | tests/test_format_miner.py | 12 | CODE | |
| LOW | tests/test_format_miner.py | 610 | CODE | |
| LOW | tests/test_hermes_integration.py | 12 | CODE | |
| LOW | tests/test_hnsw_capacity.py | 9 | CODE | |
| LOW | tests/test_cursor_hooks_install.py | 16 | CODE | |
| LOW | tests/test_write_routing.py | 1 | CODE | |
| LOW | tests/test_collision_scan.py | 16 | CODE | |
| LOW | tests/test_ids.py | 11 | CODE | |
| LOW | tests/test_antigravity_hooks_install.py | 15 | CODE | |
| LOW | tests/test_chroma_collection_lock.py | 26 | CODE | |
| LOW | tests/test_antigravity_hooks_shell.py | 20 | CODE | |
| LOW | tests/test_cursor_hooks_shell.py | 28 | CODE | |
| LOW | tests/test_hooks_bash_compat.py | 17 | CODE | |
| LOW | tests/test_dynamics.py | 10 | CODE | |
| LOW | tests/test_fact_checker.py | 19 | CODE | |
| LOW | tests/test_palace_locks.py | 10 | CODE | |
| LOW | tests/test_qdrant_bulk_metadata_scroll.py | 72 | CODE | |
| LOW | tests/test_service_palace_env.py | 3 | CODE | |
| LOW | tests/benchmarks/benchmark_dialect.py | 1 | CODE | |
| LOW | tests/benchmarks/benchmark_dialect.py | 3 | CODE | |
| LOW | mempalace/sync.py | 22 | CODE | |
| LOW | mempalace/logsync.py | 28 | CODE | |
| LOW | mempalace/logsync.py | 28 | CODE | |
| LOW | mempalace/service.py | 9 | CODE | |
| LOW | mempalace/convo_scanner.py | 22 | CODE | |
| LOW | mempalace/project_scanner.py | 18 | CODE | |
| LOW | mempalace/hallways.py | 33 | CODE | |
| LOW | mempalace/palace_graph.py | 21 | CODE | |
| LOW | mempalace/embedding.py | 48 | CODE | |
| LOW | mempalace/write_routing.py | 11 | CODE | |
| LOW | mempalace/hook_shell.py | 9 | CODE | |
| LOW | mempalace/collision_scan.py | 24 | CODE | |
| LOW | mempalace/__init__.py | 38 | CODE | |
| LOW | mempalace/fact_checker.py | 28 | CODE | |
| LOW | mempalace/encoding_repair.py | 3 | CODE | |
| LOW | mempalace/wal.py | 13 | CODE | |
| LOW | mempalace/llm_refine.py | 21 | CODE | |
| LOW | mempalace/server_registry.py | 25 | CODE | |
| LOW | mempalace/llm_client.py | 24 | CODE | |
| LOW | mempalace/corpus_origin.py | 35 | CODE | |
| LOW | mempalace/_stdio.py | 25 | CODE | |
| LOW | mempalace/format_miner.py | 59 | CODE | |
| LOW | mempalace/sweeper.py | 39 | CODE | |
| LOW | mempalace/ids.py | 16 | CODE | |
| LOW | mempalace/daemon.py | 8 | CODE | |
| LOW | mempalace/entity_detector.py | 33 | CODE | |
| LOW | mempalace/dynamics.py | 29 | CODE | |
| LOW | mempalace/mcp_proxy.py | 22 | CODE | |
| LOW | mempalace/backends/milvus.py | 11 | CODE | |
| 102 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/render_jsonl.py | 20 | CODE | |
| LOW | tests/test_corpus_origin_integration.py | 1334 | CODE | |
| LOW | tests/conftest.py | 146 | CODE | |
| LOW | tests/conftest.py | 154 | CODE | |
| LOW | tests/test_repair_lock_safety.py | 39 | CODE | |
| LOW | tests/test_hooks_cli.py | 476 | CODE | |
| LOW | tests/test_hooks_cli.py | 508 | CODE | |
| LOW | tests/test_hooks_cli.py | 946 | CODE | |
| LOW | tests/test_hooks_cli.py | 962 | CODE | |
| LOW | tests/test_hooks_cli.py | 989 | CODE | |
| LOW | tests/test_hooks_cli.py | 1024 | CODE | |
| LOW | tests/test_hooks_cli.py | 1058 | CODE | |
| LOW | tests/test_hooks_cli.py | 1107 | CODE | |
| LOW | tests/test_hooks_cli.py | 1145 | CODE | |
| LOW | tests/test_hooks_cli.py | 1156 | CODE | |
| LOW | tests/test_hooks_cli.py | 1311 | CODE | |
| LOW | tests/test_hooks_cli.py | 1361 | CODE | |
| LOW | tests/test_hooks_cli.py | 1386 | CODE | |
| LOW | tests/test_hnsw_capacity.py | 361 | CODE | |
| LOW | tests/test_chroma_collection_lock.py | 80 | CODE | |
| LOW | tests/test_logstream_sse.py | 66 | CODE | |
| LOW | tests/test_miner.py | 2418 | CODE | |
| LOW | tests/test_palace_locks.py | 56 | CODE | |
| LOW | tests/test_palace_locks.py | 271 | CODE | |
| LOW | tests/benchmarks/report.py | 34 | CODE | |
| LOW | mempalace/repair.py | 199 | CODE | |
| LOW | mempalace/repair.py | 458 | CODE | |
| LOW | mempalace/repair.py | 548 | CODE | |
| LOW | mempalace/repair.py | 1042 | CODE | |
| LOW | mempalace/repair.py | 1326 | CODE | |
| LOW | mempalace/repair.py | 1747 | CODE | |
| LOW | mempalace/repair.py | 2532 | CODE | |
| LOW | mempalace/sync.py | 312 | CODE | |
| LOW | mempalace/logsync.py | 51 | CODE | |
| LOW | mempalace/service.py | 175 | CODE | |
| LOW | mempalace/convo_scanner.py | 57 | CODE | |
| LOW | mempalace/project_scanner.py | 526 | CODE | |
| LOW | mempalace/miner.py | 638 | CODE | |
| LOW | mempalace/miner.py | 786 | CODE | |
| LOW | mempalace/miner.py | 890 | CODE | |
| LOW | mempalace/miner.py | 1492 | CODE | |
| LOW | mempalace/miner.py | 1716 | CODE | |
| LOW | mempalace/miner.py | 1901 | CODE | |
| LOW | mempalace/palace_graph.py | 127 | CODE | |
| LOW | mempalace/palace_graph.py | 195 | CODE | |
| LOW | mempalace/palace_graph.py | 305 | CODE | |
| LOW | mempalace/palace_graph.py | 773 | CODE | |
| LOW | mempalace/room_detector_local.py | 100 | CODE | |
| LOW | mempalace/room_detector_local.py | 195 | CODE | |
| LOW | mempalace/embedding.py | 389 | CODE | |
| LOW | mempalace/dialect.py | 809 | CODE | |
| LOW | mempalace/dialect.py | 931 | CODE | |
| LOW | mempalace/knowledge_graph.py | 338 | CODE | |
| LOW | mempalace/knowledge_graph.py | 370 | CODE | |
| LOW | mempalace/knowledge_graph.py | 718 | CODE | |
| LOW | mempalace/onboarding.py | 113 | CODE | |
| LOW | mempalace/onboarding.py | 145 | CODE | |
| LOW | mempalace/onboarding.py | 390 | CODE | |
| LOW | mempalace/searcher.py | 853 | CODE | |
| LOW | mempalace/exporter.py | 68 | CODE | |
| 122 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pyproject.toml | 81 | "pytest-rerunfailures>=12.0", | COMMENT |
| LOW | pyproject.toml | 101 | ] | COMMENT |
| LOW | pyproject.toml | 121 | dml = ["onnxruntime-directml>=1.16"] | COMMENT |
| LOW | docker-entrypoint.sh | 1 | #!/usr/bin/env sh | COMMENT |
| LOW | docker-compose.yml | 1 | # MemPalace via Docker Compose. | COMMENT |
| LOW | docker-compose.yml | 21 | tty: false | COMMENT |
| LOW | tools/backup_claude_jsonls.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | tools/find_orphan_claude_jsonls.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | deploy/docker-compose.server.yml | 1 | # MemPalace remote team server — MCP over HTTP, backed by a central Qdrant. | COMMENT |
| LOW | tests/test_corpus_origin_integration.py | 1321 | # must use feature names ("corpus_origin", "corpus-origin detection") | COMMENT |
| LOW | tests/test_sync.py | 1861 | COMMENT | |
| LOW | tests/test_format_miner.py | 561 | COMMENT | |
| LOW | tests/test_daemon.py | 21 | except MineAlreadyRunning: | COMMENT |
| LOW | tests/test_convo_miner.py | 301 | finally: | COMMENT |
| LOW | tests/test_palace_locks.py | 441 | COMMENT | |
| LOW | tests/test_qdrant_bulk_metadata_scroll.py | 321 | assert call_log[0]["limit"] == qdrant_mod._SCROLL_PAGE_SIZE | COMMENT |
| LOW | tests/test_qdrant_bulk_metadata_scroll.py | 341 | # automatic link between the two. (Diagnosed during review on #1832 after | COMMENT |
| LOW | tests/test_normalize.py | 461 | # ── _try_gemini_jsonl ────────────────────────────────────────────────── | COMMENT |
| LOW | tests/test_normalize.py | 2061 | # Pi agent stores sessions as JSONL under | COMMENT |
| LOW | mempalace/repair.py | 221 | f"no-offset fallback failed after collecting {len(ids)} " | COMMENT |
| LOW | mempalace/repair.py | 241 | # HNSW-preflight-sweep work). | COMMENT |
| LOW | mempalace/repair.py | 941 | # killed-mid-write mines are the usual cause (#1596). A regex matching only | COMMENT |
| LOW | mempalace/repair.py | 2221 | ts = datetime.now().strftime("%Y%m%d-%H%M%S") | COMMENT |
| LOW | mempalace/sync.py | 441 | if bucket == "gitignored": | COMMENT |
| LOW | mempalace/config.py | 41 | def strip_lone_surrogates(text: str) -> str: | COMMENT |
| LOW | mempalace/config.py | 121 | raise ValueError(f"{field_name} exceeds maximum length of {MAX_NAME_LENGTH} characters") | COMMENT |
| LOW | mempalace/config.py | 501 | tmp = str(path.with_name(f"{path.name}.tmp-{os.getpid()}")) | COMMENT |
| LOW | mempalace/config.py | 621 | self._people_map_file = self._config_dir / "people_map.json" | COMMENT |
| LOW | mempalace/miner.py | 201 | ) | COMMENT |
| LOW | mempalace/miner.py | 661 | chunk_overlap = CHUNK_OVERLAP | COMMENT |
| LOW | mempalace/miner.py | 701 | # Running newline tallies for the 1-indexed (line_start, line_end) | COMMENT |
| LOW | mempalace/miner.py | 1101 | if not matched: | COMMENT |
| LOW | mempalace/miner.py | 1121 | # 4. Filesystem mtime (os.path.getmtime) | COMMENT |
| LOW | mempalace/miner.py | 1141 | # already validated. | COMMENT |
| LOW | mempalace/miner.py | 1561 | # both delete, and both insert — creating duplicates or losing data. | COMMENT |
| LOW | mempalace/palace_graph.py | 841 | # When two wings have one or more confirmed topics in common (e.g. both | COMMENT |
| LOW | mempalace/embedding.py | 81 | # | COMMENT |
| LOW | mempalace/embedding.py | 241 | COMMENT | |
| LOW | mempalace/searcher.py | 961 | ).fetchall() | COMMENT |
| LOW | mempalace/__init__.py | 1 | """MemPalace — Give your AI a memory. No API key required.""" | COMMENT |
| LOW | mempalace/__init__.py | 41 | # warnings ("capture() takes 1 positional argument but 3 were given"). In 1.x the | COMMENT |
| LOW | mempalace/encoding_repair.py | 81 | ) | COMMENT |
| LOW | mempalace/cli.py | 181 | if not samples: | COMMENT |
| LOW | mempalace/cli.py | 1661 | skipped_from = cursor | COMMENT |
| LOW | mempalace/cli.py | 2261 | COMMENT | |
| LOW | mempalace/cli.py | 2301 | # scripts and CI gates see the failure. | COMMENT |
| LOW | mempalace/corpus_origin.py | 41 | COMMENT | |
| LOW | mempalace/palace.py | 61 | "target", | COMMENT |
| LOW | mempalace/palace.py | 1141 | # `_clients` dict and leave _DEFAULT_BACKEND's live handle in place, | COMMENT |
| LOW | mempalace/palace.py | 1161 | # open file description, so a second open of the lock file from the same process | COMMENT |
| LOW | mempalace/ids.py | 21 | # Audits compare like-for-like: drawers without ``id_recipe`` are treated | COMMENT |
| LOW | mempalace/diary_ingest.py | 221 | # Per-entry drawers, with character chunking inside any entry | COMMENT |
| LOW | mempalace/migrate.py | 241 | COMMENT | |
| LOW | mempalace/migrate.py | 401 | # Wing-name normalization migration (#1675 follow-up) | COMMENT |
| LOW | mempalace/hooks_cli.py | 81 | 3. Editable install: venv/ sibling to mempalace/ | COMMENT |
| LOW | mempalace/hooks_cli.py | 281 | # fire should skip rather than pile up — multiple concurrent mines against the | COMMENT |
| LOW | mempalace/daemon.py | 461 | # | COMMENT |
| LOW | mempalace/mcp_server.py | 201 | # it here instead of relying on logging's default formatter. The | COMMENT |
| LOW | mempalace/mcp_server.py | 341 | # to 8 h), a background daemon thread exits the process once no request | COMMENT |
| LOW | mempalace/mcp_server.py | 381 | "mempalace_artifact_put", | COMMENT |
| 80 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | tests/test_palace_graph_tunnels.py | 93 | # instead of raising — keeps read-path filters robust to bad records. | COMMENT |
| MEDIUM⚡ | tests/test_hooks_cli.py | 423 | # here: _count_human_messages counts both harness shapes, and we assert only | COMMENT |
| MEDIUM⚡ | tests/test_hooks_cli.py | 424 | # the harness -> agent_name routing, not transcript parsing. | COMMENT |
| MEDIUM | tests/test_hooks_bash_compat.py | 152 | # leaks debug output here would silently break the harness contract. | COMMENT |
| MEDIUM⚡ | tests/test_hooks_bash_compat.py | 349 | # and the bottom call supplies the ``--hook session-end --harness`` args | COMMENT |
| MEDIUM⚡ | tests/test_cli_logstream.py | 724 | # a harness backgrounds this process to receive. | COMMENT |
| MEDIUM | mempalace/repair.py | 2226 | # harness), renaming the directory fails atomically UP FRONT on | COMMENT |
| LOW | mempalace/room_detector_local.py | 334 | # If still nothing, just use general | COMMENT |
| MEDIUM | mempalace/cli.py | 1589 | # silently, leaving a harness waiting on a watcher it believes will | COMMENT |
| MEDIUM⚡ | mempalace/format_miner.py | 319 | """Convert ``path`` to plain text via MarkItDown, with comprehensive fringe-case handling. | STRING |
| MEDIUM | mempalace/hooks_cli.py | 1517 | # Validate the harness-provided transcript path before touching it | COMMENT |
| MEDIUM | mempalace/mcp_server.py | 8186 | # this palace, a stdio server spawned by an agent harness must not open its | COMMENT |
| MEDIUM | mempalace/backends/base.py | 628 | #: no-op, so a benchmark harness can trust the set. Backends MAY add their | COMMENT |
| MEDIUM | hooks/mempal_save_hook.sh | 67 | # Why this is nontrivial: GUI-launched Claude Code on macOS (or any harness | COMMENT |
| MEDIUM | hooks/mempal_save_hook.sh | 128 | # every Stop hook for users on i18n harnesses or unusual harness configs. | COMMENT |
| MEDIUM | hooks/mempal_session_end_hook.sh | 9 | # exited. All logic lives in mempalace.hooks_cli for cross-harness extensibility. | COMMENT |
| MEDIUM | hooks/mempal_session_end_hook.sh | 40 | # Return immediately so the harness never blocks on session exit. | COMMENT |
| MEDIUM | hooks/antigravity/lib/common.sh | 216 | # a hostile / malformed harness payload cannot inject command tokens. | COMMENT |
| MEDIUM | benchmarks/model_eval/metrics.py | 25 | # the harness can land on develop independently of the model-router PR. | COMMENT |
| MEDIUM | .claude-plugin/hooks/mempal-stop-hook.sh | 3 | # All logic lives in mempalace.hooks_cli for cross-harness extensibility | COMMENT |
| MEDIUM | .claude-plugin/hooks/mempal-session-end-hook.sh | 11 | # mempalace.hooks_cli for cross-harness extensibility. | COMMENT |
| MEDIUM | .claude-plugin/hooks/mempal-session-end-hook.sh | 42 | # Return immediately so the harness never blocks on session exit. | COMMENT |
| MEDIUM | .claude-plugin/hooks/mempal-precompact-hook.sh | 3 | # All logic lives in mempalace.hooks_cli for cross-harness extensibility | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | CHANGELOG.md | 378 | - **`mempalace repair` can now recover palaces whose HNSW segment writer is stuck on `apply_logs`.** Both the existing ` | CODE |
| MEDIUM | pyproject.toml | 33 | # Multilingual embedding model deps. Onboarding now offers the | COMMENT |
| MEDIUM | pyproject.toml | 115 | # Hardware acceleration for the ONNX embedding model. Install exactly one: | COMMENT |
| MEDIUM | docker-compose.yml | 11 | # config, and the cached embedding model across runs. | COMMENT |
| MEDIUM | website/guide/antigravity.md | 272 | ## Joining the shared brain (multi-agent) | COMMENT |
| MEDIUM | tests/test_closets.py | 970 | # the embedding model's hard token limit. This trips the size-cap | COMMENT |
| MEDIUM | tests/test_mcp_server.py | 403 | # palace scaffold on disk before the user runs ``mempalace init``. | COMMENT |
| MEDIUM⚡ | tests/test_miner.py | 2683 | # hallucinates dates on benign inputs. These tests pin the fix: junk | COMMENT |
| MEDIUM | tests/test_migrate_wings.py | 68 | # Explicit embeddings keep the test hermetic (no embedding model needed) — | COMMENT |
| MEDIUM | mempalace/miner.py | 1137 | # would hallucinate dates from any digit-bearing text (Igor's reproductions | COMMENT |
| MEDIUM | mempalace/miner.py | 1151 | # padding from today's date, which is hallucination, not extraction. | COMMENT |
| MEDIUM | mempalace/miner.py | 1340 | # (no fuzzy=True) — without it, dateutil hallucinates dates from any | COMMENT |
| MEDIUM | mempalace/mcp_server.py | 3177 | # embedding model never sees a document above ``chunk_size``. | COMMENT |
| MEDIUM | mempalace/mcp_server.py | 4198 | # embedding model never sees a document above ``chunk_size``. | COMMENT |
| MEDIUM | mempalace/mcp_server.py | 4212 | # if the embedding model fails mid-loop. ``col.add`` (not | COMMENT |
| MEDIUM | hooks/mempal_precompact_hook.sh | 5 | # gets compressed to free up context window space. | COMMENT |
| MEDIUM | benchmarks/BENCHMARKS.md | 749 | Same purpose as #2: isolate the contribution of a better embedding model from the contribution of heuristics. | CODE |
| MEDIUM | benchmarks/model_eval/runner.py | 73 | # Tasks that score via semantic similarity and require an embedding model. | COMMENT |
| MEDIUM | benchmarks/model_eval/README.md | 34 | # This script reads candidates.yaml and pulls every tier-1 model + the embedding model | COMMENT |
| MEDIUM | benchmarks/model_eval/reports/2026-05-10-analysis.md | 200 | ### The 0.36 "hallucination rate" on qwen3:4b memory extraction is a scoring artifact | COMMENT |
| MEDIUM | scripts/docker-smoke.sh | 91 | # First run also downloads the ~80 MB embedding model into the volume, so this | COMMENT |
| MEDIUM | .github/workflows/docker-publish.yml | 53 | # Reaches Chroma's S3 once to fetch the ~80 MB embedding model, so it is | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_mine_lock_lifecycle.py | 20 | def _set_home(monkeypatch, tmp_path: Path) -> None: | CODE |
| LOW | tests/test_hnsw_capacity.py | 404 | def _set_drawer_created_at(palace: str, timestamps: dict[int, str]) -> None: | CODE |
| LOW | mempalace/sync.py | 30 | logger = logging.getLogger(__name__) | CODE |
| LOW | mempalace/sync.py | 524 | __all__ = [ | CODE |
| LOW | mempalace/logsync.py | 43 | __all__ = ["PEERS_FILENAME", "SyncPeerError", "load_peers", "sync_all", "sync_with_peer"] | CODE |
| LOW | mempalace/config.py | 1137 | def set_embedding_model(self, model: str) -> None: | CODE |
| LOW | mempalace/config.py | 1153 | def set_backend(self, backend: str) -> None: | CODE |
| LOW⚡ | mempalace/hallways.py | 58 | __all__ = [ | CODE |
| LOW | mempalace/miner.py | 858 | def _set_wing_topics(existing: dict, wing_key: str, topics_for_wing: list, coerce) -> None: | CODE |
| LOW | mempalace/room_detector_local.py | 19 | logger = logging.getLogger(__name__) | CODE |
| LOW | mempalace/embedding.py | 58 | logger = logging.getLogger(__name__) | CODE |
| LOW | mempalace/__init__.py | 60 | __all__ = ["__version__"] | CODE |
| LOW | mempalace/wal.py | 21 | logger = logging.getLogger(__name__) | CODE |
| LOW | mempalace/server_registry.py | 34 | logger = logging.getLogger(__name__) | CODE |
| LOW | mempalace/format_miner.py | 94 | __all__ = [ | CODE |
| LOW | mempalace/sweeper.py | 51 | logger = logging.getLogger(__name__) | CODE |
| LOW | mempalace/diary_ingest.py | 38 | logger = logging.getLogger(__name__) | CODE |
| LOW | mempalace/dynamics.py | 245 | __all__ = [ | CODE |
| LOW | mempalace/mcp_proxy.py | 31 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | mempalace/backends/milvus.py | 353 | def set_embedder_identity(self, identity) -> None: | CODE |
| LOW | mempalace/backends/milvus.py | 50 | logger = logging.getLogger(__name__) | CODE |
| LOW | mempalace/backends/milvus.py | 1055 | def _set_embedder_identity(self, palace: PalaceRef, collection_name: str, identity) -> None: | CODE |
| LOW | mempalace/backends/milvus.py | 1325 | __all__ = [ | CODE |
| LOW | mempalace/backends/qdrant.py | 49 | logger = logging.getLogger(__name__) | CODE |
| LOW | mempalace/backends/qdrant.py | 719 | def set_embedder_identity(self, identity) -> None: | CODE |
| LOW | mempalace/backends/qdrant.py | 1302 | def _set_embedder_identity(self, palace: PalaceRef, collection_name: str, identity) -> None: | CODE |
| LOW | mempalace/backends/qdrant.py | 1487 | __all__ = ["QdrantBackend", "QdrantCollection"] | CODE |
| LOW | mempalace/backends/registry.py | 24 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | mempalace/backends/embedding_wrapper.py | 78 | def set_embedder_identity(self, identity) -> None: | CODE |
| LOW | mempalace/backends/__init__.py | 55 | __all__ = [ | CODE |
| LOW | mempalace/backends/pgvector.py | 62 | logger = logging.getLogger(__name__) | CODE |
| LOW | mempalace/backends/pgvector.py | 859 | def set_embedder_identity(self, identity) -> None: | CODE |
| LOW | mempalace/backends/pgvector.py | 1480 | def _set_embedder_identity(self, palace: PalaceRef, collection_name: str, identity) -> None: | CODE |
| LOW | mempalace/backends/chroma.py | 39 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | mempalace/backends/chroma.py | 2450 | def set_embedder_identity(self, identity) -> None: | STRING |
| LOW⚡ | mempalace/backends/base.py | 454 | def set_embedder_identity(self, identity: EmbedderIdentity) -> None: | CODE |
| LOW | mempalace/backends/sqlite_exact.py | 45 | logger = logging.getLogger(__name__) | CODE |
| LOW | mempalace/backends/sqlite_exact.py | 589 | def set_embedder_identity(self, identity) -> None: | STRING |
| LOW | mempalace/backends/sqlite_exact.py | 1741 | __all__ = ["SQLiteExactBackend", "SQLiteExactCollection"] | STRING |
| LOW | mempalace/sources/registry.py | 29 | logger = logging.getLogger(__name__) | CODE |
| LOW | mempalace/sources/__init__.py | 48 | __all__ = [ | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | mempalace/onboarding.py | 84 | # Step 1: Mode selection | COMMENT |
| LOW⚡ | mempalace/onboarding.py | 268 | # Step 6: Ambiguity warnings | COMMENT |
| LOW⚡ | mempalace/onboarding.py | 399 | # Step 1: Mode | COMMENT |
| LOW⚡ | mempalace/onboarding.py | 409 | # Step 2: People | COMMENT |
| LOW⚡ | mempalace/onboarding.py | 412 | # Step 3: Projects | COMMENT |
| LOW⚡ | mempalace/onboarding.py | 415 | # Step 4: Wings (stored in config, not registry — just show user) | COMMENT |
| LOW⚡ | mempalace/onboarding.py | 418 | # Step 5: Auto-detect additional people from files | COMMENT |
| LOW | mempalace/onboarding.py | 451 | # Step 6: Warn about ambiguous names | COMMENT |
| LOW⚡ | mempalace/onboarding.py | 141 | # Step 2: People | STRING |
| LOW⚡ | mempalace/onboarding.py | 196 | # Step 3: Projects | STRING |
| LOW⚡ | mempalace/onboarding.py | 222 | # Step 4: Wings | STRING |
| LOW⚡ | mempalace/onboarding.py | 244 | # Step 5: Auto-detect from files | STRING |
| LOW⚡ | mempalace/instructions/status.md | 5 | ## Step 1: Gather Palace Status | COMMENT |
| LOW⚡ | mempalace/instructions/status.md | 12 | ## Step 2: Display Wing/Room/Drawer Counts | COMMENT |
| LOW⚡ | mempalace/instructions/status.md | 22 | ## Step 3: Knowledge Graph Stats (MCP only) | COMMENT |
| LOW⚡ | mempalace/instructions/status.md | 32 | ## Step 4: Suggest Next Actions | COMMENT |
| LOW | mempalace/instructions/init.md | 6 | ## Step 1: Check Python version | COMMENT |
| LOW | mempalace/instructions/init.md | 12 | ## Step 2: Check if mempalace is already installed | COMMENT |
| LOW | mempalace/instructions/init.md | 24 | ## Step 3: Install mempalace | COMMENT |
| LOW⚡ | mempalace/instructions/init.md | 48 | ## Step 4: Ask for project directory | COMMENT |
| LOW⚡ | mempalace/instructions/init.md | 54 | ## Step 5: Initialize the palace | COMMENT |
| LOW⚡ | mempalace/instructions/init.md | 60 | ## Step 6: Configure MCP server | COMMENT |
| LOW | mempalace/instructions/init.md | 73 | ## Step 7: Verify installation | COMMENT |
| LOW | mempalace/instructions/init.md | 80 | ## Step 8: Show next steps | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_hall_detection.py | 109 | # Create a conversation file with technical content | COMMENT |
| MEDIUM⚡ | tests/test_mcp_server.py | 841 | # Create a collection so status works | COMMENT |
| MEDIUM⚡ | tests/test_mcp_server.py | 871 | # Create the DB file (init does this) but NOT the collection | COMMENT |
| MEDIUM⚡ | tests/test_mcp_server.py | 4321 | # Create a real collection so _get_collection succeeds | COMMENT |
| MEDIUM | tests/test_repair.py | 537 | # Create a valid sqlite file so the repair preflight can run quick_check. | COMMENT |
| MEDIUM | tests/test_miner.py | 2816 | # Create a real file with known mtime. | COMMENT |
| MEDIUM⚡ | tests/test_backends.py | 2125 | # Create the collection using the default (minilm-based) EF. | COMMENT |
| MEDIUM | tests/benchmarks/test_knowledge_graph_bench.py | 58 | # Create a hub entity connected to many others | COMMENT |
| MEDIUM⚡ | hooks/cursor/lib/common.sh | 26 | # This file is sourced, not executed, so it intentionally has no | COMMENT |
| MEDIUM⚡ | hooks/antigravity/lib/common.sh | 32 | # This file is sourced, not executed, so it intentionally has no | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/test_mcp_server.py | 5501 | the alias only fills in when 'entry' is absent or null, not merely falsy. | STRING |
| HIGH⚡ | tests/test_hooks_cli.py | 769 | '{"type":"x","cwd":null}\n' | CODE |
| HIGH⚡ | tests/test_hooks_cli.py | 764 | """A cwd field that isn't a string (e.g. null, number) must be skipped.""" | STRING |
| HIGH | tests/test_save_hook_mines.py | 115 | script.write_text(f'{func_src}\nis_valid_transcript_path "$1" && echo OK || echo NO\n') | CODE |
| HIGH | tests/test_corpus_origin.py | 283 | "primary_platform": null, | CODE |
| HIGH | tests/test_cli.py | 1499 | Otherwise ``repair --dry-run && repair --yes`` walks into the destructive | STRING |
| HIGH | mempalace/mcp_server.py | 6710 | # all (or passed it as null). An explicit entry — even "" — wins. | COMMENT |
| HIGH | benchmarks/mine_bench.py | 17 | uv venv /tmp/gpu && source /tmp/gpu/bin/activate | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/test_closet_llm.py | 0 | import sys from mempalace.palace import mine_palace_lock with mine_palace_lock(sys.argv[1]): print("ready", flush=true) | STRING |
| HIGH | tests/test_mcp_server.py | 0 | import sys from mempalace.palace import mine_palace_lock with mine_palace_lock(sys.argv[1]): print("ready", flush=true) | STRING |
| HIGH | tests/test_sqlite_exact_backend.py | 0 | import sys from mempalace.palace import mine_palace_lock with mine_palace_lock(sys.argv[1]): print("ready", flush=true) | STRING |
| HIGH | mempalace/repair.py | 0 | select count(*) from embeddings e join segments s on e.segment_id = s.id join collections c on s.collection = c.id where | STRING |
| HIGH | mempalace/mcp_server.py | 0 | select count(*) from embeddings e join segments s on e.segment_id = s.id join collections c on s.collection = c.id where | STRING |
| HIGH | mempalace/backends/chroma.py | 0 | select count(*) from embeddings e join segments s on e.segment_id = s.id join collections c on s.collection = c.id where | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/test_closets.py | 211 | content = "lorem ipsum dolor sit amet consectetur adipiscing elit" | CODE |
| LOW⚡ | tests/test_closets.py | 211 | content = "lorem ipsum dolor sit amet consectetur adipiscing elit" | CODE |
| LOW⚡ | tests/test_miner_fts5_validation.py | 181 | (src / "a.md").write_text("placeholder") | CODE |
| LOW⚡ | tests/test_miner_fts5_validation.py | 231 | big = "lorem ipsum " * 500 | CODE |
| LOW | tests/test_miner_fts5_validation.py | 283 | (src / "big.md").write_text("lorem ipsum " * 200) | CODE |
| LOW | tests/test_miner_fts5_validation.py | 296 | (src / "big.md").write_text("lorem ipsum dolor " * 200) | CODE |
| LOW | tests/test_miner_fts5_validation.py | 336 | (src / "big.md").write_text("lorem ipsum " * 200) | CODE |
| LOW | tests/test_miner_fts5_validation.py | 352 | (src / "big.md").write_text("lorem ipsum dolor " * 200) | CODE |
| LOW | tests/test_miner_fts5_validation.py | 487 | (src / "big.md").write_text("lorem ipsum " * 200) | CODE |
| LOW | tests/test_miner_fts5_validation.py | 497 | (src / "big.md").write_text("lorem ipsum dolor " * 200) | CODE |
| LOW | tests/conftest.py | 371 | kg.add_triple("Alice", "works_at", "Acme Corp", valid_from="2020-01-01", valid_to="2024-12-31") | CODE |
| LOW⚡ | tests/test_format_miner.py | 224 | f.write_bytes(b"placeholder") | CODE |
| LOW⚡ | tests/test_format_miner.py | 232 | f.write_bytes(b"placeholder") | CODE |
| LOW⚡ | tests/test_project_scanner.py | 186 | assert _looks_like_real_name("Jane Doe") | CODE |
| LOW⚡ | tests/test_project_scanner.py | 227 | ("Jane Doe", "jane@work.com", "r"), | CODE |
| LOW⚡ | tests/test_project_scanner.py | 228 | ("Jane Doe", "jane@personal.com", "r"), | CODE |
| LOW⚡ | tests/test_project_scanner.py | 231 | assert people["Jane Doe"].total_commits == 2 | CODE |
| LOW⚡ | tests/test_project_scanner.py | 232 | assert len(people["Jane Doe"].emails) == 2 | CODE |
| LOW⚡ | tests/test_project_scanner.py | 335 | def _init_git_repo(path: Path, name: str = "Jane Doe", email: str = "jane@example.com"): | CODE |
| LOW⚡ | tests/test_project_scanner.py | 504 | assert [person.name for person in people] == ["Jane Doe"] | CODE |
| LOW⚡ | tests/test_project_scanner.py | 525 | people = [PersonInfo(name="Jane Doe", total_commits=5, repos={"r"})] | CODE |
| LOW⚡ | tests/test_project_scanner.py | 532 | assert d["people"][0]["name"] == "Jane Doe" | CODE |
| LOW | tests/test_project_scanner.py | 492 | _init_git_repo(tmp_path, name="Jane Doe", email="jane@example.com") | CODE |
| LOW⚡ | tests/test_knowledge_graph.py | 105 | assert "Acme Corp" in employers | CODE |
| LOW⚡ | tests/test_knowledge_graph.py | 112 | assert "Acme Corp" not in employers | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/test_readme_claims.py | 556 | # Check if either miner references 'hall' in the metadata it writes | COMMENT |
| LOW | tests/test_save_hook_mines.py | 53 | # Check if MEMPAL_DIR defaults to empty | COMMENT |
| LOW | tests/test_antigravity_hooks_shell.py | 646 | # Set interval to 1 so the modulo gate would normally fire on the | COMMENT |
| LOW⚡ | tests/test_miner.py | 2659 | # Set mtime to a known value (2023-07-15 12:00 UTC) | COMMENT |
| LOW | tests/benchmarks/test_search_bench.py | 86 | # Check if needle content appears in top 5 | COMMENT |
| LOW | tests/benchmarks/data_generator.py | 365 | # Write files distributed across room directories | COMMENT |
| LOW | tests/benchmarks/test_palace_boost.py | 173 | # Check if boost increases with scale (the hypothesis) | COMMENT |
| LOW | mempalace/normalize.py | 309 | # Check if this message is tool_results only (no user text) | COMMENT |
| LOW | mempalace/entity_registry.py | 466 | # Check if this is an ambiguous word | COMMENT |
| LOW | benchmarks/convomem_bench.py | 201 | # Check if any retrieved message matches evidence | COMMENT |
| LOW | benchmarks/membench_bench.py | 376 | # Check if any target turn is retrieved. | COMMENT |
| LOW | benchmarks/longmemeval_bench.py | 3216 | # Print results | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | mempalace/onboarding.py | 84 | # Step 1: Mode selection | COMMENT |
| LOW⚡ | mempalace/onboarding.py | 268 | # Step 6: Ambiguity warnings | COMMENT |
| LOW⚡ | mempalace/onboarding.py | 399 | # Step 1: Mode | COMMENT |
| LOW⚡ | mempalace/onboarding.py | 409 | # Step 2: People | COMMENT |
| LOW⚡ | mempalace/onboarding.py | 412 | # Step 3: Projects | COMMENT |
| LOW⚡ | mempalace/onboarding.py | 415 | # Step 4: Wings (stored in config, not registry — just show user) | COMMENT |
| LOW⚡ | mempalace/onboarding.py | 418 | # Step 5: Auto-detect additional people from files | COMMENT |
| LOW | mempalace/onboarding.py | 451 | # Step 6: Warn about ambiguous names | COMMENT |
| LOW⚡ | mempalace/onboarding.py | 141 | # Step 2: People | STRING |
| LOW⚡ | mempalace/onboarding.py | 196 | # Step 3: Projects | STRING |
| LOW⚡ | mempalace/onboarding.py | 222 | # Step 4: Wings | STRING |
| LOW⚡ | mempalace/onboarding.py | 244 | # Step 5: Auto-detect from files | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | mempalace/miner.py | 1844 | CODE | |
| LOW | mempalace/miner.py | 1901 | CODE | |
| LOW | mempalace/searcher.py | 853 | CODE | |
| LOW | mempalace/searcher.py | 1956 | CODE | |
| LOW | mempalace/logstream.py | 206 | CODE | |
| LOW | mempalace/logstream.py | 625 | CODE | |
| LOW | mempalace/logstream.py | 914 | CODE | |
| LOW | mempalace/daemon.py | 1384 | CODE | |
| LOW | mempalace/mcp_server.py | 2451 | CODE | |
| LOW | mempalace/mcp_server.py | 4696 | CODE | |
| LOW | mempalace/mcp_server.py | 4786 | CODE | |
| LOW | mempalace/mcp_server.py | 4829 | CODE | |
| LOW | benchmarks/locomo_bench.py | 621 | CODE | |
| LOW | benchmarks/longmemeval_bench.py | 2936 | CODE | |
| LOW | benchmarks/model_eval/runner.py | 234 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | mempalace/palace_graph.py | 628 | Create an explicit (symmetric) tunnel between two locations in the palace. Tunnels are undirected: ``create_tunnel( | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_mcp_server.py | 5535 | def helper(req): | CODE |
| LOW | tests/test_mcp_proxy.py | 95 | def handle_request(self, request): | CODE |
| LOW | mempalace/mcp_server.py | 6576 | def handle_request(request): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …nchmarks/results_convomem_raw_top10_20260414_1649.json | 1873 | "question": "I just got a Slack message from a colleague that I need to handle later. What's a good way to keep trac | CODE |