mempalace-code 1.10.1__tar.gz → 1.10.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (216) hide show
  1. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/CHANGELOG.md +43 -0
  2. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/PKG-INFO +49 -13
  3. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/README.md +48 -12
  4. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/docs/AGENT_INSTALL.md +5 -5
  5. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/docs/BACKLOG-archived.yaml +35 -0
  6. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/docs/BACKLOG.yaml +11 -1
  7. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/docs/BACKUP_RESTORE.md +155 -5
  8. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/docs/COMPARISON_GRAPHIFY.md +5 -5
  9. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/docs/HOW_SEARCH_WORKS.md +1 -1
  10. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/docs/OFFLINE_USAGE.md +16 -11
  11. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/docs/UPSTREAM_HARDENING.md +3 -3
  12. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/backup.py +10 -7
  13. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/cli.py +53 -5
  14. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/cli_commands/backup_restore.py +12 -1
  15. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/cli_commands/ingest.py +3 -3
  16. mempalace_code-1.10.2/mempalace_code/cli_commands/model.py +108 -0
  17. mempalace_code-1.10.2/mempalace_code/cli_commands/preflight.py +53 -0
  18. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/config.py +6 -2
  19. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/mining/orchestrator.py +1 -1
  20. mempalace_code-1.10.2/mempalace_code/mirror_preflight.py +342 -0
  21. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/spellcheck.py +2 -1
  22. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/storage.py +162 -10
  23. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/watcher.py +245 -34
  24. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/pyproject.toml +1 -1
  25. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_backup.py +113 -1
  26. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_backup_cli.py +163 -0
  27. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_cli.py +340 -0
  28. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_cli_command_modules.py +83 -0
  29. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_miner.py +56 -0
  30. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_storage.py +324 -8
  31. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_watcher.py +451 -0
  32. mempalace_code-1.10.1/mempalace_code/cli_commands/model.py +0 -53
  33. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/.claude/prompts/codex-hardening-review.md +0 -0
  34. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/.claude/prompts/codex-plan-review.md +0 -0
  35. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/.claude/settings.json +0 -0
  36. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/.claude/skills/_shared/commit-checkpoint.md +0 -0
  37. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/.claude/skills/_shared/mode-classification.md +0 -0
  38. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/.claude/skills/_shared/task-state.md +0 -0
  39. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/.claude/skills/bench/SKILL.md +0 -0
  40. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/.claude/skills/doc-refresh/INSTRUCTIONS.md +0 -0
  41. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/.claude/skills/doc-refresh/SKILL.md +0 -0
  42. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/.claude/skills/entropy-gc/INSTRUCTIONS.md +0 -0
  43. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/.claude/skills/entropy-gc/SKILL.md +0 -0
  44. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/.claude/skills/mine/SKILL.md +0 -0
  45. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/.claude/skills/palace-health/SKILL.md +0 -0
  46. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/.claude/skills/release/SKILL.md +0 -0
  47. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/.claude/skills/release-prep/SKILL.md +0 -0
  48. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/.claude/skills/ship/INSTRUCTIONS.md +0 -0
  49. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/.claude/skills/ship/SKILL.md +0 -0
  50. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/.claude/skills/start/INSTRUCTIONS.md +0 -0
  51. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/.claude/skills/start/SKILL.md +0 -0
  52. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/.claude/skills/status/SKILL.md +0 -0
  53. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/.claude/skills/task-hardening/INSTRUCTIONS.md +0 -0
  54. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/.claude/skills/task-hardening/SKILL.md +0 -0
  55. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/.claude/skills/task-plan/INSTRUCTIONS.md +0 -0
  56. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/.claude/skills/task-plan/SKILL.md +0 -0
  57. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/.claude/skills/verify/INSTRUCTIONS.md +0 -0
  58. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/.claude/skills/verify/SKILL.md +0 -0
  59. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  60. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  61. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  62. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/.github/workflows/ci.yml +0 -0
  63. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/.github/workflows/dotnet-bench.yml +0 -0
  64. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/.github/workflows/publish.yml +0 -0
  65. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/.gitignore +0 -0
  66. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/.pre-commit-config.yaml +0 -0
  67. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/.verify-state +0 -0
  68. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/AGENTS.md +0 -0
  69. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/CLAUDE.md +0 -0
  70. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/CONTRIBUTING.md +0 -0
  71. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/LICENSE +0 -0
  72. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/NOTICE +0 -0
  73. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/assets/mempalace_banner.jpg +0 -0
  74. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/benchmarks/BENCHMARKS.md +0 -0
  75. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/benchmarks/HYBRID_MODE.md +0 -0
  76. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/benchmarks/README.md +0 -0
  77. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/benchmarks/code_retrieval_bench.py +0 -0
  78. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/benchmarks/convomem_bench.py +0 -0
  79. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/benchmarks/data/code_retrieval_queries.json +0 -0
  80. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/benchmarks/dotnet_bench.py +0 -0
  81. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/benchmarks/embed_ab_bench.py +0 -0
  82. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/benchmarks/locomo_bench.py +0 -0
  83. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/benchmarks/longmemeval_bench.py +0 -0
  84. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/benchmarks/membench_bench.py +0 -0
  85. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/benchmarks/results_embed_ab_2026-04-09.json +0 -0
  86. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/benchmarks/results_token_delta_mempalace.json +0 -0
  87. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/benchmarks/results_token_delta_wh40k.json +0 -0
  88. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/benchmarks/token_delta_bench.py +0 -0
  89. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/docs/BENCH_TOKEN_DELTA.md +0 -0
  90. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/docs/LLM_USAGE_RULES.md +0 -0
  91. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/docs/WHY_THIS_FORK.md +0 -0
  92. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/docs/refactoring/REFAC-MINER-MODULES/progress.md +0 -0
  93. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/examples/HOOKS_TUTORIAL.md +0 -0
  94. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/examples/basic_mining.py +0 -0
  95. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/examples/convo_import.py +0 -0
  96. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/examples/gemini_cli_setup.md +0 -0
  97. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/examples/mcp_setup.md +0 -0
  98. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/hooks/README.md +0 -0
  99. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/hooks/mempal_precompact_hook.sh +0 -0
  100. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/hooks/mempal_save_hook.sh +0 -0
  101. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace/__init__.py +0 -0
  102. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace/mcp_server.py +0 -0
  103. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/README.md +0 -0
  104. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/__init__.py +0 -0
  105. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/__main__.py +0 -0
  106. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/_chroma_store.py +0 -0
  107. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/_stdio.py +0 -0
  108. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/architecture.py +0 -0
  109. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/cli_commands/__init__.py +0 -0
  110. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/cli_commands/alias.py +0 -0
  111. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/cli_commands/common.py +0 -0
  112. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/cli_commands/diary.py +0 -0
  113. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/cli_commands/export_import.py +0 -0
  114. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/cli_commands/maintenance.py +0 -0
  115. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/cli_commands/query.py +0 -0
  116. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/cli_commands/version_check.py +0 -0
  117. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/cli_commands/watch.py +0 -0
  118. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/convo_miner.py +0 -0
  119. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/dialect.py +0 -0
  120. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/disk_budget.py +0 -0
  121. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/entity_detector.py +0 -0
  122. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/entity_registry.py +0 -0
  123. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/export.py +0 -0
  124. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/general_extractor.py +0 -0
  125. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/knowledge_graph.py +0 -0
  126. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/language_catalog.py +0 -0
  127. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/layers.py +0 -0
  128. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/mcp/__init__.py +0 -0
  129. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/mcp/dispatch.py +0 -0
  130. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/mcp/protocol_text.py +0 -0
  131. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/mcp/registry.py +0 -0
  132. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/mcp/runtime.py +0 -0
  133. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/mcp/tools/__init__.py +0 -0
  134. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/mcp/tools/architecture.py +0 -0
  135. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/mcp/tools/diary.py +0 -0
  136. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/mcp/tools/graph.py +0 -0
  137. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/mcp/tools/kg.py +0 -0
  138. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/mcp/tools/read.py +0 -0
  139. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/mcp/tools/search.py +0 -0
  140. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/mcp/tools/write.py +0 -0
  141. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/mcp_server.py +0 -0
  142. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/mcp_tool_profiles.py +0 -0
  143. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/migrate.py +0 -0
  144. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/miner.py +0 -0
  145. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/mining/__init__.py +0 -0
  146. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/mining/batching.py +0 -0
  147. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/mining/chunkers.py +0 -0
  148. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/mining/kg_extract.py +0 -0
  149. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/mining/languages.py +0 -0
  150. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/mining/projects.py +0 -0
  151. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/mining/scanner.py +0 -0
  152. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/mining/symbols.py +0 -0
  153. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/normalize.py +0 -0
  154. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/onboarding.py +0 -0
  155. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/palace_graph.py +0 -0
  156. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/py.typed +0 -0
  157. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/reader.py +0 -0
  158. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/retrieval_rerank.py +0 -0
  159. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/room_detector_local.py +0 -0
  160. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/search_reranker.py +0 -0
  161. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/searcher.py +0 -0
  162. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/split_mega_files.py +0 -0
  163. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/treesitter.py +0 -0
  164. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/version.py +0 -0
  165. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/mempalace_code/version_check.py +0 -0
  166. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/scripts/bootstrap.sh +0 -0
  167. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/scripts/codex-review.sh +0 -0
  168. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/scripts/migrate_storage_smoke.py +0 -0
  169. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/scripts/nuke_wing.py +0 -0
  170. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/conftest.py +0 -0
  171. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/fixtures/unreasoned_suppression.py +0 -0
  172. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_architecture_extraction.py +0 -0
  173. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_chroma_compat.py +0 -0
  174. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_chroma_import_errors.py +0 -0
  175. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_chunking.py +0 -0
  176. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_code_retrieval_bench.py +0 -0
  177. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_config.py +0 -0
  178. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_convo_miner.py +0 -0
  179. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_dialect.py +0 -0
  180. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_disk_budget.py +0 -0
  181. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_dotnet_bench.py +0 -0
  182. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_dotnet_config.py +0 -0
  183. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_e2e.py +0 -0
  184. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_embed_ab_bench.py +0 -0
  185. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_entity_detector.py +0 -0
  186. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_entity_registry.py +0 -0
  187. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_export.py +0 -0
  188. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_general_extractor.py +0 -0
  189. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_kg_extract.py +0 -0
  190. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_knowledge_graph.py +0 -0
  191. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_lang_detect.py +0 -0
  192. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_language_catalog.py +0 -0
  193. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_layers.py +0 -0
  194. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_mcp_registry.py +0 -0
  195. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_mcp_server.py +0 -0
  196. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_mcp_tool_profiles.py +0 -0
  197. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_migrate.py +0 -0
  198. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_migrate_storage_smoke.py +0 -0
  199. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_miner_modules.py +0 -0
  200. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_normalize.py +0 -0
  201. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_offline.py +0 -0
  202. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_packaging_namespace.py +0 -0
  203. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_palace_graph.py +0 -0
  204. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_reader.py +0 -0
  205. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_retrieval_rerank.py +0 -0
  206. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_search_reranker.py +0 -0
  207. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_searcher.py +0 -0
  208. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_split_mega_files.py +0 -0
  209. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_stdio.py +0 -0
  210. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_storage_lance.py +0 -0
  211. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_symbol_extract.py +0 -0
  212. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_treesitter.py +0 -0
  213. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_type_suppressions.py +0 -0
  214. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_version_check.py +0 -0
  215. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/tests/test_version_consistency.py +0 -0
  216. {mempalace_code-1.10.1 → mempalace_code-1.10.2}/uv.lock +0 -0
@@ -1,5 +1,48 @@
1
1
  # Changelog
2
2
 
3
+ ## Unreleased
4
+
5
+ No changes yet.
6
+
7
+ ## v1.10.2 — 2026-06-04
8
+
9
+ Patch release for the local-first embedding path.
10
+
11
+ ### Fixed
12
+
13
+ - `restore` now scopes KG writes to the `--palace` path instead of the global
14
+ default.
15
+ - `watch` now mines and watches an initialized root directory directly, and
16
+ emits a clear diagnostic when no projects are found.
17
+ - Cached `search`, `mine`, and MCP search paths now load the sentence-transformers
18
+ model with local-only resolution first, avoiding Hugging Face metadata requests
19
+ after the setup download has already populated the cache.
20
+ - Re-running `mempalace-code fetch-model` on an already cached model now verifies
21
+ the local cache instead of performing an online-capable Hub lookup.
22
+ - Suppressed third-party Hugging Face token warnings and weight-loading progress
23
+ during cached model resolution; MemPalace keeps only its own concise status
24
+ output.
25
+ - LanceDB optimize and cleanup now re-open the table and verify a fresh handle
26
+ after maintenance. This catches missing-fragment failures that only appear for
27
+ the next process instead of trusting a stale in-memory table handle.
28
+ - LanceDB upserts now retry once with a freshly opened table when Lance reports
29
+ a missing fragment from a stale handle during merge-insert.
30
+
31
+ ### Added
32
+
33
+ - `preflight mirror` CLI command and docs warning that delete-mode rsync against
34
+ palace state can silently remove remote-owned data.
35
+ - Regression tests for cached local model resolution, explicit offline mode,
36
+ local filesystem model paths, idempotent `fetch-model`, and forced re-download.
37
+ - Backlog item `STORE-HF-CACHED-SEARCH-SUBPROCESS-GUARD` for a future
38
+ socket-blocked subprocess guard covering CLI stdout/stderr and network calls.
39
+
40
+ ### Verified
41
+
42
+ - Real CLI smokes for cached `fetch-model`, normal search, explicit-offline
43
+ search, and palace health.
44
+ - Focused storage and CLI command suites plus the network-marked offline gate.
45
+
3
46
  ## v1.10.1 — 2026-05-24
4
47
 
5
48
  Patch release after the v1.10.0 publish. Focus: real CLI/MCP smoke fixes,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mempalace-code
3
- Version: 1.10.1
3
+ Version: 1.10.2
4
4
  Summary: Developer memory tool — mine codebases and conversations into a LanceDB-backed searchable palace. No API key required.
5
5
  Project-URL: Homepage, https://github.com/rergards/mempalace-code
6
6
  Project-URL: Repository, https://github.com/rergards/mempalace-code
@@ -112,7 +112,7 @@ Then ask your AI to read [`docs/AGENT_INSTALL.md`](docs/AGENT_INSTALL.md) — it
112
112
  <summary>Or do it manually</summary>
113
113
 
114
114
  ```bash
115
- mempalace-code init ~/projects/myapp # detect rooms, download embedding model (~80 MB)
115
+ mempalace-code init ~/projects/myapp # detect rooms, cache embedding model (~80 MB)
116
116
  mempalace-code init ~/projects/myapp --detect-entities # optional people/project detection for notes/convos
117
117
  mempalace-code mine ~/projects/myapp # index your codebase
118
118
  claude mcp add mempalace-code -- python -m mempalace_code.mcp_server # connect Claude Code
@@ -305,11 +305,14 @@ uv tool inject mempalace-code watchfiles # or: pipx inject mempalace-code watch
305
305
  ```
306
306
 
307
307
  ```bash
308
- mempalace-code watch ~/projects/ # watch all projects (on commit, default)
308
+ mempalace-code watch ~/projects/my-app # watch an initialized project (on commit)
309
+ mempalace-code watch ~/projects/ # watch all initialized projects in a parent directory
309
310
  mempalace-code watch ~/projects/ --on-save # watch all file saves instead (noisier)
310
311
  mempalace-code watch ~/projects/ schedule # print launchd/cron snippet for daemon
311
312
  ```
312
313
 
314
+ `watch` accepts either an **initialized project directory** (has `mempalace.yaml`) or a **parent directory** containing immediate initialized project subdirectories. Pointing it at a project root that has project files but no `mempalace.yaml` exits with the correct `mempalace-code init <dir>` command.
315
+
313
316
  **Install as persistent daemon (macOS):**
314
317
 
315
318
  ```bash
@@ -632,6 +635,8 @@ Or in `~/.mempalace/config.json`: `{"backup_retain_count": 5}`. Retention only a
632
635
  After a successful optimize and readability check, MemPalace also runs
633
636
  best-effort verified Lance cleanup (`cleanup_stale_fragments` with
634
637
  `unsafe_now=false`) so future backups do not keep archiving stale table versions.
638
+ Optimize and cleanup verification re-opens the Lance table, so it checks the
639
+ same fresh-handle path the next CLI, MCP server, or watcher process will use.
635
640
  Use the manual `cleanup` command for older installations that already
636
641
  accumulated stale versions or for emergency recovery.
637
642
 
@@ -676,6 +681,36 @@ Skips compaction entirely. Storage will grow with more fragments but avoids any
676
681
 
677
682
  Also available: `mempalace-code export --only-manual` for JSONL export of manually-stored drawers.
678
683
 
684
+ **Remote mirror risk — backups vs file mirroring:**
685
+
686
+ Managed backups and Lance cleanup protect **local** palace state. They do not protect against
687
+ delete-mode rsync between independent hosts. `rsync --delete` syncing a whole MemPalace state
688
+ directory removes remote-owned drawers, diary entries, and KG triples that were never synced
689
+ back to the source — even when local backups are healthy.
690
+
691
+ Use these recommended excludes for any delete-mode state-directory mirror:
692
+
693
+ ```bash
694
+ rsync -a --delete \
695
+ --exclude=palace/ \
696
+ --exclude=knowledge_graph.sqlite3 \
697
+ --exclude=config.json \
698
+ --exclude=backups/ \
699
+ ~/.mempalace/ user@host:.mempalace/
700
+ ```
701
+
702
+ Run a preflight check before installing a mirror job (the command is never executed):
703
+
704
+ ```bash
705
+ mempalace-code preflight mirror --command \
706
+ "rsync -a --delete --exclude=palace/ --exclude=knowledge_graph.sqlite3 \
707
+ --exclude=config.json --exclude=backups/ ~/.mempalace/ user@host:.mempalace/"
708
+ # OK
709
+ ```
710
+
711
+ See [docs/BACKUP_RESTORE.md](docs/BACKUP_RESTORE.md) for the full mirror-risk guidance and
712
+ the safer export/import alternative for cross-host transfer of non-regenerable content.
713
+
679
714
  ---
680
715
 
681
716
  ### Scan Excludes
@@ -730,7 +765,7 @@ exclusion rule.
730
765
  mempalace-code health # probe palace for fragment corruption
731
766
  mempalace-code health --json # machine-readable report
732
767
  mempalace-code cleanup --older-than-days 7 # reclaim stale Lance versions
733
- mempalace-code cleanup --unsafe-now # emergency cleanup; only with no writers active
768
+ mempalace-code cleanup --unsafe-now # emergency only; stop MemPalace processes first
734
769
 
735
770
  mempalace-code repair --dry-run # show what would be recovered
736
771
  mempalace-code repair --rollback # roll back to last working version
@@ -749,9 +784,9 @@ mempalace-code repair --rollback # roll back to last working version
749
784
  Use `--dry-run` first to see how many rows would be lost.
750
785
 
751
786
  Normal optimize runs already prune verified stale Lance versions after a
752
- successful compaction. Manual `cleanup` is still useful after older installs,
753
- large historical accumulations, or emergency disk recovery when no writer is
754
- active.
787
+ successful compaction and fresh-handle verification. Manual `cleanup` is still
788
+ useful after older installs, large historical accumulations, or emergency disk
789
+ recovery after stopping watchers, miners, maintenance commands, and MCP servers.
755
790
 
756
791
  ---
757
792
 
@@ -800,7 +835,7 @@ This is a code-first fork of [milla-jovovich/mempalace](https://github.com/milla
800
835
  | Upstream | This fork |
801
836
  |---|---|
802
837
  | ChromaDB — [silently deletes data on version bump](https://github.com/milla-jovovich/mempalace/issues/469) | LanceDB — crash-safe Arrow storage, no version-cliff |
803
- | "No internet after install" — [false](https://github.com/milla-jovovich/mempalace/issues/524) | `mempalace-code init` downloads model explicitly; offline after model setup |
838
+ | "No internet after install" — [false](https://github.com/milla-jovovich/mempalace/issues/524) | `mempalace-code init` downloads the model explicitly once; cached mining/search use local-only model resolution first |
804
839
  | "100% R@5" — [unverifiable](https://github.com/milla-jovovich/mempalace/issues/27) | Number removed. Methodology caveats documented |
805
840
  | ~30% test coverage | 2200+ tests, every feature acceptance-gated |
806
841
  | No backup, no recovery | `backup` / `restore` / `export` / `import` |
@@ -860,7 +895,7 @@ pip install "mempalace-code[spellcheck]" # autocorrect for room/wing names
860
895
  pip install "mempalace-code[dev]" # pytest + ruff + pyright
861
896
  ```
862
897
 
863
- **Requirements:** Python 3.11+. ~80 MB embedding model downloaded once during `mempalace-code init`.
898
+ **Requirements:** Python 3.11+. ~80 MB embedding model cached once during `mempalace-code init` or `mempalace-code fetch-model`; repeated cached runs resolve the model locally.
864
899
 
865
900
  </details>
866
901
 
@@ -881,8 +916,9 @@ mempalace-code mine <dir> --watch # auto-incremental on fil
881
916
  mempalace-code mine-all <parent-dir> # sync all projects incrementally (one wing per project)
882
917
  mempalace-code mine-all <parent-dir> --new-only # only mine projects not yet in the palace
883
918
 
884
- # Watch (multi-project auto-sync)
885
- mempalace-code watch <parent-dir> # watch all initialized projects
919
+ # Watch (project auto-sync)
920
+ mempalace-code watch <initialized-project> # watch a single initialized project
921
+ mempalace-code watch <parent-dir> # watch all initialized projects in a parent directory
886
922
  mempalace-code watch <parent-dir> schedule # print launchd/cron daemon snippet
887
923
  mempalace-code watch <parent-dir> status # disk-budget + launchd state
888
924
 
@@ -908,7 +944,7 @@ mempalace-code wake-up --wing myapp # project-scoped
908
944
  mempalace-code status # palace overview
909
945
 
910
946
  # Model
911
- mempalace-code fetch-model # pre-download for offline use
947
+ mempalace-code fetch-model # cache or verify model for offline use
912
948
  ```
913
949
 
914
950
  </details>
@@ -966,7 +1002,7 @@ python -m pyright --pythonpath "$(python -c 'import sys; print(sys.executable)')
966
1002
  Apache 2.0 — see [LICENSE](LICENSE) and [NOTICE](NOTICE).
967
1003
 
968
1004
  <!-- Link Definitions -->
969
- [version-shield]: https://img.shields.io/badge/version-1.10.1-4dc9f6?style=flat-square&labelColor=0a0e14
1005
+ [version-shield]: https://img.shields.io/badge/version-1.10.2-4dc9f6?style=flat-square&labelColor=0a0e14
970
1006
  [release-link]: https://github.com/rergards/mempalace-code/releases
971
1007
  [python-shield]: https://img.shields.io/badge/python-3.11+-7dd8f8?style=flat-square&labelColor=0a0e14&logo=python&logoColor=7dd8f8
972
1008
  [python-link]: https://www.python.org/
@@ -63,7 +63,7 @@ Then ask your AI to read [`docs/AGENT_INSTALL.md`](docs/AGENT_INSTALL.md) — it
63
63
  <summary>Or do it manually</summary>
64
64
 
65
65
  ```bash
66
- mempalace-code init ~/projects/myapp # detect rooms, download embedding model (~80 MB)
66
+ mempalace-code init ~/projects/myapp # detect rooms, cache embedding model (~80 MB)
67
67
  mempalace-code init ~/projects/myapp --detect-entities # optional people/project detection for notes/convos
68
68
  mempalace-code mine ~/projects/myapp # index your codebase
69
69
  claude mcp add mempalace-code -- python -m mempalace_code.mcp_server # connect Claude Code
@@ -256,11 +256,14 @@ uv tool inject mempalace-code watchfiles # or: pipx inject mempalace-code watch
256
256
  ```
257
257
 
258
258
  ```bash
259
- mempalace-code watch ~/projects/ # watch all projects (on commit, default)
259
+ mempalace-code watch ~/projects/my-app # watch an initialized project (on commit)
260
+ mempalace-code watch ~/projects/ # watch all initialized projects in a parent directory
260
261
  mempalace-code watch ~/projects/ --on-save # watch all file saves instead (noisier)
261
262
  mempalace-code watch ~/projects/ schedule # print launchd/cron snippet for daemon
262
263
  ```
263
264
 
265
+ `watch` accepts either an **initialized project directory** (has `mempalace.yaml`) or a **parent directory** containing immediate initialized project subdirectories. Pointing it at a project root that has project files but no `mempalace.yaml` exits with the correct `mempalace-code init <dir>` command.
266
+
264
267
  **Install as persistent daemon (macOS):**
265
268
 
266
269
  ```bash
@@ -583,6 +586,8 @@ Or in `~/.mempalace/config.json`: `{"backup_retain_count": 5}`. Retention only a
583
586
  After a successful optimize and readability check, MemPalace also runs
584
587
  best-effort verified Lance cleanup (`cleanup_stale_fragments` with
585
588
  `unsafe_now=false`) so future backups do not keep archiving stale table versions.
589
+ Optimize and cleanup verification re-opens the Lance table, so it checks the
590
+ same fresh-handle path the next CLI, MCP server, or watcher process will use.
586
591
  Use the manual `cleanup` command for older installations that already
587
592
  accumulated stale versions or for emergency recovery.
588
593
 
@@ -627,6 +632,36 @@ Skips compaction entirely. Storage will grow with more fragments but avoids any
627
632
 
628
633
  Also available: `mempalace-code export --only-manual` for JSONL export of manually-stored drawers.
629
634
 
635
+ **Remote mirror risk — backups vs file mirroring:**
636
+
637
+ Managed backups and Lance cleanup protect **local** palace state. They do not protect against
638
+ delete-mode rsync between independent hosts. `rsync --delete` syncing a whole MemPalace state
639
+ directory removes remote-owned drawers, diary entries, and KG triples that were never synced
640
+ back to the source — even when local backups are healthy.
641
+
642
+ Use these recommended excludes for any delete-mode state-directory mirror:
643
+
644
+ ```bash
645
+ rsync -a --delete \
646
+ --exclude=palace/ \
647
+ --exclude=knowledge_graph.sqlite3 \
648
+ --exclude=config.json \
649
+ --exclude=backups/ \
650
+ ~/.mempalace/ user@host:.mempalace/
651
+ ```
652
+
653
+ Run a preflight check before installing a mirror job (the command is never executed):
654
+
655
+ ```bash
656
+ mempalace-code preflight mirror --command \
657
+ "rsync -a --delete --exclude=palace/ --exclude=knowledge_graph.sqlite3 \
658
+ --exclude=config.json --exclude=backups/ ~/.mempalace/ user@host:.mempalace/"
659
+ # OK
660
+ ```
661
+
662
+ See [docs/BACKUP_RESTORE.md](docs/BACKUP_RESTORE.md) for the full mirror-risk guidance and
663
+ the safer export/import alternative for cross-host transfer of non-regenerable content.
664
+
630
665
  ---
631
666
 
632
667
  ### Scan Excludes
@@ -681,7 +716,7 @@ exclusion rule.
681
716
  mempalace-code health # probe palace for fragment corruption
682
717
  mempalace-code health --json # machine-readable report
683
718
  mempalace-code cleanup --older-than-days 7 # reclaim stale Lance versions
684
- mempalace-code cleanup --unsafe-now # emergency cleanup; only with no writers active
719
+ mempalace-code cleanup --unsafe-now # emergency only; stop MemPalace processes first
685
720
 
686
721
  mempalace-code repair --dry-run # show what would be recovered
687
722
  mempalace-code repair --rollback # roll back to last working version
@@ -700,9 +735,9 @@ mempalace-code repair --rollback # roll back to last working version
700
735
  Use `--dry-run` first to see how many rows would be lost.
701
736
 
702
737
  Normal optimize runs already prune verified stale Lance versions after a
703
- successful compaction. Manual `cleanup` is still useful after older installs,
704
- large historical accumulations, or emergency disk recovery when no writer is
705
- active.
738
+ successful compaction and fresh-handle verification. Manual `cleanup` is still
739
+ useful after older installs, large historical accumulations, or emergency disk
740
+ recovery after stopping watchers, miners, maintenance commands, and MCP servers.
706
741
 
707
742
  ---
708
743
 
@@ -751,7 +786,7 @@ This is a code-first fork of [milla-jovovich/mempalace](https://github.com/milla
751
786
  | Upstream | This fork |
752
787
  |---|---|
753
788
  | ChromaDB — [silently deletes data on version bump](https://github.com/milla-jovovich/mempalace/issues/469) | LanceDB — crash-safe Arrow storage, no version-cliff |
754
- | "No internet after install" — [false](https://github.com/milla-jovovich/mempalace/issues/524) | `mempalace-code init` downloads model explicitly; offline after model setup |
789
+ | "No internet after install" — [false](https://github.com/milla-jovovich/mempalace/issues/524) | `mempalace-code init` downloads the model explicitly once; cached mining/search use local-only model resolution first |
755
790
  | "100% R@5" — [unverifiable](https://github.com/milla-jovovich/mempalace/issues/27) | Number removed. Methodology caveats documented |
756
791
  | ~30% test coverage | 2200+ tests, every feature acceptance-gated |
757
792
  | No backup, no recovery | `backup` / `restore` / `export` / `import` |
@@ -811,7 +846,7 @@ pip install "mempalace-code[spellcheck]" # autocorrect for room/wing names
811
846
  pip install "mempalace-code[dev]" # pytest + ruff + pyright
812
847
  ```
813
848
 
814
- **Requirements:** Python 3.11+. ~80 MB embedding model downloaded once during `mempalace-code init`.
849
+ **Requirements:** Python 3.11+. ~80 MB embedding model cached once during `mempalace-code init` or `mempalace-code fetch-model`; repeated cached runs resolve the model locally.
815
850
 
816
851
  </details>
817
852
 
@@ -832,8 +867,9 @@ mempalace-code mine <dir> --watch # auto-incremental on fil
832
867
  mempalace-code mine-all <parent-dir> # sync all projects incrementally (one wing per project)
833
868
  mempalace-code mine-all <parent-dir> --new-only # only mine projects not yet in the palace
834
869
 
835
- # Watch (multi-project auto-sync)
836
- mempalace-code watch <parent-dir> # watch all initialized projects
870
+ # Watch (project auto-sync)
871
+ mempalace-code watch <initialized-project> # watch a single initialized project
872
+ mempalace-code watch <parent-dir> # watch all initialized projects in a parent directory
837
873
  mempalace-code watch <parent-dir> schedule # print launchd/cron daemon snippet
838
874
  mempalace-code watch <parent-dir> status # disk-budget + launchd state
839
875
 
@@ -859,7 +895,7 @@ mempalace-code wake-up --wing myapp # project-scoped
859
895
  mempalace-code status # palace overview
860
896
 
861
897
  # Model
862
- mempalace-code fetch-model # pre-download for offline use
898
+ mempalace-code fetch-model # cache or verify model for offline use
863
899
  ```
864
900
 
865
901
  </details>
@@ -917,7 +953,7 @@ python -m pyright --pythonpath "$(python -c 'import sys; print(sys.executable)')
917
953
  Apache 2.0 — see [LICENSE](LICENSE) and [NOTICE](NOTICE).
918
954
 
919
955
  <!-- Link Definitions -->
920
- [version-shield]: https://img.shields.io/badge/version-1.10.1-4dc9f6?style=flat-square&labelColor=0a0e14
956
+ [version-shield]: https://img.shields.io/badge/version-1.10.2-4dc9f6?style=flat-square&labelColor=0a0e14
921
957
  [release-link]: https://github.com/rergards/mempalace-code/releases
922
958
  [python-shield]: https://img.shields.io/badge/python-3.11+-7dd8f8?style=flat-square&labelColor=0a0e14&logo=python&logoColor=7dd8f8
923
959
  [python-link]: https://www.python.org/
@@ -22,7 +22,7 @@ feature checklist, not an install step.
22
22
  | Code/docs mining | `mempalace-code mine <dir>` indexes supported source, docs, prose, config, and data files into LanceDB |
23
23
  | Conversation/log ingest | `mempalace-code mine <dir> --mode convos` ingests Claude Code JSONL, Codex CLI JSONL, Gemini CLI JSONL, Claude.ai JSON, ChatGPT JSON, Slack JSON, and plain text transcripts |
24
24
  | Multi-project sync | `mempalace-code mine-all <parent>` assigns one wing per initialized project; `--new-only` skips already-known wings |
25
- | Auto-watch | `mempalace-code watch <parent>` re-mines initialized projects on commit by default; `--on-save` is available but noisier |
25
+ | Auto-watch | `mempalace-code watch <initialized-project>` watches one project directly; `mempalace-code watch <parent>` watches all initialized projects in a parent directory; re-mines on commit by default; `--on-save` is available but noisier |
26
26
  | MCP tools | 29 tools (default `full` profile): semantic search, code search, file context/read, manual drawers, KG, architecture retrieval, graph tunnels, diary, re-mine; named profiles (`minimal`, `kg`, `code`, `notes`) reduce the exposed subset at startup |
27
27
  | KG / architecture | Temporal facts plus .NET/Python architecture extraction; .NET project/type graph tools require pre-mined symbols |
28
28
  | Local-model fallback | `mempalace-code wake-up` emits memory layers for agents without MCP support |
@@ -177,7 +177,7 @@ Ask all five questions before acting. Record answers; they parameterize Sections
177
177
 
178
178
  ### Q3 — Model download consent
179
179
 
180
- **ASK HUMAN:** "mempalace-code uses a local embedding model (~80 MB) downloaded once from HuggingFace. This requires internet access during setup; after that everything runs offline. Reply `yes` to download now, `no` to skip (you can run `mempalace-code fetch-model` later), or `offline` if this machine has no internet access."
180
+ **ASK HUMAN:** "mempalace-code uses a local embedding model (~80 MB) cached once from HuggingFace. This requires internet access only if the model is not already cached; after that everything runs offline. Reply `yes` to cache/verify now, `no` to skip (you can run `mempalace-code fetch-model` later), or `offline` if this machine has no internet access."
181
181
 
182
182
  **Parse response:**
183
183
  - `yes` → Set `DOWNLOAD_MODEL=yes`.
@@ -427,7 +427,7 @@ Do not add the flag just because a directory is a source repo; code symbols are
427
427
 
428
428
  ---
429
429
 
430
- ### Step 4c: Download embedding model
430
+ ### Step 4c: Cache or verify embedding model
431
431
 
432
432
  **Condition:** `DOWNLOAD_MODEL=yes`
433
433
 
@@ -436,11 +436,11 @@ Run:
436
436
  mempalace-code fetch-model
437
437
  ```
438
438
 
439
- `fetch-model` is idempotent — if the model is already cached it loads instantly from disk (no network call). Expected output ends with `Done — embedding model is ready for offline use.`
439
+ `fetch-model` is idempotent — if the model is already cached it verifies local-only model resolution from disk (no network call). Expected output ends with `Done — embedding model is ready for offline use.`
440
440
 
441
441
  Exit code 0 = success. Set `MODEL_READY=true`. Continue to Step 4d.
442
442
 
443
- **Fail →** Retry once. If still failing, **ASK HUMAN:** "Model download failed (network error or HuggingFace unavailable). The palace will work without the model, but search quality will degrade until it is available. Reply `retry` to try again, or `continue` to proceed without the model (run `mempalace-code fetch-model` later)."
443
+ **Fail →** Retry once. If still failing, **ASK HUMAN:** "Model cache/verify failed (missing cache, network error, or HuggingFace unavailable). The palace will work without the model, but search quality will degrade until it is available. Reply `retry` to try again, or `continue` to proceed without the model (run `mempalace-code fetch-model` later)."
444
444
 
445
445
  **Condition:** `DOWNLOAD_MODEL=no` → Set `MODEL_READY=false`. Note to human: run `mempalace-code fetch-model` before first search.
446
446
 
@@ -926,3 +926,38 @@ items:
926
926
  resolution: '2026-05-24: completed in pipeline run (commit=b4d31bb, 9 files changed, 136 insertions(+), 1 deletion(-))'
927
927
  archived_date: "2026-05-24"
928
928
  done_summary: completed in pipeline run (commit=b4d31bb, 9 files changed, 136 insertions(+), 1 deletion(-))
929
+ - key: WATCH-LANCE-MISSING-FRAGMENT-ROLLBACK
930
+ summary: Make watch initial mine fail closed and recover from Lance missing-fragment write errors
931
+ resolution: '2026-05-29: Restored watcher rollback safety and fixed managed backup filename collisions; full test suite passed after manual provider repair.'
932
+ archived_date: "2026-05-29"
933
+ done_summary: Restored watcher rollback safety and fixed managed backup filename collisions; full test suite passed after manual provider repair.
934
+ - key: RESTORE-KG-PATH-SCOPING
935
+ summary: Avoid surprising global KG overwrite when restoring to an explicit palace path
936
+ resolution: '2026-05-29: completed in pipeline run (commit=98a7244, 17 files changed, 634 insertions(+), 2 deletions(-))'
937
+ archived_date: "2026-05-29"
938
+ done_summary: completed in pipeline run (commit=98a7244, 17 files changed, 634 insertions(+), 2 deletions(-))
939
+ - key: WATCH-INITIALIZED-ROOT-UX
940
+ summary: Clarify or support watch on a directory that is itself an initialized project
941
+ resolution: '2026-05-29: completed in pipeline run (commit=5fe84f9, 18 files changed, 755 insertions(+), 38 deletions(-))'
942
+ archived_date: "2026-05-29"
943
+ done_summary: completed in pipeline run (commit=5fe84f9, 18 files changed, 755 insertions(+), 38 deletions(-))
944
+ - key: WATCH-STALE-SWEEP-BULK-DELETE
945
+ summary: Make watch initial stale-file sweep delete in bulk instead of one Lance version per stale file
946
+ resolution: '2026-05-29: completed in pipeline run (commit=f6f3fa1, 14 files changed, 646 insertions(+), 1 deletion(-))'
947
+ archived_date: "2026-05-29"
948
+ done_summary: completed in pipeline run (commit=f6f3fa1, 14 files changed, 646 insertions(+), 1 deletion(-))
949
+ - key: REMOTE-MIRROR-SAFE-GUARDS
950
+ summary: Add safeguards and docs for remote mirror jobs that can delete live palace data
951
+ resolution: '2026-05-29: completed in pipeline run (commit=e7f524b, 22 files changed, 1654 insertions(+))'
952
+ archived_date: "2026-05-29"
953
+ done_summary: completed in pipeline run (commit=e7f524b, 22 files changed, 1654 insertions(+))
954
+ - key: MIRROR-PREFLIGHT-WRAPPER-DETECTION
955
+ summary: Detect wrapped destructive mirror commands in preflight mirror
956
+ resolution: '2026-05-29: completed in pipeline run (commit=867ef57, 12 files changed, 732 insertions(+), 9 deletions(-))'
957
+ archived_date: "2026-05-29"
958
+ done_summary: completed in pipeline run (commit=867ef57, 12 files changed, 732 insertions(+), 9 deletions(-))
959
+ - key: MIRROR-PREFLIGHT-SUDO-COMBINED-OPTS
960
+ summary: Detect sudo combined-option mirror wrapper forms
961
+ resolution: '2026-05-29: completed in pipeline run (commit=7588660, 9 files changed, 213 insertions(+), 1 deletion(-))'
962
+ archived_date: "2026-05-29"
963
+ done_summary: completed in pipeline run (commit=7588660, 9 files changed, 213 insertions(+), 1 deletion(-))
@@ -42,4 +42,14 @@ sections:
42
42
  # ============================================================
43
43
  # OPEN ITEMS
44
44
  # ============================================================
45
- items: []
45
+ items:
46
+ - key: STORE-HF-CACHED-SEARCH-SUBPROCESS-GUARD
47
+ section: quality
48
+ status: open
49
+ priority: P2
50
+ summary: Add subprocess-level guard that cached model search/fetch never emits HuggingFace token warnings or performs network metadata calls after setup.
51
+ acceptance:
52
+ - Run a real CLI subprocess with a preseeded HuggingFace cache and network/socket access blocked or mocked.
53
+ - Assert `mempalace-code search` exits successfully without `HF_TOKEN`, `unauthenticated`, `huggingface.co`, or retry noise on stdout/stderr.
54
+ - Assert repeated `mempalace-code fetch-model` on a cached model uses local-only resolution and does not perform Hub metadata requests.
55
+ - Keep the existing network-marked download tests separate from this no-network regression guard.
@@ -157,6 +157,40 @@ mempalace-code restore ~/safe.tar.gz # restore (prompts before overwr
157
157
  mempalace-code restore ~/safe.tar.gz --force # overwrite without prompt
158
158
  ```
159
159
 
160
+ ### Tarball Restore — KG Destination
161
+
162
+ When a tarball archive includes `knowledge_graph.sqlite3`, the restore command decides
163
+ where to write it based on your invocation:
164
+
165
+ | Invocation | KG written to |
166
+ |------------|---------------|
167
+ | `mempalace-code restore FILE` | `~/.mempalace/knowledge_graph.sqlite3` (global default) |
168
+ | `mempalace-code --palace <dir> restore FILE` | `<dir>/knowledge_graph.sqlite3` (palace-scoped) |
169
+ | `mempalace-code --palace <dir> restore FILE --kg-path <path>` | `<path>` (explicit override) |
170
+ | `mempalace-code restore FILE --kg-path <path>` | `<path>` (explicit override) |
171
+
172
+ **Important:** When you restore to an explicit `--palace <dir>`, the archived KG data
173
+ is written to `<dir>/knowledge_graph.sqlite3` — not to the global default — to avoid
174
+ silently overwriting an unrelated knowledge graph.
175
+
176
+ Use `--kg-path` to direct the KG to any arbitrary destination, including the global
177
+ default path, a shared location, or a testing path:
178
+
179
+ ```bash
180
+ # Restore Lance data to a custom palace, KG to the custom palace (default scoping)
181
+ mempalace-code --palace ~/my_palace restore ~/backup.tar.gz
182
+
183
+ # Override the KG destination explicitly
184
+ mempalace-code --palace ~/my_palace restore ~/backup.tar.gz --kg-path ~/shared_kg.sqlite3
185
+
186
+ # Restore without --palace: KG goes to the global default (backward-compatible)
187
+ mempalace-code restore ~/backup.tar.gz
188
+ ```
189
+
190
+ > **Note:** This tarball restore behavior is separate from JSONL import/export KG
191
+ > handling. The `--skip-kg` and `--with-kg` flags documented in the [Restore
192
+ > Procedure](#restore-procedure) section above apply to JSONL imports only.
193
+
160
194
  ### Scheduled Backups
161
195
 
162
196
  ```bash
@@ -174,6 +208,44 @@ Each backup has a kind that controls its filename prefix and per-kind retention:
174
208
  | `manual` | `mempalace_backup_` | `backup create` (default) |
175
209
  | `scheduled` | `scheduled_` | `backup create --kind scheduled` / cron |
176
210
  | `pre_optimize` | `pre_optimize_` | Auto-backup before optimize |
211
+ | `pre_watch` | `pre_watch_` | Auto-backup before watcher initial mine |
212
+
213
+ ### Watch Pre-Run Backups
214
+
215
+ When an existing palace is detected on watcher startup, `mempalace-code watch` (and
216
+ `mempalace-code mine --watch`) creates a `pre_watch` archive **before** the initial
217
+ incremental mine. The archive path is printed to stdout:
218
+
219
+ ```
220
+ Pre-watch backup: /path/to/.mempalace/backups/pre_watch_20260101_120000.tar.gz
221
+ ```
222
+
223
+ If the archive cannot be created (e.g. disk budget too low), the watcher **exits
224
+ immediately** — the initial mine is never run and the palace is not mutated.
225
+
226
+ ### Degraded Startup Recovery
227
+
228
+ If the initial mine fails with a Lance missing-fragment error (a symptom of prior
229
+ cleanup/restore history leaving stale fragment references), the watcher:
230
+
231
+ 1. Prints `DEGRADED` and the error context.
232
+ 2. Attempts an automatic Lance version rollback to the most recent healthy version
233
+ (`repair --rollback`).
234
+ 3. If rollback succeeds, retries the initial mine once. The watcher enters the
235
+ normal watch loop only after the retry succeeds.
236
+ 4. If rollback finds no healthy candidate, or the retry still fails, the watcher
237
+ exits **before watching** and prints operator-safe recovery commands:
238
+
239
+ ```
240
+ To diagnose and recover, run:
241
+ mempalace-code --palace /path/palace health
242
+ mempalace-code --palace /path/palace repair --rollback --dry-run
243
+ mempalace-code --palace /path/palace restore /path/pre_watch_20260101_120000.tar.gz --force
244
+ ```
245
+
246
+ The `restore --force` command falls back to the `pre_watch` tarball when Lance
247
+ version rollback cannot recover. Manual review is required before running it (the
248
+ restore command overwrites the palace `lance/` directory).
177
249
 
178
250
  ### Auto-Backup Before Optimize
179
251
 
@@ -216,7 +288,9 @@ Archives written with explicit `--out` paths are never pruned.
216
288
 
217
289
  After a successful optimize and readability check, MemPalace also runs
218
290
  best-effort verified Lance cleanup so future backups do not keep archiving stale
219
- table versions. Manual `cleanup` remains the recovery tool for older
291
+ table versions. Optimize and cleanup verification re-opens the Lance table, so
292
+ it checks the same fresh-handle path the next CLI, MCP server, or watcher
293
+ process will use. Manual `cleanup` remains the recovery tool for older
220
294
  installations that already accumulated stale versions or for emergency disk
221
295
  recovery.
222
296
 
@@ -248,11 +322,12 @@ and managed `scheduled` backups keep the newest 14; `manual` backups stay
248
322
  unbounded unless you set an explicit retain count.
249
323
 
250
324
  If LanceDB stale versions/fragments are the problem rather than backup archives,
251
- run storage cleanup after confirming no writer process is active:
325
+ run storage cleanup only after stopping MemPalace watchers, miners, maintenance
326
+ commands, and MCP servers:
252
327
 
253
328
  ```bash
254
329
  mempalace-code cleanup --older-than-days 7
255
- mempalace-code cleanup --unsafe-now # emergency only; no watcher/miner may be running
330
+ mempalace-code cleanup --unsafe-now # emergency only; no MemPalace process may be running
256
331
  ```
257
332
 
258
333
  ---
@@ -377,8 +452,8 @@ written.
377
452
  mempalace-code fetch-model
378
453
  ```
379
454
 
380
- On an already-prefetched host, you can also force offline model resolution and
381
- avoid Hugging Face metadata checks during the smoke:
455
+ On an already-prefetched host, you can also force offline model resolution to
456
+ verify the smoke does not need network access:
382
457
 
383
458
  ```bash
384
459
  HF_HUB_OFFLINE=1 TRANSFORMERS_OFFLINE=1 python scripts/migrate_storage_smoke.py --rows 3
@@ -441,6 +516,81 @@ regardless of exceptions. No files are written inside the repository.
441
516
 
442
517
  ---
443
518
 
519
+ ## Remote Mirror Risk
520
+
521
+ Managed backups and Lance cleanup protect **local** palace state. They do not protect
522
+ against a separate class of operator risk: delete-mode file mirroring between independent
523
+ hosts (`rsync --delete`).
524
+
525
+ When `rsync --delete` syncs a whole MemPalace state directory from one host to another,
526
+ it removes files on the destination that are absent on the source. If the destination host
527
+ holds **remote-owned** drawers, diary entries, or KG triples that were never synced back
528
+ to the source, those are permanently deleted — even though local backups and Lance cleanup
529
+ are healthy.
530
+
531
+ ### Why managed backups do not protect against this
532
+
533
+ - Backups archive the **source** palace. A delete-mode mirror of the source removes content
534
+ from the **destination** that the source never knew about.
535
+ - Backup retention and Lance cleanup run on the source; they have no visibility into remote
536
+ state or what `rsync --delete` will remove on the destination.
537
+
538
+ ### Safe rsync with recommended excludes
539
+
540
+ If you must mirror the palace state directory between hosts, exclude the live palace data,
541
+ KG database, config, and managed backups directory so a delete sweep cannot remove
542
+ remote-owned content:
543
+
544
+ ```bash
545
+ rsync -a --delete \
546
+ --exclude=palace/ \
547
+ --exclude=knowledge_graph.sqlite3 \
548
+ --exclude=config.json \
549
+ --exclude=backups/ \
550
+ ~/.mempalace/ user@host:.mempalace/
551
+ ```
552
+
553
+ Add `--exclude='*.log'` if you route MemPalace watch logs into the state directory
554
+ (by default, logs go to `/tmp/mempalace-watch.log` and do not need excluding).
555
+
556
+ ### Preflight check before installing a mirror job
557
+
558
+ Before installing a launchd or cron mirror job, run the preflight command to verify your
559
+ rsync invocation is safe (the command is inspected only — it is never executed):
560
+
561
+ ```bash
562
+ mempalace-code preflight mirror --command \
563
+ "rsync -a --delete --exclude=palace/ --exclude=knowledge_graph.sqlite3 \
564
+ --exclude=config.json --exclude=backups/ ~/.mempalace/ user@host:.mempalace/"
565
+ # OK
566
+
567
+ mempalace-code preflight mirror --command "rsync -a --delete ~/.mempalace/ user@host:.mempalace/"
568
+ # BLOCKED [delete-mode-state-mirror-missing-excludes]
569
+ # missing exclude: palace
570
+ # missing exclude: kg
571
+ # missing exclude: config
572
+ # missing exclude: backups
573
+ ```
574
+
575
+ Use `--json` for automation scripts that parse the result.
576
+
577
+ ### Recommended alternative: export/import instead of whole-state mirrors
578
+
579
+ Whole-state mirrors transfer regenerable code-chunked drawers along with the irreplaceable
580
+ manual content. A safer cross-host transfer uses the export/import flow:
581
+
582
+ ```bash
583
+ # On source host: export only manual drawers and KG (non-regenerable content)
584
+ mempalace-code export --only-manual --with-kg --out ~/transfer.jsonl
585
+
586
+ # Copy the JSONL to the destination host, then import
587
+ mempalace-code import ~/transfer.jsonl
588
+ ```
589
+
590
+ This preserves remote-owned content on both sides and avoids delete-sweep risk entirely.
591
+
592
+ ---
593
+
444
594
  ## Related
445
595
 
446
596
  - Upstream data loss context: issue #469 in the original ChromaDB-based fork