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 57,305 GitHub stars. SynthScan v2.0 examined 233,200 lines of code across 419 source files, recording 4763 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 4763 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 | 59 | # ── search_memories (API) ────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_searcher.py | 17 | # ── build_where_filter (unit) ────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_searcher.py | 306 | # ── BM25 internals: None / empty document safety ───────────────────── | COMMENT |
| MEDIUM | tests/test_searcher.py | 344 | # ── search() (CLI print function) ───────────────────────────────────── | 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 | 166 | # ── 3. cmd_mine surfaces MineValidationError as exit-1 + banner ───── | COMMENT |
| MEDIUM⚡ | tests/test_miner_fts5_validation.py | 214 | # ── 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 | 54 | # ── Config: force_reload and invalid JSON ────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_split_mega_files.py | 94 | # ── is_true_session_start ────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_split_mega_files.py | 175 | # ── extract_timestamp ────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_split_mega_files.py | 198 | # ── extract_subject ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_split_mega_files.py | 231 | # ── split_file ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_split_mega_files.py | 126 | # ── find_session_boundaries ──────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_palace_graph_tunnels.py | 502 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_palace_graph_tunnels.py | 504 | # ============================================================================= | COMMENT |
| MEDIUM | tests/test_palace_graph_tunnels.py | 575 | # ============================================================================= | COMMENT |
| MEDIUM | tests/test_palace_graph_tunnels.py | 577 | # ============================================================================= | COMMENT |
| 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 |
| MEDIUM | tests/test_corpus_origin_integration.py | 192 | # ── discover_entities (project_scanner) threads corpus_origin ───────────── | COMMENT |
| MEDIUM | tests/test_corpus_origin_integration.py | 243 | # ── Pass 0 — cmd_init runs corpus_origin and writes origin.json ────────── | COMMENT |
| MEDIUM | tests/test_corpus_origin_integration.py | 416 | # ── llm_refine consumer wiring ──────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_corpus_origin_integration.py | 508 | # ── mempalace mine --redetect-origin flag ─────────────────────────────── | COMMENT |
| MEDIUM | tests/test_corpus_origin_integration.py | 645 | # ── --llm default flip + graceful fallback ─────────────────────────────── | COMMENT |
| MEDIUM | tests/test_corpus_origin_integration.py | 803 | # ── End-to-end pipeline + edge cases ────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_corpus_origin_integration.py | 1315 | # ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_corpus_origin_integration.py | 1331 | # ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_corpus_origin_integration.py | 1392 | # ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_corpus_origin_integration.py | 1410 | # ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_corpus_origin_integration.py | 1833 | # ───────────────────────────────────────────────────────────────────────── | COMMENT |
| 857 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 |
| 2876 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/conftest.py | 74 | except Exception: | CODE |
| LOW | tests/conftest.py | 89 | except Exception: | CODE |
| LOW | tests/conftest.py | 129 | 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 |
| MEDIUM | tests/test_sqlite_exact_backend.py | 585 | def racing_connect(*args, **kwargs): | CODE |
| LOW | tests/test_sqlite_exact_backend.py | 606 | except Exception as exc: | CODE |
| 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 | 856 | except Exception: | CODE |
| LOW⚡ | tests/test_daemon.py | 220 | except Exception: # noqa: BLE001 - best-effort; we force-shutdown below | CODE |
| LOW⚡ | tests/test_daemon.py | 227 | except Exception: # noqa: BLE001 | CODE |
| LOW⚡ | tests/test_daemon.py | 231 | except Exception: # noqa: BLE001 | CODE |
| LOW | tests/test_repair.py | 1975 | except Exception: | CODE |
| MEDIUM | tests/test_pgvector_backend.py | 766 | def racing_connect(dsn): | CODE |
| LOW | tests/test_pgvector_backend.py | 713 | except Exception: | CODE |
| LOW | tests/test_pgvector_backend.py | 784 | except Exception as exc: | CODE |
| LOW | tests/test_migrate.py | 286 | except Exception: | CODE |
| LOW | tests/test_migrate.py | 332 | except Exception: | CODE |
| LOW | tests/test_qdrant_backend.py | 557 | except Exception: | 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 | 74 | except Exception: | CODE |
| LOW⚡ | mempalace/repair.py | 310 | except Exception: | CODE |
| LOW⚡ | mempalace/repair.py | 313 | except Exception as exc: | CODE |
| LOW⚡ | mempalace/repair.py | 316 | except Exception: | CODE |
| LOW | mempalace/repair.py | 95 | except Exception: | CODE |
| LOW | mempalace/repair.py | 107 | except Exception: | CODE |
| LOW | mempalace/repair.py | 117 | except Exception: | CODE |
| LOW | mempalace/repair.py | 146 | except Exception: | CODE |
| LOW | mempalace/repair.py | 173 | except Exception: | CODE |
| LOW | mempalace/repair.py | 186 | except Exception: | CODE |
| LOW | mempalace/repair.py | 195 | except Exception: | CODE |
| LOW | mempalace/repair.py | 366 | except Exception: | CODE |
| LOW | mempalace/repair.py | 374 | except Exception: | CODE |
| LOW | mempalace/repair.py | 431 | except Exception: | CODE |
| LOW | mempalace/repair.py | 436 | except Exception: | CODE |
| LOW | mempalace/repair.py | 569 | except Exception: | CODE |
| LOW | mempalace/repair.py | 705 | except Exception as exc: | CODE |
| LOW | mempalace/repair.py | 776 | except Exception: | CODE |
| LOW | mempalace/repair.py | 899 | except Exception as exc: | CODE |
| LOW | mempalace/repair.py | 979 | except Exception as e: | CODE |
| LOW | mempalace/repair.py | 1042 | except Exception as restore_error: | CODE |
| LOW | mempalace/repair.py | 1143 | except Exception as exc: # noqa: BLE001 — chromadb raises many shapes | CODE |
| LOW | mempalace/repair.py | 1445 | except Exception as exc: # noqa: BLE001 | CODE |
| LOW | mempalace/repair.py | 1586 | except Exception: | CODE |
| LOW | mempalace/repair.py | 1592 | except Exception: | CODE |
| LOW | mempalace/repair.py | 1827 | except Exception: | CODE |
| LOW | mempalace/sync.py | 298 | except Exception as exc: | CODE |
| LOW | mempalace/service.py | 228 | except Exception as exc: | CODE |
| 277 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_mine_lock_lifecycle.py | 1 | CODE | |
| LOW | tests/test_sync.py | 1423 | CODE | |
| LOW | tests/test_hooks_shell.py | 20 | CODE | |
| LOW | tests/test_cursor_plugin_manifest.py | 29 | CODE | |
| LOW | tests/test_format_miner.py | 12 | CODE | |
| LOW | tests/test_format_miner.py | 610 | CODE | |
| LOW | tests/test_hnsw_capacity.py | 9 | CODE | |
| LOW | tests/test_cursor_hooks_install.py | 16 | 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/benchmarks/benchmark_dialect.py | 1 | CODE | |
| LOW | tests/benchmarks/benchmark_dialect.py | 3 | CODE | |
| LOW | mempalace/sync.py | 20 | 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 | 32 | 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/wal.py | 13 | CODE | |
| LOW | mempalace/llm_refine.py | 21 | 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/backends/milvus.py | 11 | CODE | |
| LOW | mempalace/backends/qdrant.py | 9 | CODE | |
| LOW | mempalace/backends/registry.py | 15 | CODE | |
| LOW | mempalace/backends/embedding_wrapper.py | 3 | CODE | |
| LOW | mempalace/backends/__init__.py | 17 | CODE | |
| LOW | mempalace/backends/__init__.py | 17 | CODE | |
| LOW | mempalace/backends/__init__.py | 17 | CODE | |
| LOW | mempalace/backends/__init__.py | 17 | CODE | |
| LOW | mempalace/backends/__init__.py | 17 | CODE | |
| LOW | mempalace/backends/__init__.py | 17 | CODE | |
| LOW | mempalace/backends/__init__.py | 17 | CODE | |
| LOW | mempalace/backends/__init__.py | 17 | CODE | |
| LOW | mempalace/backends/__init__.py | 17 | CODE | |
| LOW | mempalace/backends/__init__.py | 17 | CODE | |
| LOW | mempalace/backends/__init__.py | 17 | CODE | |
| 85 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 | 55 | CODE | |
| LOW | tests/conftest.py | 63 | CODE | |
| LOW | tests/test_hooks_cli.py | 476 | CODE | |
| LOW | tests/test_hooks_cli.py | 898 | CODE | |
| LOW | tests/test_hooks_cli.py | 914 | CODE | |
| LOW | tests/test_hooks_cli.py | 941 | CODE | |
| LOW | tests/test_hooks_cli.py | 976 | CODE | |
| LOW | tests/test_hooks_cli.py | 1025 | CODE | |
| LOW | tests/test_hooks_cli.py | 1063 | CODE | |
| LOW | tests/test_hooks_cli.py | 1074 | CODE | |
| LOW | tests/test_hooks_cli.py | 1229 | CODE | |
| LOW | tests/test_hooks_cli.py | 1279 | CODE | |
| LOW | tests/test_hooks_cli.py | 1304 | CODE | |
| LOW | tests/test_hnsw_capacity.py | 359 | CODE | |
| LOW | tests/test_chroma_collection_lock.py | 80 | CODE | |
| LOW | tests/test_palace_locks.py | 47 | CODE | |
| LOW | tests/test_palace_locks.py | 262 | CODE | |
| LOW | tests/benchmarks/report.py | 34 | CODE | |
| LOW | mempalace/repair.py | 178 | CODE | |
| LOW | mempalace/repair.py | 321 | CODE | |
| LOW | mempalace/repair.py | 400 | CODE | |
| LOW | mempalace/repair.py | 1171 | CODE | |
| LOW | mempalace/repair.py | 1692 | CODE | |
| LOW | mempalace/sync.py | 203 | CODE | |
| LOW | mempalace/service.py | 143 | CODE | |
| LOW | mempalace/convo_scanner.py | 57 | CODE | |
| LOW | mempalace/project_scanner.py | 509 | CODE | |
| LOW | mempalace/miner.py | 599 | CODE | |
| LOW | mempalace/miner.py | 707 | CODE | |
| LOW | mempalace/miner.py | 811 | CODE | |
| LOW | mempalace/miner.py | 1583 | CODE | |
| LOW | mempalace/miner.py | 1756 | CODE | |
| LOW | mempalace/palace_graph.py | 90 | CODE | |
| LOW | mempalace/palace_graph.py | 189 | CODE | |
| LOW | mempalace/palace_graph.py | 640 | CODE | |
| LOW | mempalace/room_detector_local.py | 100 | CODE | |
| LOW | mempalace/room_detector_local.py | 195 | CODE | |
| LOW | mempalace/dialect.py | 806 | CODE | |
| LOW | mempalace/dialect.py | 928 | CODE | |
| LOW | mempalace/knowledge_graph.py | 338 | CODE | |
| LOW | mempalace/knowledge_graph.py | 370 | CODE | |
| LOW | mempalace/knowledge_graph.py | 658 | CODE | |
| LOW | mempalace/onboarding.py | 113 | CODE | |
| LOW | mempalace/onboarding.py | 145 | CODE | |
| LOW | mempalace/onboarding.py | 390 | CODE | |
| LOW | mempalace/searcher.py | 494 | CODE | |
| LOW | mempalace/exporter.py | 68 | CODE | |
| LOW | mempalace/normalize.py | 203 | CODE | |
| LOW | mempalace/normalize.py | 428 | CODE | |
| LOW | mempalace/normalize.py | 559 | CODE | |
| LOW | mempalace/normalize.py | 600 | CODE | |
| LOW | mempalace/normalize.py | 642 | CODE | |
| LOW | mempalace/normalize.py | 697 | CODE | |
| LOW | mempalace/normalize.py | 780 | CODE | |
| LOW | mempalace/llm_refine.py | 109 | CODE | |
| LOW | mempalace/cli.py | 275 | CODE | |
| LOW | mempalace/cli.py | 835 | CODE | |
| LOW | mempalace/cli.py | 1083 | CODE | |
| 89 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 | 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_closets.py | 1721 | # Group B's content must not leak in through the shared source_file | COMMENT |
| LOW | tests/test_corpus_origin_integration.py | 1321 | # must use feature names ("corpus_origin", "corpus-origin detection") | COMMENT |
| LOW | tests/conftest.py | 101 | COMMENT | |
| LOW | tests/test_format_miner.py | 561 | COMMENT | |
| LOW | tests/test_convo_miner.py | 301 | 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 | # JSONL. The schema (per google-gemini/gemini-cli#15292): | COMMENT |
| LOW | tests/test_normalize.py | 1841 | assert "line one" in out | COMMENT |
| LOW | mempalace/repair.py | 1121 | # ``create_collection`` lives inside the try so a Chroma-side | COMMENT |
| LOW | mempalace/repair.py | 1401 | return {} | COMMENT |
| LOW | mempalace/config.py | 21 | COMMENT | |
| LOW | mempalace/config.py | 121 | # safe when datetime values use one canonical shape. Accept full dates for | COMMENT |
| LOW | mempalace/miner.py | 161 | # lives in ``config.DEFAULT_CHUNK_*``. | COMMENT |
| LOW | mempalace/miner.py | 1021 | COMMENT | |
| LOW | mempalace/miner.py | 1041 | # "April 6th 2011", "8 Nov 2024", etc.) | COMMENT |
| LOW | mempalace/miner.py | 1061 | # never set — dateutil only runs in strict mode on a substring we've | COMMENT |
| LOW | mempalace/palace_graph.py | 581 | # Preserve original creation timestamp on label updates. | COMMENT |
| LOW | mempalace/palace_graph.py | 701 | COMMENT | |
| LOW | mempalace/embedding.py | 201 | 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/cli.py | 181 | # is the whole reason to run it, but a weak local model (e.g. Ollama | COMMENT |
| LOW | mempalace/corpus_origin.py | 41 | COMMENT | |
| LOW | mempalace/palace.py | 61 | COMMENT | |
| LOW | mempalace/palace.py | 941 | # `_clients` dict and leave _DEFAULT_BACKEND's live handle in place, | COMMENT |
| LOW | mempalace/palace.py | 961 | # different worker thread. A thread-local guard makes those handlers fail to see | COMMENT |
| LOW | mempalace/palace.py | 1121 | # Ensure the file exists, then open r+ so we can both read the prior | 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 | 381 | # --------------------------------------------------------------------------- | COMMENT |
| LOW | mempalace/hooks_cli.py | 261 | resolved = Path(mempal_dir).expanduser().resolve() | COMMENT |
| LOW | mempalace/hooks_cli.py | 281 | # a directory of per-target slots, claimed via ``O_CREAT | O_EXCL`` so the | COMMENT |
| LOW | mempalace/mcp_server.py | 1121 | # the identity check passes), but the *provider list* is chromadb's | COMMENT |
| LOW | mempalace/mcp_server.py | 3541 | # Oversized entry: split into bounded per-chunk drawers so the | COMMENT |
| LOW | mempalace/entity_detector.py | 41 | COMMENT | |
| LOW | mempalace/entity_detector.py | 81 | # ==================== KNOWN-SYSTEMS COMPOUND LEXICON (Tier 3 linguistics cleanup) ==================== | COMMENT |
| LOW | mempalace/backends/embedding_wrapper.py | 161 | # ``BaseCollection.facet_counts`` is a concrete method that raises | COMMENT |
| LOW | mempalace/backends/pgvector.py | 621 | # Strip both unstorable byte classes Postgres rejects before | COMMENT |
| LOW | mempalace/backends/chroma.py | 161 | COMMENT | |
| LOW | mempalace/backends/chroma.py | 621 | COMMENT | |
| LOW | mempalace/backends/chroma.py | 2061 | # chroma.sqlite3 lazily, so the stat captured before the call | COMMENT |
| LOW | hooks/mempal_save_hook.sh | 1 | #!/bin/bash | COMMENT |
| LOW | hooks/mempal_save_hook.sh | 21 | # "type": "command", | COMMENT |
| LOW | hooks/mempal_save_hook.sh | 41 | # transcript_path — path to the JSONL transcript file | COMMENT |
| LOW | hooks/mempal_save_hook.sh | 61 | # is always mined regardless — this is purely additive. | COMMENT |
| LOW | hooks/mempal_save_hook.sh | 101 | if [ "$AUTO_SAVE" = "false" ]; then | COMMENT |
| LOW | hooks/mempal_save_hook.sh | 121 | # default, and the hook silently produced zero saves (#1440). | COMMENT |
| LOW | hooks/mempal_save_hook.sh | 141 | # where another local user on a shared box could read the traceback, | COMMENT |
| LOW | hooks/mempal_save_hook.sh | 181 | if [ -n "$INPUT" ] && [ "$_MEMPAL_PARSE_MARKER" != "__MEMPAL_PARSE_OK__" ]; then | COMMENT |
| LOW | hooks/mempal_precompact_hook.sh | 1 | #!/bin/bash | COMMENT |
| LOW | hooks/mempal_precompact_hook.sh | 21 | # "hooks": { | COMMENT |
| 42 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 | mempalace/repair.py | 1410 | # harness), renaming the directory fails atomically UP FRONT on | COMMENT |
| LOW | mempalace/room_detector_local.py | 329 | # If still nothing, just use general | 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 | 1283 | # Validate the harness-provided transcript path before touching it | COMMENT |
| MEDIUM | mempalace/backends/base.py | 624 | #: 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 | 203 | - **`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 | tests/test_closets.py | 970 | # the embedding model's hard token limit. This trips the size-cap | COMMENT |
| MEDIUM | tests/test_mcp_server.py | 357 | # palace scaffold on disk before the user runs ``mempalace init``. | COMMENT |
| MEDIUM⚡ | tests/test_miner.py | 2235 | # 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 | 1058 | # would hallucinate dates from any digit-bearing text (Igor's reproductions | COMMENT |
| MEDIUM | mempalace/miner.py | 1072 | # padding from today's date, which is hallucination, not extraction. | COMMENT |
| MEDIUM | mempalace/miner.py | 1261 | # (no fuzzy=True) — without it, dateutil hallucinates dates from any | COMMENT |
| MEDIUM | mempalace/miner.py | 1486 | # Batch chunks into bounded upserts so the embedding model sees many | COMMENT |
| MEDIUM | mempalace/mcp_server.py | 2613 | # embedding model never sees a document above ``chunk_size``. | COMMENT |
| MEDIUM | mempalace/mcp_server.py | 3542 | # embedding model never sees a document above ``chunk_size``. | COMMENT |
| MEDIUM | mempalace/mcp_server.py | 3553 | # 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 |
| 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 | 795 | # Create a collection so status works | COMMENT |
| MEDIUM⚡ | tests/test_mcp_server.py | 825 | # Create the DB file (init does this) but NOT the collection | COMMENT |
| MEDIUM⚡ | tests/test_mcp_server.py | 3462 | # Create a real collection so _get_collection succeeds | COMMENT |
| MEDIUM | tests/test_repair.py | 346 | # Create a valid sqlite file so the repair preflight can run quick_check. | COMMENT |
| MEDIUM | tests/test_miner.py | 2368 | # Create a real file with known mtime. | COMMENT |
| MEDIUM⚡ | tests/test_backends.py | 1862 | # 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 |
|---|---|---|---|---|
| LOW | tests/test_mine_lock_lifecycle.py | 20 | def _set_home(monkeypatch, tmp_path: Path) -> None: | CODE |
| LOW | tests/test_hnsw_capacity.py | 402 | def _set_drawer_created_at(palace: str, timestamps: dict[int, str]) -> None: | CODE |
| LOW | mempalace/sync.py | 28 | logger = logging.getLogger(__name__) | CODE |
| LOW | mempalace/sync.py | 317 | __all__ = [ | CODE |
| LOW | mempalace/config.py | 776 | def set_embedding_model(self, model: str) -> None: | CODE |
| LOW | mempalace/config.py | 796 | def set_backend(self, backend: str) -> None: | CODE |
| LOW⚡ | mempalace/hallways.py | 58 | __all__ = [ | CODE |
| LOW | mempalace/miner.py | 779 | 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 | 39 | 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/format_miner.py | 94 | __all__ = [ | CODE |
| LOW | mempalace/sweeper.py | 50 | 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/backends/milvus.py | 350 | def set_embedder_identity(self, identity) -> None: | CODE |
| LOW | mempalace/backends/milvus.py | 50 | logger = logging.getLogger(__name__) | CODE |
| LOW | mempalace/backends/milvus.py | 1052 | def _set_embedder_identity(self, palace: PalaceRef, collection_name: str, identity) -> None: | CODE |
| LOW | mempalace/backends/milvus.py | 1322 | __all__ = [ | CODE |
| LOW | mempalace/backends/qdrant.py | 48 | logger = logging.getLogger(__name__) | CODE |
| LOW | mempalace/backends/qdrant.py | 715 | def set_embedder_identity(self, identity) -> None: | CODE |
| LOW | mempalace/backends/qdrant.py | 1298 | def _set_embedder_identity(self, palace: PalaceRef, collection_name: str, identity) -> None: | CODE |
| LOW | mempalace/backends/qdrant.py | 1483 | __all__ = ["QdrantBackend", "QdrantCollection"] | CODE |
| LOW | mempalace/backends/registry.py | 24 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | mempalace/backends/embedding_wrapper.py | 66 | def set_embedder_identity(self, identity) -> None: | CODE |
| LOW | mempalace/backends/__init__.py | 55 | __all__ = [ | CODE |
| LOW | mempalace/backends/pgvector.py | 61 | logger = logging.getLogger(__name__) | CODE |
| LOW | mempalace/backends/pgvector.py | 835 | def set_embedder_identity(self, identity) -> None: | CODE |
| LOW | mempalace/backends/pgvector.py | 1435 | 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 | 1895 | def set_embedder_identity(self, identity) -> None: | STRING |
| LOW⚡ | mempalace/backends/base.py | 451 | def set_embedder_identity(self, identity: EmbedderIdentity) -> None: | CODE |
| LOW | mempalace/backends/sqlite_exact.py | 39 | logger = logging.getLogger(__name__) | CODE |
| LOW | mempalace/backends/sqlite_exact.py | 345 | def set_embedder_identity(self, identity) -> None: | CODE |
| LOW | mempalace/backends/sqlite_exact.py | 1094 | __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 |
|---|---|---|---|---|
| HIGH | tests/test_mcp_server.py | 4571 | the alias only fills in when 'entry' is absent or null, not merely falsy. | STRING |
| HIGH⚡ | tests/test_hooks_cli.py | 721 | '{"type":"x","cwd":null}\n' | CODE |
| HIGH⚡ | tests/test_hooks_cli.py | 716 | """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 | mempalace/mcp_server.py | 4805 | # 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 |
|---|---|---|---|---|
| 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 | 173 | (src / "a.md").write_text("placeholder") | CODE |
| LOW⚡ | tests/test_miner_fts5_validation.py | 223 | big = "lorem ipsum " * 500 | CODE |
| LOW | tests/test_miner_fts5_validation.py | 261 | (src / "big.md").write_text("lorem ipsum " * 200) | CODE |
| LOW | tests/test_miner_fts5_validation.py | 311 | (src / "big.md").write_text("lorem ipsum " * 200) | CODE |
| LOW | tests/conftest.py | 276 | 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 | 2211 | # 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 | 231 | # 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 | 3217 | # 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 |
|---|---|---|---|---|
| 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 |
|---|---|---|---|---|
| HIGH | mempalace/palace_graph.py | 498 | Create an explicit (symmetric) tunnel between two locations in the palace. Tunnels are undirected: ``create_tunnel( | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | mempalace/miner.py | 1699 | CODE | |
| LOW | mempalace/miner.py | 1756 | CODE | |
| LOW | mempalace/searcher.py | 1049 | 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 |
|---|---|---|---|---|
| LOW | tests/test_mcp_server.py | 4605 | def helper(req): | CODE |
| LOW | mempalace/mcp_server.py | 4672 | 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 |