mempalace/tests
Igor Lins e Silva 5f58cdbfa8 fix: unblock daemon PR CI + address review comments
CI was red on all three platforms for the daemon-mode draft PR. Root causes
and fixes:

- Linux 3.9 collection error: `_submit_daemon_job`'s `dedupe_key: str | None`
  parameter annotation is evaluated at def time, and hooks_cli.py has no
  `from __future__ import annotations` — `str | None` raises TypeError on 3.9.
  Reverted to `dedupe_key: str = None` (the original, 3.9-safe). The other
  `int | None` in the file is a function-local annotation, which is never
  evaluated, so it was never the problem.

- macOS/Windows daemon lifecycle flakes: the 3 HTTP-lifecycle tests failed at
  the 10s readiness deadline on contended CI runners (localhost bind is
  sub-second locally but took ~5s when it passed on the macOS fleet, >10s when
  it didn't), and because the server thread never shuts down on timeout,
  run_server's `os.environ["MEMPALACE_PALACE_PATH"]` + `os.umask(0o077)`
  mutations leaked into the rest of the suite — poisoning every later test that
  reads MempalaceConfig().palace_path (the 60+ test_mcp_server cascade on macOS;
  the at-exit socket hang → SIGINT on Windows). Bumped the readiness deadline
  to 30s and added a module-scoped snapshot + autouse fixture in test_daemon.py
  that force-restores the env + umask to the pre-suite baseline after every
  daemon test, so a leaked server thread can't poison other test files.

Gemini review comments (fixed in code, no thread replies per convention):

- daemon.py `_connect()` was a bare `sqlite3.connect` whose `with`-block only
  managed the transaction, not the connection — an unbounded FD leak in a
  long-lived daemon running thousands of jobs (also the source of the Windows
  "unclosed database" ResourceWarning noise). Converted to a closing
  @contextlib.contextmanager.
- `QueueStore.finish()` gained `only_if_running`; `_safe_finish` passes it so a
  late worker finish can't overwrite a shutdown-cancelled job back to
  succeeded/failed — removes the reliance on process-exit timing.
- `DaemonClient.request` wraps the final `json.loads` in try/except
  JSONDecodeError → DaemonError, so a non-JSON 2xx response surfaces as a
  structured error instead of a bare JSONDecodeError.
- test_sync.py: removed the module-level `import mempalace.mcp_server` and moved
  the stdout-rebinding side effect into an autouse fixture scoped to
  TestServiceRunSyncReport, so the embedder/Chroma import chain is no longer
  forced at collection time for the existing sync tests.

Coverage: added focused happy-path tests for service.run_sync early-returns,
run_mine backend application + invalid mode, execute_job kind dispatch,
run_diary_write arg forwarding, run_mcp_tool write-tool dispatch, and
print_job_result — lifts service.py from 57% to 85% so the new files
(service 85%, daemon 80%) don't drag the total below the 80% CI gate now that
the daemon tests complete and the gate is actually evaluated.
2026-06-19 08:33:37 -03:00
..
benchmarks test(mcp): migrate _kg monkeypatches to _get_kg (#1136) 2026-05-03 17:43:00 +05:00
_backend_conformance.py feat: add pgvector backend + namespace-isolation conformance contract 2026-06-05 21:41:21 -03:00
conftest.py feat: add pluggable vector backends 2026-06-02 21:38:53 -03:00
test_antigravity_hooks_install.py feat: add Antigravity IDE support (plugin, MCP, skill, hooks, docs, tests) 2026-05-27 19:19:17 +10:00
test_antigravity_hooks_shell.py fix(antigravity): resolve interpreter from console-script shebang 2026-05-31 10:41:09 +10:00
test_antigravity_plugin_manifest.py feat(antigravity): add recall skill, optional rule, shared protocol 2026-06-11 13:09:40 +10:00
test_backend_conformance.py feat: add pgvector backend + namespace-isolation conformance contract 2026-06-05 21:41:21 -03:00
test_backends.py fix: close blob seq sqlite migration connection 2026-06-14 13:12:00 -03:00
test_backups.py fix(backups): add max_backups retention to bound backup disk usage 2026-06-05 14:52:06 -04:00
test_chroma_collection_lock.py style: reformat tree with ruff 0.15.9 2026-05-17 23:20:01 -03:00
test_claude_plugin_hook_config.py style: reformat tree with ruff 0.15.9 2026-05-17 23:20:01 -03:00
test_claude_plugin_hook_wrappers.py test: normalize wrapper script path for bash on Windows 2026-04-19 10:34:11 +02:00
test_clean_lone_surrogates.py fix(backends): keep single-string documents whole in surrogate sanitiser 2026-06-01 17:19:10 -05:00
test_cli.py feat: add opt-in local daemon for queued MemPalace writes 2026-06-18 23:46:11 -03:00
test_closet_llm.py style: ruff format tests/test_hooks_cli.py with CI-pinned ruff 0.4.x 2026-05-23 12:05:34 -04:00
test_closets.py test: stabilize closet boost fixture on Windows 2026-06-14 15:17:01 -03:00
test_collection_metric_invariant.py fix(test): use tmp_path for full-stack invariant test (Windows CI) 2026-04-25 00:39:37 -03:00
test_collision_scan.py fix(ids): delimit hash inputs to prevent drawer_id collisions (#80) 2026-05-30 12:44:47 -07:00
test_config.py feat: add opt-in local daemon for queued MemPalace writes 2026-06-18 23:46:11 -03:00
test_config_extra.py test(config): make palace_path tests portable across POSIX and Windows 2026-04-24 11:13:51 +02:00
test_convo_miner.py fix(miner): count only new work toward --limit, not already-mined skips (#1535) 2026-06-06 17:56:08 +05:00
test_convo_miner_size_cap.py Raise convo_miner MAX_FILE_SIZE cap 10 MB → 500 MB 2026-04-18 12:52:01 -03:00
test_convo_miner_unit.py Merge pull request #1137 from arnoldwender/fix/convo-miner-preserve-response-structure 2026-06-06 00:16:33 -03:00
test_convo_scanner.py fix(llm): tighter refinement — word boundaries, JSON extraction, authoritative sources 2026-04-24 01:30:40 -03:00
test_corpus_origin.py style: reformat tree with ruff 0.15.9 2026-05-17 23:20:01 -03:00
test_corpus_origin_integration.py style: reformat tree with ruff 0.15.9 2026-05-17 23:20:01 -03:00
test_cursor_hooks_install.py fix(cursor): address gemini-code-assist review on PR #1632 2026-05-27 14:17:36 +10:00
test_cursor_hooks_shell.py fix(cursor): address igorls review on PR #1632 2026-05-30 11:13:51 +10:00
test_cursor_plugin_manifest.py feat: add mempalace-recall skill and optional Cursor recall rule 2026-06-10 15:40:35 +10:00
test_daemon.py fix: unblock daemon PR CI + address review comments 2026-06-19 08:33:37 -03:00
test_dedup.py feat: add pluggable vector backends 2026-06-02 21:38:53 -03:00
test_dialect.py fix: align cmd_compress dict keys with compression_stats() return values (#569) 2026-04-11 16:16:31 -07:00
test_distance_metric.py feat(searcher): metric-aware distance→similarity conversion (RFC 001 §10, #1726) 2026-06-08 02:48:26 -03:00
test_dynamics.py Merge origin/develop into feat/benchmark-multilingual 2026-05-24 13:18:08 -03:00
test_embedder_identity.py feat(backends): shared embedder-identity sidecar + qdrant identity (RFC 001, #1730) 2026-06-08 10:20:45 -03:00
test_embedding.py test: isolate embedding module state with monkeypatch 2026-04-24 23:11:29 +00:00
test_embedding_wrapper.py fix(backends): normalize all OneOrMany inputs in EmbeddingCollection 2026-06-06 04:56:19 -03:00
test_embeddinggemma.py fix(embedding): lock EF cache and lazy load, guard inputs (#1770) 2026-06-11 23:01:48 +05:00
test_empty_chromadb_results.py fix(searcher): guard against empty ChromaDB query results (#195) (#865) 2026-04-15 00:26:38 -07:00
test_entity_detector.py feat(entity): known-systems lexicon keeps multi-word product names atomic 2026-05-24 13:50:53 -07:00
test_entity_registry.py fix(entity_registry): clean up .tmp sidecar on write or rename failure (#1373) 2026-05-10 12:56:50 +02:00
test_exporter.py fix(exporter): refuse symlinks at file targets and skip tests on Windows 2026-05-07 12:51:47 -03:00
test_fact_checker.py fix(cli, fact-checker): per-stream stdio errors policy on Windows 2026-05-03 21:37:12 +05:00
test_format_miner.py fix(miner): count only new work toward --limit, not already-mined skips (#1535) 2026-06-06 17:56:08 +05:00
test_general_extractor.py Merge origin/develop into feat/benchmark-multilingual 2026-05-24 13:18:08 -03:00
test_hall_detection.py fix: README audit — 42 TDD tests + hall detection + 7 claim fixes (#835) 2026-04-13 17:11:11 -07:00
test_hallways.py fixup(hallways): drop _HALLWAY_FILE back-compat shim, migrate existing tests to resolver 2026-06-11 19:11:52 +00:00
test_hallways_pagination.py fixup(hallways): drop _HALLWAY_FILE back-compat shim, migrate existing tests to resolver 2026-06-11 19:11:52 +00:00
test_hallways_palace_scoped.py fixup(hallways): address gemini-code-assist review on PR #1780 2026-06-11 19:18:54 +00:00
test_hnsw_capacity.py fix: use configured collection in recovery paths 2026-05-07 09:10:00 -03:00
test_hnsw_payload_health.py style: ruff format test_hnsw_payload_health.py (#1461 follow-up) 2026-05-14 19:17:26 -03:00
test_hook_shell.py fix(hooks): typo regression addressed 2026-06-13 06:37:26 +00:00
test_hooks_bash_compat.py style: reformat tree with ruff 0.15.9 2026-05-17 23:20:01 -03:00
test_hooks_cli.py feat: add opt-in local daemon for queued MemPalace writes 2026-06-18 23:46:11 -03:00
test_hooks_shell.py style: reformat tree with ruff 0.15.9 2026-05-17 23:20:01 -03:00
test_hybrid_candidate_union.py style: reformat tree with ruff 0.15.9 2026-05-17 23:20:01 -03:00
test_hybrid_search.py test: stabilize release validation on develop 2026-06-14 12:25:53 -03:00
test_i18n.py style: reformat tree with ruff 0.15.9 2026-05-17 23:20:01 -03:00
test_i18n_lang_case.py style: reformat tree with ruff 0.15.9 2026-05-17 23:20:01 -03:00
test_ids.py fix(ids): simplify v3 length-prefixed hashing 2026-06-12 07:39:57 +00:00
test_init.py style: reformat tree with ruff 0.15.9 2026-05-17 23:20:01 -03:00
test_init_gitignore_protection.py fix(init): auto-add per-project files to .gitignore in git repos (#185) (#866) 2026-04-15 00:26:41 -07:00
test_instructions_cli.py fix: add explicit UTF-8 encoding to read_text() calls (#776) 2026-04-16 16:00:29 +05:00
test_kg_thread_safety.py fix: add missing self._lock to KnowledgeGraph.close() 2026-04-14 13:09:10 -07:00
test_knowledge_graph.py fix(kg): close sqlite connections during cleanup 2026-05-08 14:44:04 +00:00
test_knowledge_graph_extra.py test: bring coverage to 85%, set threshold to 85, reset version to 3.0.11 2026-04-08 21:38:12 +03:00
test_known_entities_registry.py feat(graph): cross-wing tunnels by shared topics (#1180) 2026-04-24 23:06:26 -03:00
test_layers.py fix: guard None metadata/doc in tool_check_duplicate and Layer1/Layer2 2026-04-19 11:13:50 +03:00
test_legacy_shell_hooks.py fix(hooks): normalize Windows transcript paths in shell hooks 2026-06-12 15:25:36 +00:00
test_line_numbers.py Merge origin/develop into feat/benchmark-multilingual 2026-05-24 13:18:08 -03:00
test_llm_client.py style: reformat tree with ruff 0.15.9 2026-05-17 23:20:01 -03:00
test_llm_refine.py feat(graph): cross-wing tunnels by shared topics (#1180) 2026-04-24 23:06:26 -03:00
test_maintenance_hooks.py feat(backends): observable maintenance hooks + pgvector indexed-build path (RFC 001, #1725) 2026-06-08 08:44:20 -03:00
test_mcp_mine.py feat(mcp): add mempalace_mine tool (#1662) 2026-06-06 17:54:38 +05:00
test_mcp_server.py Merge pull request #1624 from trek-e/fix/search-retry-preserve-collection 2026-06-14 15:03:38 -03:00
test_mcp_stdio_protection.py style: reformat tree with ruff 0.15.9 2026-05-17 23:20:01 -03:00
test_migrate.py test(migrate): cover swap-failure rollback 2026-06-15 10:40:24 -03:00
test_migrate_wings.py feat(migrate): mempalace migrate-wings — normalize legacy wing names 2026-06-06 03:11:46 -03:00
test_mine_lock_lifecycle.py fix: address mine lock review feedback 2026-06-14 14:58:20 -03:00
test_miner.py Merge pull request #1368 from EVSalomon/feat/add-support-swift-kotlin 2026-06-18 12:37:40 -03:00
test_miner_fts5_validation.py test: stabilize release validation on develop 2026-06-14 12:25:53 -03:00
test_miner_jsonl_visibility.py Harden sweeper for production: verbatim tool blocks, full session_id, logged failures 2026-04-18 13:14:32 -03:00
test_normalize.py Merge remote-tracking branch 'origin/develop' into HEAD 2026-06-18 13:19:48 -03:00
test_onboarding.py feat(onboarding): multilingual embedder by default for new installs 2026-05-14 06:40:27 -03:00
test_palace.py feat: add pgvector backend + namespace-isolation conformance contract 2026-06-05 21:41:21 -03:00
test_palace_graph.py fix(palace_graph): skip None metadata in build_graph 2026-04-25 11:06:32 -07:00
test_palace_graph_tunnels.py Merge origin/develop into feat/benchmark-multilingual 2026-05-24 13:18:08 -03:00
test_palace_locks.py style: reformat tree with ruff 0.15.9 2026-05-17 23:20:01 -03:00
test_pgvector_backend.py fix(backends): serialize first connect in sqlite_exact and pgvector (#1774, #1775) 2026-06-12 21:55:36 +05:00
test_project_scanner.py fix: handle rootless Java subprojects 2026-06-07 16:01:57 +08:00
test_qdrant_backend.py feat: add pgvector backend + namespace-isolation conformance contract 2026-06-05 21:41:21 -03:00
test_query_sanitizer.py fix: make quote trimming explicit 2026-04-12 22:19:58 -03:00
test_readme_claims.py style: ruff format tests/test_hooks_cli.py with CI-pinned ruff 0.4.x 2026-05-23 12:05:34 -04:00
test_repair.py fix(backups): add max_backups retention to bound backup disk usage 2026-06-05 14:52:06 -04:00
test_room_detector_local.py fix: skip unreachable reparse points in detect_rooms_from_folders (#558) 2026-04-11 16:16:06 -07:00
test_save_hook_mines.py style: reformat tree with ruff 0.15.9 2026-05-17 23:20:01 -03:00
test_save_hook_verbose.py feat: add MEMPAL_VERBOSE toggle — developers see diaries in chat (#871) 2026-04-14 10:55:56 -07:00
test_searcher.py feat(searcher): metric-aware distance→similarity conversion (RFC 001 §10, #1726) 2026-06-08 02:48:26 -03:00
test_sources.py chore(tests): wrap sqlite3 connections in contextlib.closing 2026-05-09 20:25:47 -03:00
test_spellcheck.py style: format test files with ruff 2026-04-08 21:08:49 +03:00
test_spellcheck_extra.py test: bring coverage to 85%, set threshold to 85, reset version to 3.0.11 2026-04-08 21:38:12 +03:00
test_split_mega_files.py test: expand coverage to 70%, fix mcp_server CI crash (threshold 60%) 2026-04-08 21:07:03 +03:00
test_sqlite_exact_backend.py fix(backends): serialize first connect in sqlite_exact and pgvector (#1774, #1775) 2026-06-12 21:55:36 +05:00
test_sweeper.py style: reformat tree with ruff 0.15.9 2026-05-17 23:20:01 -03:00
test_sync.py fix: unblock daemon PR CI + address review comments 2026-06-19 08:33:37 -03:00
test_version_consistency.py fix: unify package and MCP version reporting 2026-04-07 08:53:25 +01:00