mempalace-code 1.15.1__tar.gz → 1.16.0__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 (320) hide show
  1. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/AGENTS.md +19 -0
  2. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/CHANGELOG.md +21 -0
  3. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/PKG-INFO +41 -7
  4. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/README.md +40 -6
  5. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/AGENT_INSTALL.md +13 -1
  6. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/BACKUP_RESTORE.md +64 -5
  7. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/LLM_USAGE_RULES.md +16 -0
  8. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/RELEASING.md +146 -12
  9. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/quality/PALACE-SCOPE-RESOURCE-BOUNDARY.md +4 -2
  10. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/quality/acceptance/README.md +9 -3
  11. mempalace_code-1.16.0/docs/quality/acceptance/v1.16.0.md +115 -0
  12. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/quality/scorecard.json +8 -8
  13. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/quality/scorecard.md +8 -8
  14. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/agent_plugin/plugin.json +1 -1
  15. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/backup.py +60 -9
  16. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/cli_commands/watch.py +3 -2
  17. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/config.py +20 -2
  18. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/disk_budget.py +16 -5
  19. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/watcher.py +13 -3
  20. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/pyproject.toml +1 -1
  21. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/scripts/release_install_metadata_smoke.py +36 -8
  22. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/scripts/release_readiness_gate.py +456 -117
  23. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/conftest.py +2 -1
  24. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_agent_skill_authority_contract.py +16 -26
  25. mempalace_code-1.16.0/tests/test_backup_dir.py +254 -0
  26. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_docs_drift_guard.py +1 -1
  27. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_release_install_metadata_smoke.py +127 -0
  28. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_release_readiness_gate.py +239 -15
  29. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_version_check.py +3 -1
  30. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/uv.lock +1 -1
  31. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/.gitignore +0 -0
  32. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/.gitleaks.toml +0 -0
  33. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/.pre-commit-config.yaml +0 -0
  34. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/CLAUDE.md +0 -0
  35. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/CONTRIBUTING.md +0 -0
  36. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/LICENSE +0 -0
  37. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/NOTICE +0 -0
  38. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/SECURITY.md +0 -0
  39. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/assets/mempalace_banner.jpg +0 -0
  40. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/benchmarks/BENCHMARKS.md +0 -0
  41. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/benchmarks/HYBRID_MODE.md +0 -0
  42. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/benchmarks/README.md +0 -0
  43. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/benchmarks/code_retrieval_bench.py +0 -0
  44. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/benchmarks/convomem_bench.py +0 -0
  45. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/benchmarks/data/code_retrieval_queries.json +0 -0
  46. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/benchmarks/demo_perf_budgets.json +0 -0
  47. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/benchmarks/demo_perf_budgets.py +0 -0
  48. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/benchmarks/dotnet_bench.py +0 -0
  49. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/benchmarks/embed_ab_bench.py +0 -0
  50. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/benchmarks/locomo_bench.py +0 -0
  51. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/benchmarks/longmemeval_bench.py +0 -0
  52. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/benchmarks/membench_bench.py +0 -0
  53. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/benchmarks/minilm_runtime_compatibility_fixture.json +0 -0
  54. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/benchmarks/results_embed_ab_2026-04-09.json +0 -0
  55. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/benchmarks/results_token_delta_mempalace.json +0 -0
  56. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/benchmarks/retrieval_quality_facts.json +0 -0
  57. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/benchmarks/token_delta_bench.py +0 -0
  58. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/benchmarks/token_delta_fixture_facts.json +0 -0
  59. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/BENCH_TOKEN_DELTA.md +0 -0
  60. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/COMPARISON_GRAPHIFY.md +0 -0
  61. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/DEPENDENCY_UPGRADE_GATE.md +0 -0
  62. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/HOW_SEARCH_WORKS.md +0 -0
  63. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/OFFLINE_USAGE.md +0 -0
  64. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/UPDATES.md +0 -0
  65. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/UPSTREAM_COMPARISON.md +0 -0
  66. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/UPSTREAM_HARDENING.md +0 -0
  67. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/WHY_THIS_FORK.md +0 -0
  68. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/demo/code-intelligence-packet.json +0 -0
  69. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/demo/code-intelligence-packet.md +0 -0
  70. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/dependency-audit-allowlist.json +0 -0
  71. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/operations/wing-migration.md +0 -0
  72. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/quality/README.md +0 -0
  73. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/quality/acceptance/v1.15.0.md +0 -0
  74. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/quality/acceptance/v1.15.1.md +0 -0
  75. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/quality/autopilot-demo-gate-ledger.json +0 -0
  76. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/quality/autopilot-demo-gate-ledger.md +0 -0
  77. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/quality/upstream-comparison.json +0 -0
  78. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/quality/workflow-review-protocol.md +0 -0
  79. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/docs/release-admission-rulesets.md +0 -0
  80. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/examples/HOOKS_TUTORIAL.md +0 -0
  81. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/examples/basic_mining.py +0 -0
  82. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/examples/convo_import.py +0 -0
  83. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/examples/gemini_cli_setup.md +0 -0
  84. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/examples/mcp_setup.md +0 -0
  85. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/hooks/README.md +0 -0
  86. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/hooks/mempal_precompact_hook.sh +0 -0
  87. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/hooks/mempal_save_hook.sh +0 -0
  88. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace/__init__.py +0 -0
  89. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace/mcp_server.py +0 -0
  90. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/README.md +0 -0
  91. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/__init__.py +0 -0
  92. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/__main__.py +0 -0
  93. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/_stdio.py +0 -0
  94. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/agent_plugin/mcp.json +0 -0
  95. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/agent_plugin/schemas/1.0.0/mcp.schema.json +0 -0
  96. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/agent_plugin/schemas/1.0.0/plugin.schema.json +0 -0
  97. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/agent_plugin/schemas/SCHEMA-NOTICE.md +0 -0
  98. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/agent_plugin/skills/mempalace/SKILL.md +0 -0
  99. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/agent_plugins.py +0 -0
  100. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/architecture.py +0 -0
  101. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/cli.py +0 -0
  102. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/cli_commands/__init__.py +0 -0
  103. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/cli_commands/agent_plugin.py +0 -0
  104. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/cli_commands/alias.py +0 -0
  105. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/cli_commands/backup_restore.py +0 -0
  106. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/cli_commands/common.py +0 -0
  107. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/cli_commands/diary.py +0 -0
  108. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/cli_commands/export_import.py +0 -0
  109. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/cli_commands/ingest.py +0 -0
  110. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/cli_commands/maintenance.py +0 -0
  111. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/cli_commands/model.py +0 -0
  112. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/cli_commands/preflight.py +0 -0
  113. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/cli_commands/query.py +0 -0
  114. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/cli_commands/update.py +0 -0
  115. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/cli_commands/version_check.py +0 -0
  116. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/cli_commands/wing_migration.py +0 -0
  117. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/cli_invocation.py +0 -0
  118. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/convo_miner.py +0 -0
  119. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/dialect.py +0 -0
  120. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/diary.py +0 -0
  121. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/entity_detector.py +0 -0
  122. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/entity_registry.py +0 -0
  123. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/errors.py +0 -0
  124. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/export.py +0 -0
  125. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/general_extractor.py +0 -0
  126. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/knowledge_graph.py +0 -0
  127. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/language_catalog.py +0 -0
  128. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/launchd.py +0 -0
  129. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/layers.py +0 -0
  130. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mcp/__init__.py +0 -0
  131. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mcp/dispatch.py +0 -0
  132. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mcp/protocol_compat.py +0 -0
  133. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mcp/protocol_text.py +0 -0
  134. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mcp/registry.py +0 -0
  135. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mcp/runtime.py +0 -0
  136. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mcp/tools/__init__.py +0 -0
  137. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mcp/tools/architecture.py +0 -0
  138. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mcp/tools/diary.py +0 -0
  139. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mcp/tools/graph.py +0 -0
  140. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mcp/tools/kg.py +0 -0
  141. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mcp/tools/read.py +0 -0
  142. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mcp/tools/search.py +0 -0
  143. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mcp/tools/write.py +0 -0
  144. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mcp_launcher.py +0 -0
  145. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mcp_server.py +0 -0
  146. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mcp_tool_profiles.py +0 -0
  147. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/miner.py +0 -0
  148. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mining/__init__.py +0 -0
  149. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mining/batching.py +0 -0
  150. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mining/chunkers.py +0 -0
  151. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mining/kg_extract.py +0 -0
  152. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mining/languages.py +0 -0
  153. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mining/orchestrator.py +0 -0
  154. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mining/projects.py +0 -0
  155. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mining/scanner.py +0 -0
  156. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mining/source_text.py +0 -0
  157. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mining/symbols.py +0 -0
  158. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/mirror_preflight.py +0 -0
  159. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/normalize.py +0 -0
  160. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/onboarding.py +0 -0
  161. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/operation_lock.py +0 -0
  162. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/palace_graph.py +0 -0
  163. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/py.typed +0 -0
  164. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/reader.py +0 -0
  165. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/retrieval_rerank.py +0 -0
  166. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/room_detector_local.py +0 -0
  167. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/search_reranker.py +0 -0
  168. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/searcher.py +0 -0
  169. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/source_io.py +0 -0
  170. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/spellcheck.py +0 -0
  171. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/split_mega_files.py +0 -0
  172. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/storage.py +0 -0
  173. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/taxonomy_filters.py +0 -0
  174. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/treesitter.py +0 -0
  175. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/updater.py +0 -0
  176. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/version.py +0 -0
  177. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/version_check.py +0 -0
  178. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/mempalace_code/wing_migration.py +0 -0
  179. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/pyrightconfig.strict.json +0 -0
  180. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/scripts/architecture_guard.py +0 -0
  181. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/scripts/bootstrap.sh +0 -0
  182. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/scripts/dependency_upgrade_gate.py +0 -0
  183. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/scripts/docs_drift_guard.py +0 -0
  184. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/scripts/gate_inventory.py +0 -0
  185. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/scripts/gen_code_intelligence_packet.py +0 -0
  186. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/scripts/gitleaks_scan.py +0 -0
  187. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/scripts/nuke_wing.py +0 -0
  188. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/scripts/public_safety_scan.py +0 -0
  189. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/scripts/pytest_failure_summary.py +0 -0
  190. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/scripts/quality_scorecard.py +0 -0
  191. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/scripts/release_admission_checks.py +0 -0
  192. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/scripts/release_artifact_gate.py +0 -0
  193. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/scripts/release_notes.py +0 -0
  194. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/scripts/release_preflight.py +0 -0
  195. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/scripts/release_public_read.py +0 -0
  196. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/scripts/release_status_gate.py +0 -0
  197. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/scripts/upstream_comparison_guard.py +0 -0
  198. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/scripts/wing_migration.py +0 -0
  199. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/scripts/workflow_summary_guard.py +0 -0
  200. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/fixtures/unreasoned_suppression.py +0 -0
  201. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/release_smoke_support.py +0 -0
  202. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_agent_plugin_package.py +0 -0
  203. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_architecture_extraction.py +0 -0
  204. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_architecture_guard.py +0 -0
  205. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_autopilot_demo_gate_ledger.py +0 -0
  206. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_backup.py +0 -0
  207. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_backup_cli.py +0 -0
  208. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_chunking.py +0 -0
  209. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_claude_hooks.py +0 -0
  210. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_cli.py +0 -0
  211. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_cli_command_modules.py +0 -0
  212. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_cli_golden_scenarios.py +0 -0
  213. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_code_intelligence_packet.py +0 -0
  214. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_code_retrieval_bench.py +0 -0
  215. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_config.py +0 -0
  216. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_convo_miner.py +0 -0
  217. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_demo_perf_budgets.py +0 -0
  218. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_dependency_upgrade_gate.py +0 -0
  219. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_dialect.py +0 -0
  220. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_disk_budget.py +0 -0
  221. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_dotnet_bench.py +0 -0
  222. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_dotnet_config.py +0 -0
  223. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_e2e.py +0 -0
  224. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_embed_ab_bench.py +0 -0
  225. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_embedding_runtime.py +0 -0
  226. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_entity_detector.py +0 -0
  227. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_entity_registry.py +0 -0
  228. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_explicit_wing_consistency.py +0 -0
  229. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_export.py +0 -0
  230. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_gate_inventory.py +0 -0
  231. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_general_extractor.py +0 -0
  232. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_gitleaks_scan.py +0 -0
  233. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_installed_artifact_behavior.py +0 -0
  234. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_installed_cli_palace_scope.py +0 -0
  235. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_kg_extract.py +0 -0
  236. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_knowledge_graph.py +0 -0
  237. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_lang_detect.py +0 -0
  238. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_language_catalog.py +0 -0
  239. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_layers.py +0 -0
  240. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_legacy_benchmark_retrieval.py +0 -0
  241. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_license_notice.py +0 -0
  242. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_longmemeval_metrics.py +0 -0
  243. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_mcp_protocol_compat.py +0 -0
  244. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_mcp_registry.py +0 -0
  245. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_mcp_server.py +0 -0
  246. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_mcp_tool_profiles.py +0 -0
  247. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_mine_source_exact.py +0 -0
  248. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_miner.py +0 -0
  249. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_miner_modules.py +0 -0
  250. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_normalize.py +0 -0
  251. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_nuke_wing.py +0 -0
  252. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_offline.py +0 -0
  253. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_onboarding.py +0 -0
  254. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_operation_lock.py +0 -0
  255. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_packaging_namespace.py +0 -0
  256. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_palace_graph.py +0 -0
  257. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_palace_kg_owner.py +0 -0
  258. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_palace_scope_resource_boundary.py +0 -0
  259. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_public_safety_scan.py +0 -0
  260. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_pyright_optional_dependencies.py +0 -0
  261. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_pytest_failure_summary.py +0 -0
  262. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_quality_palace_scope_resource_boundary.py +0 -0
  263. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_quality_scorecard.py +0 -0
  264. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_reader.py +0 -0
  265. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_regular_source_guard.py +0 -0
  266. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_release_artifact_gate.py +0 -0
  267. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_release_notes.py +0 -0
  268. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_release_preflight.py +0 -0
  269. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_release_public_read.py +0 -0
  270. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_release_ruleset_contract.py +0 -0
  271. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_release_skill_contract.py +0 -0
  272. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_release_status_gate.py +0 -0
  273. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_release_workflow_admission.py +0 -0
  274. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_retrieval_rerank.py +0 -0
  275. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_search_reranker.py +0 -0
  276. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_searcher.py +0 -0
  277. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_split_mega_files.py +0 -0
  278. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_stdio.py +0 -0
  279. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_storage.py +0 -0
  280. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_storage_lance.py +0 -0
  281. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_symbol_extract.py +0 -0
  282. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_taxonomy_filters.py +0 -0
  283. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_token_delta_bench.py +0 -0
  284. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_treesitter.py +0 -0
  285. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_type_suppressions.py +0 -0
  286. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat2_mining.py +0 -0
  287. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat2_watch_ops.py +0 -0
  288. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat_compress_layers.py +0 -0
  289. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat_config_init.py +0 -0
  290. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat_convo_core.py +0 -0
  291. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat_convo_formats.py +0 -0
  292. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat_convos.py +0 -0
  293. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat_ids.py +0 -0
  294. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat_install_r2.py +0 -0
  295. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat_kg.py +0 -0
  296. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat_kg_backup.py +0 -0
  297. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat_kg_mining.py +0 -0
  298. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat_leases.py +0 -0
  299. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat_mcp_protocol.py +0 -0
  300. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat_mcp_search.py +0 -0
  301. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat_mining.py +0 -0
  302. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat_model_fetch.py +0 -0
  303. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat_model_install.py +0 -0
  304. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat_ops_misc.py +0 -0
  305. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat_repair.py +0 -0
  306. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat_repair_backup.py +0 -0
  307. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat_repair_reads.py +0 -0
  308. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat_search_read.py +0 -0
  309. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_uat_watch.py +0 -0
  310. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_updater.py +0 -0
  311. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_upstream_comparison_guard.py +0 -0
  312. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_version_consistency.py +0 -0
  313. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_watcher.py +0 -0
  314. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_watcher_resource_bounds.py +0 -0
  315. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_watcher_resource_subprocess.py +0 -0
  316. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_wing_migration.py +0 -0
  317. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tests/test_workflow_summary_guard.py +0 -0
  318. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tools/gitleaks/go.mod +0 -0
  319. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tools/gitleaks/go.sum +0 -0
  320. {mempalace_code-1.15.1 → mempalace_code-1.16.0}/tools/gitleaks/tools.go +0 -0
@@ -17,6 +17,16 @@ credential-free hosted workflows. An optional interoperability exercise with an
17
17
  AI client requires separate explicit owner authorization, runs outside the
18
18
  release gate, and cannot block a release.
19
19
 
20
+ **Direct functional release boundary.** Before release candidate publication,
21
+ run the exact installed wheel through its real CLI and credential-free stdio MCP
22
+ interfaces in disposable environments. Reconcile every discovered command and
23
+ subcommand, every enabled tool in every profile, and supported runtime extras
24
+ with concrete success or documented refusal evidence and relevant failure/retry
25
+ postconditions. Help, parser errors, tool listings, handler-only calls and source
26
+ pytest counts do not prove functional execution. Missing required coverage blocks
27
+ release even when CI passes. Record confirmed problems through backlog-utility
28
+ and retain a public-safe acceptance report. Follow `docs/RELEASING.md` section 1a.
29
+
20
30
  **Commit attribution boundary.** Commits in this repository must not contain a
21
31
  Claude `Co-Authored-By` trailer. Configure automation to omit it; do not add it
22
32
  and clean it up later.
@@ -241,6 +251,15 @@ Edits still require admitted authority and no conflicting writer.
241
251
  ## Operational Lessons
242
252
 
243
253
  - **Keep this file and public docs public-safe.** `AGENTS.md` is the canonical public instruction file; `CLAUDE.md` is only its pointer. Public docs may name package ranges, workflow categories, advisory IDs, and reproducible commands. Private remotes, hostnames, tokens, credentials, local machine paths, customer/project details, incident specifics, and non-public operational history never go here or in other public docs; put private or machine-local lessons only in an ignored local-only note outside the published tree, such as `.codex-local/LESSONS.md`.
254
+ - **Audit privacy before every public delivery.** Follow the privacy audit in
255
+ `docs/RELEASING.md` section 2. Inspect the exact tracked/staged/committed tree,
256
+ including hidden LLM instructions, prompts, settings, examples and sealed backlog
257
+ history, then both distribution archives and the history reachable from the
258
+ outgoing ref. Secret scanning alone cannot establish that operational or personal
259
+ information is public-safe. Retain redacted findings and the reviewed identities;
260
+ a confirmed private disclosure or consequential unresolved classification blocks
261
+ its public delivery. Preserve private local evidence and sealed records; never
262
+ rewrite history, scrub canonical JSON or weaken detectors to pass this gate.
244
263
  - **Record reusable lessons only when they are public knowledge.** When a session exposes a project gotcha, publish step, verification boundary, or agent-behavior correction that is safe for public readers and useful to future contributors, rewrite the matching lesson here in place, or add one when none matches.
245
264
  - **Verify on the surface that will run the change, and name what was not run.** Python tests alone do not prove GitHub Actions runtime changes: use local YAML/static checks such as `actionlint`, then verify the real hosted workflow run when action runtime behavior matters. Direct handler calls are useful for MCP compatibility but do not prove a separate stdio MCP client, and CLI help does not prove the command executes. A release-readiness summary must distinguish unit tests, focused integration tests, direct API smoke, real CLI execution, and hosted/daemon behavior that was not run; a tag-only or release-only workflow without a real trigger run is reported as syntax-checked and version-checked, not execution-tested. Never imply full local coverage for hosted-only behavior.
246
265
  - **Check the intended public release target.** Before publishing, verify the repository, branch, tag, and workflow that public users will see. Do not assume local remote names or private mirrors represent public release truth.
@@ -2,6 +2,27 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## v1.16.0 — 2026-10-05
6
+
7
+ ### Added
8
+
9
+ - Configure `backup_dir` independently of the palace location, with the existing
10
+ environment override mechanism. Manual, scheduled, pre-watch and pre-optimize
11
+ backups share the selected managed directory for creation, listing and rotation.
12
+ Each palace has an isolated directory under the selected root.
13
+
14
+ ### Fixed
15
+
16
+ - Measure managed backup storage in the selected directory and check available
17
+ space on the archive destination. Invalid or inaccessible configured paths fail
18
+ without falling back. Existing archives stay in place, and explicit `--out`
19
+ keeps its rotation bypass and priority.
20
+ - Release acceptance now executes every enabled MCP tool in every profile, checks
21
+ both protocol handshakes, and discovers all delegated migration actions. Help
22
+ and parser guidance do not count as functional execution.
23
+ - Release socket fixtures use a short owned path on platforms with limited Unix
24
+ socket path lengths, with checked cleanup and explicit unsupported-platform handling.
25
+
5
26
  ## v1.15.1 — 2026-10-04
6
27
 
7
28
  Includes the v1.15.0 changes and the corrections below.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: mempalace-code
3
- Version: 1.15.1
3
+ Version: 1.16.0
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
@@ -624,14 +624,17 @@ export MEMPALACE_DISK_MIN_FREE_BYTES=1GiB # global floor (watcher + bac
624
624
  Or set byte values in `~/.mempalace/config.json`. This example keeps the 1 GiB global default
625
625
  and raises the watcher and backup floors to 2 GiB each. The file must be a plain JSON object
626
626
  without comments; a file that fails to parse, or whose top level is not an object, is ignored as
627
- a whole with a one-line warning. A single value that cannot be parsed (for example `"lots"`) is
628
- reported on stderr and the next setting in precedence order applies instead.
627
+ a whole with a one-line warning. A size value that cannot be parsed (for example `"lots"`)
628
+ is reported on stderr and the next size setting in precedence order applies instead.
629
+ An invalid `backup_dir` fails the managed backup operation without a fallback;
630
+ see [Backup directory configuration](https://github.com/rergards/mempalace-code/blob/main/docs/BACKUP_RESTORE.md#choosing-the-managed-backup-directory).
629
631
 
630
632
  ```json
631
633
  {
632
634
  "disk_min_free_bytes": 1073741824,
633
635
  "watch_disk_min_free_bytes": 2147483648,
634
- "backup_disk_min_free_bytes": 2147483648
636
+ "backup_disk_min_free_bytes": 2147483648,
637
+ "backup_dir": null
635
638
  }
636
639
  ```
637
640
 
@@ -1115,6 +1118,31 @@ leading `NAME=value` assignments) carries `HF_HOME` and every `MEMPALACE_*` sett
1115
1118
  rendering shell, such as `MEMPALACE_BACKUP_RETAIN_COUNT`; re-render after changing them.
1116
1119
  `schedule` warns when no palace exists at the target path yet.
1117
1120
 
1121
+ **Backup directory:** Set `backup_dir` in `~/.mempalace/config.json` to put managed
1122
+ archives on another disk, for example `{"backup_dir": "/mnt/backup/mempalace"}`.
1123
+ `MEMPALACE_BACKUP_DIR` overrides that setting. Paths expand `~`; relative paths
1124
+ resolve against the current directory and produce a warning. Use an absolute path
1125
+ for scheduled jobs. An absent setting or JSON `null` keeps the default
1126
+ `<palace_parent>/backups/<palace_name>/` directory.
1127
+
1128
+ The configured directory is a root. Each palace uses a child named
1129
+ `<palace_name>-<hash>`, where the hash comes from its canonical source path, so
1130
+ palaces with the same name keep separate archives and retention. Manual,
1131
+ scheduled, pre-watch and pre-optimize backups, listing and footprint accounting
1132
+ use that child. Free space is checked on the archive destination filesystem.
1133
+ Missing directories are created during backup; listing creates no directories.
1134
+ Invalid or inaccessible settings fail without writing to the default directory.
1135
+ Managed children must be outside the palace and cannot be symbolic links.
1136
+ New backup roots and managed children have owner-only access; an existing
1137
+ configured root keeps its permissions. Archives remain owner-only.
1138
+
1139
+ Changing this setting moves or deletes no existing archives. Previous managed
1140
+ archives remain at their old path; use `backup list --dir /previous/managed/path`
1141
+ to list them. Explicit `--out` takes priority and keeps its existing behavior,
1142
+ including no managed retention, even when `backup_dir` is invalid.
1143
+ See [Backup directory configuration](https://github.com/rergards/mempalace-code/blob/main/docs/BACKUP_RESTORE.md#choosing-the-managed-backup-directory)
1144
+ for inspection commands, permissions and existing-archive behavior.
1145
+
1118
1146
  **Retention (automatic pruning):**
1119
1147
 
1120
1148
  `pre_optimize` and `pre_watch` archives are **bounded by default** to the newest 5 per kind (implicit safe default for repeated mine/optimize cycles and watcher restarts).
@@ -1127,7 +1155,11 @@ export MEMPALACE_BACKUP_RETAIN_COUNT=5 # explicit limit for all kinds; overrid
1127
1155
  export MEMPALACE_BACKUP_RETAIN_COUNT=0 # 0 disables pruning for every kind
1128
1156
  ```
1129
1157
 
1130
- Or in `~/.mempalace/config.json`: `{"backup_retain_count": 5}`. Each palace has its own managed directory, `<palace_parent>/backups/<palace_name>/`, and retention only affects archives there, so palaces that share a parent directory never prune each other's backups. Explicit `--out` archives are never pruned, and `backup create --out` refuses to overwrite an existing file.
1158
+ Or in `~/.mempalace/config.json`: `{"backup_retain_count": 5}`. Retention affects only
1159
+ the palace's selected managed directory. With `backup_dir` unset, that directory is
1160
+ `<palace_parent>/backups/<palace_name>/`; a configured root uses the isolated child
1161
+ described above. Explicit `--out` archives are never pruned, and `backup create --out`
1162
+ refuses to overwrite an existing file.
1131
1163
 
1132
1164
  `backup list` (`--json` for scripts) prints `stale` in its FLAGS column for archives that would be pruned at the current retain count, `oversized` for archives larger than `MEMPALACE_BACKUP_WARN_SIZE_BYTES`, `degraded` for a snapshot of a damaged palace, and `shared` for archives an older release wrote into the shared `<palace_parent>/backups/` directory (they may belong to a sibling palace; check their wings before restoring, and retention never deletes them).
1133
1165
 
@@ -1164,7 +1196,9 @@ Set the backup-specific floor to `0` to disable the backup guard.
1164
1196
 
1165
1197
  **Auto-backup before optimize (on by default):**
1166
1198
 
1167
- `backup_before_optimize` is **`true` by default**. A backup is created under `<palace_parent>/backups/<palace_name>/pre_optimize_*.tar.gz` before every `optimize()` call (runs after mining).
1199
+ `backup_before_optimize` is **`true` by default**. Before every `optimize()` call
1200
+ (runs after mining), a `pre_optimize_*.tar.gz` backup is created in the selected managed
1201
+ directory. With `backup_dir` unset, this is `<palace_parent>/backups/<palace_name>/`.
1168
1202
 
1169
1203
  To opt out, add to `~/.mempalace/config.json`:
1170
1204
  ```json
@@ -1681,7 +1715,7 @@ python -m pyright --pythonpath "$(python -c 'import sys; print(sys.executable)')
1681
1715
  Apache 2.0 — see [LICENSE](https://github.com/rergards/mempalace-code/blob/main/LICENSE) and [NOTICE](https://github.com/rergards/mempalace-code/blob/main/NOTICE).
1682
1716
 
1683
1717
  <!-- Link Definitions -->
1684
- [version-shield]: https://img.shields.io/badge/version-1.15.1-4dc9f6?style=flat-square&labelColor=0a0e14
1718
+ [version-shield]: https://img.shields.io/badge/version-1.16.0-4dc9f6?style=flat-square&labelColor=0a0e14
1685
1719
  [release-link]: https://github.com/rergards/mempalace-code/releases
1686
1720
  [python-shield]: https://img.shields.io/badge/python-3.11+-7dd8f8?style=flat-square&labelColor=0a0e14&logo=python&logoColor=7dd8f8
1687
1721
  [python-link]: https://www.python.org/
@@ -564,14 +564,17 @@ export MEMPALACE_DISK_MIN_FREE_BYTES=1GiB # global floor (watcher + bac
564
564
  Or set byte values in `~/.mempalace/config.json`. This example keeps the 1 GiB global default
565
565
  and raises the watcher and backup floors to 2 GiB each. The file must be a plain JSON object
566
566
  without comments; a file that fails to parse, or whose top level is not an object, is ignored as
567
- a whole with a one-line warning. A single value that cannot be parsed (for example `"lots"`) is
568
- reported on stderr and the next setting in precedence order applies instead.
567
+ a whole with a one-line warning. A size value that cannot be parsed (for example `"lots"`)
568
+ is reported on stderr and the next size setting in precedence order applies instead.
569
+ An invalid `backup_dir` fails the managed backup operation without a fallback;
570
+ see [Backup directory configuration](https://github.com/rergards/mempalace-code/blob/main/docs/BACKUP_RESTORE.md#choosing-the-managed-backup-directory).
569
571
 
570
572
  ```json
571
573
  {
572
574
  "disk_min_free_bytes": 1073741824,
573
575
  "watch_disk_min_free_bytes": 2147483648,
574
- "backup_disk_min_free_bytes": 2147483648
576
+ "backup_disk_min_free_bytes": 2147483648,
577
+ "backup_dir": null
575
578
  }
576
579
  ```
577
580
 
@@ -1055,6 +1058,31 @@ leading `NAME=value` assignments) carries `HF_HOME` and every `MEMPALACE_*` sett
1055
1058
  rendering shell, such as `MEMPALACE_BACKUP_RETAIN_COUNT`; re-render after changing them.
1056
1059
  `schedule` warns when no palace exists at the target path yet.
1057
1060
 
1061
+ **Backup directory:** Set `backup_dir` in `~/.mempalace/config.json` to put managed
1062
+ archives on another disk, for example `{"backup_dir": "/mnt/backup/mempalace"}`.
1063
+ `MEMPALACE_BACKUP_DIR` overrides that setting. Paths expand `~`; relative paths
1064
+ resolve against the current directory and produce a warning. Use an absolute path
1065
+ for scheduled jobs. An absent setting or JSON `null` keeps the default
1066
+ `<palace_parent>/backups/<palace_name>/` directory.
1067
+
1068
+ The configured directory is a root. Each palace uses a child named
1069
+ `<palace_name>-<hash>`, where the hash comes from its canonical source path, so
1070
+ palaces with the same name keep separate archives and retention. Manual,
1071
+ scheduled, pre-watch and pre-optimize backups, listing and footprint accounting
1072
+ use that child. Free space is checked on the archive destination filesystem.
1073
+ Missing directories are created during backup; listing creates no directories.
1074
+ Invalid or inaccessible settings fail without writing to the default directory.
1075
+ Managed children must be outside the palace and cannot be symbolic links.
1076
+ New backup roots and managed children have owner-only access; an existing
1077
+ configured root keeps its permissions. Archives remain owner-only.
1078
+
1079
+ Changing this setting moves or deletes no existing archives. Previous managed
1080
+ archives remain at their old path; use `backup list --dir /previous/managed/path`
1081
+ to list them. Explicit `--out` takes priority and keeps its existing behavior,
1082
+ including no managed retention, even when `backup_dir` is invalid.
1083
+ See [Backup directory configuration](https://github.com/rergards/mempalace-code/blob/main/docs/BACKUP_RESTORE.md#choosing-the-managed-backup-directory)
1084
+ for inspection commands, permissions and existing-archive behavior.
1085
+
1058
1086
  **Retention (automatic pruning):**
1059
1087
 
1060
1088
  `pre_optimize` and `pre_watch` archives are **bounded by default** to the newest 5 per kind (implicit safe default for repeated mine/optimize cycles and watcher restarts).
@@ -1067,7 +1095,11 @@ export MEMPALACE_BACKUP_RETAIN_COUNT=5 # explicit limit for all kinds; overrid
1067
1095
  export MEMPALACE_BACKUP_RETAIN_COUNT=0 # 0 disables pruning for every kind
1068
1096
  ```
1069
1097
 
1070
- Or in `~/.mempalace/config.json`: `{"backup_retain_count": 5}`. Each palace has its own managed directory, `<palace_parent>/backups/<palace_name>/`, and retention only affects archives there, so palaces that share a parent directory never prune each other's backups. Explicit `--out` archives are never pruned, and `backup create --out` refuses to overwrite an existing file.
1098
+ Or in `~/.mempalace/config.json`: `{"backup_retain_count": 5}`. Retention affects only
1099
+ the palace's selected managed directory. With `backup_dir` unset, that directory is
1100
+ `<palace_parent>/backups/<palace_name>/`; a configured root uses the isolated child
1101
+ described above. Explicit `--out` archives are never pruned, and `backup create --out`
1102
+ refuses to overwrite an existing file.
1071
1103
 
1072
1104
  `backup list` (`--json` for scripts) prints `stale` in its FLAGS column for archives that would be pruned at the current retain count, `oversized` for archives larger than `MEMPALACE_BACKUP_WARN_SIZE_BYTES`, `degraded` for a snapshot of a damaged palace, and `shared` for archives an older release wrote into the shared `<palace_parent>/backups/` directory (they may belong to a sibling palace; check their wings before restoring, and retention never deletes them).
1073
1105
 
@@ -1104,7 +1136,9 @@ Set the backup-specific floor to `0` to disable the backup guard.
1104
1136
 
1105
1137
  **Auto-backup before optimize (on by default):**
1106
1138
 
1107
- `backup_before_optimize` is **`true` by default**. A backup is created under `<palace_parent>/backups/<palace_name>/pre_optimize_*.tar.gz` before every `optimize()` call (runs after mining).
1139
+ `backup_before_optimize` is **`true` by default**. Before every `optimize()` call
1140
+ (runs after mining), a `pre_optimize_*.tar.gz` backup is created in the selected managed
1141
+ directory. With `backup_dir` unset, this is `<palace_parent>/backups/<palace_name>/`.
1108
1142
 
1109
1143
  To opt out, add to `~/.mempalace/config.json`:
1110
1144
  ```json
@@ -1621,7 +1655,7 @@ python -m pyright --pythonpath "$(python -c 'import sys; print(sys.executable)')
1621
1655
  Apache 2.0 — see [LICENSE](https://github.com/rergards/mempalace-code/blob/main/LICENSE) and [NOTICE](https://github.com/rergards/mempalace-code/blob/main/NOTICE).
1622
1656
 
1623
1657
  <!-- Link Definitions -->
1624
- [version-shield]: https://img.shields.io/badge/version-1.15.1-4dc9f6?style=flat-square&labelColor=0a0e14
1658
+ [version-shield]: https://img.shields.io/badge/version-1.16.0-4dc9f6?style=flat-square&labelColor=0a0e14
1625
1659
  [release-link]: https://github.com/rergards/mempalace-code/releases
1626
1660
  [python-shield]: https://img.shields.io/badge/python-3.11+-7dd8f8?style=flat-square&labelColor=0a0e14&logo=python&logoColor=7dd8f8
1627
1661
  [python-link]: https://www.python.org/
@@ -1072,7 +1072,19 @@ Same as above — likely fragment corruption. Run
1072
1072
 
1073
1073
  ### "Table unreadable" or LanceDB errors
1074
1074
 
1075
- Storage corruption. Use `"$MEMPALACE_BIN" --palace "$PALACE_PATH" repair --rollback`. Data added after corruption point is lost. This is why auto-backup exists (`~/.mempalace/backups/palace/pre_optimize_*.tar.gz`). Pre-optimize archives are bounded by default (newest 5 kept); scheduled archives are bounded by default (newest 14 kept); set `MEMPALACE_BACKUP_RETAIN_COUNT=0` to keep all kinds unbounded. Successful optimize runs also perform best-effort verified stale-version cleanup; use `"$MEMPALACE_BIN" cleanup` manually for older accumulations or emergency disk recovery after stopping writers.
1075
+ Storage corruption. Follow the inspected recovery procedure in
1076
+ [BACKUP_RESTORE.md](BACKUP_RESTORE.md#health-check-and-repair) before rollback; data
1077
+ added after the selected recovery point is lost. Automatic backups use the selected
1078
+ managed directory. `~/.mempalace/backups/palace/pre_optimize_*.tar.gz` is the default
1079
+ when `backup_dir` is unset. To choose another disk, follow
1080
+ [backup directory configuration](BACKUP_RESTORE.md#choosing-the-managed-backup-directory),
1081
+ merge the key into the existing config, and use an absolute path. Preserve existing
1082
+ archives, mounts and services; setting `backup_dir` does not migrate them.
1083
+ Pre-optimize archives are bounded by default (newest 5 kept); scheduled archives are
1084
+ bounded by default (newest 14 kept); set `MEMPALACE_BACKUP_RETAIN_COUNT=0` to keep all
1085
+ kinds unbounded. Successful optimize runs also perform best-effort verified
1086
+ stale-version cleanup; use `"$MEMPALACE_BIN" cleanup` manually for older accumulations
1087
+ or emergency disk recovery after stopping writers.
1076
1088
 
1077
1089
  ### Re-mine doesn't fix the issue
1078
1090
 
@@ -667,9 +667,57 @@ tarball. Do not run that suggestion
667
667
  directly. Set its palace as `RESTORE_TARGET`, set the tarball as `ARCHIVE`, and
668
668
  follow the inspected force-restore procedure in [Tarball Backup](#tarball-backup-full-snapshot).
669
669
 
670
+ ### Choosing the managed backup directory
671
+
672
+ Set `backup_dir` in `~/.mempalace/config.json` to select a backup root independently
673
+ of the palace. Merge this key into the existing JSON object; preserve other settings:
674
+
675
+ ```json
676
+ {
677
+ "backup_dir": "/mnt/backup/mempalace"
678
+ }
679
+ ```
680
+
681
+ `MEMPALACE_BACKUP_DIR` overrides the JSON setting. Paths expand `~`; a relative path
682
+ resolves against the process's current directory and emits a warning. Use an absolute
683
+ path for scheduled jobs and services. An absent key or JSON `null` keeps the default
684
+ `<palace_parent>/backups/<palace_name>/` layout.
685
+
686
+ The setting selects a root. Each palace uses
687
+ `<backup_dir>/<palace_name>-<hash>/`, where `<hash>` is the first 16 hexadecimal digits
688
+ of SHA-256 of its canonical palace path. Palaces with the same name have separate
689
+ directories and retention. Manual, scheduled, pre-watch and pre-optimize archives,
690
+ listing, rotation and managed-backup size accounting use this selected directory.
691
+ The backup guard checks free space on the archive's destination filesystem.
692
+
693
+ Creating a backup creates missing directories; listing creates none. Blank, malformed,
694
+ non-directory or inaccessible configured paths fail with an error. MemPalace never
695
+ switches to the default directory after such an error. The managed child must be
696
+ outside the palace and cannot be a symbolic link. New roots and managed children use
697
+ owner-only access (`0700`); an existing configured root keeps its permissions. Archives
698
+ use `0600`.
699
+
700
+ Changing `backup_dir` moves or deletes no archives. Earlier managed archives remain
701
+ at their previous path and leave the selected retention set. To inspect them:
702
+
703
+ ```bash
704
+ mempalace-code backup list --json
705
+ mempalace-code backup list --dir /previous/managed/path --json
706
+ ```
707
+
708
+ Inspect the archive paths returned by `backup list` before any manual removal. Listing
709
+ an extra directory does not enroll it in managed rotation. Legacy shared archives
710
+ remain listed with the `shared` flag and are never pruned.
711
+
712
+ Explicit `backup create --out /path/archive.tar.gz` takes priority over `backup_dir`,
713
+ even when that setting is invalid. It keeps the existing no-overwrite behavior and
714
+ disables managed rotation for that operation. The disk guard uses the explicit
715
+ destination. See [Retention](#retention-automatic-pruning) for per-kind limits.
716
+
670
717
  ### Auto-Backup Before Optimize
671
718
 
672
- Enabled by default. Every `mempalace-code mine` creates a backup before compacting storage:
719
+ Enabled by default. Every `mempalace-code mine` creates a backup before compacting storage.
720
+ With `backup_dir` unset, the default palace uses:
673
721
 
674
722
  ```
675
723
  ~/.mempalace/backups/palace/pre_optimize_YYYYMMDD_HHMMSS_ffffff.tar.gz
@@ -704,7 +752,8 @@ export MEMPALACE_BACKUP_RETAIN_COUNT=10
704
752
  export MEMPALACE_BACKUP_RETAIN_COUNT=0
705
753
  ```
706
754
 
707
- Each palace has its own managed backups directory, `<palace_parent>/backups/<palace_name>/`
755
+ Each palace has its own [selected managed directory](#choosing-the-managed-backup-directory).
756
+ With `backup_dir` unset, it is `<palace_parent>/backups/<palace_name>/`
708
757
  (the default palace `~/.mempalace/palace` uses `~/.mempalace/backups/palace/`). Retention prunes
709
758
  **only that directory**, so palaces that share a parent directory never prune each other's
710
759
  archives. Archives written with explicit `--out` paths are never pruned, and `backup create
@@ -915,6 +964,11 @@ The last sentence names the setting that actually set the floor, for example
915
964
 
916
965
  The projection is conservative: it assumes the archive size equals the uncompressed palace + KG size. Actual compressed archives are usually smaller, but the guard refuses when even the worst-case estimate would leave insufficient headroom.
917
966
 
967
+ Free space comes from the filesystem of the selected managed directory or explicit
968
+ `--out` destination. The palace and backup root can be on different disks. Watcher
969
+ write thresholds still check the palace filesystem; `watch <dir> status` accounts
970
+ for archives in the selected managed directory.
971
+
918
972
  ### Configuring the backup floor
919
973
 
920
974
  ```bash
@@ -956,13 +1010,18 @@ If the backup guard refuses because disk is nearly full:
956
1010
 
957
1011
  1. Check what is taking space:
958
1012
  ```bash
959
- du -sh ~/.mempalace/palace ~/.mempalace/backups
1013
+ mempalace-code backup list --json
1014
+ # Set BACKUP_PATH to a listed archive's containing directory after inspection.
1015
+ : "${BACKUP_PATH:?set BACKUP_PATH to the inspected backup directory}"
1016
+ du -sh ~/.mempalace/palace "$BACKUP_PATH"
960
1017
  ```
961
1018
  2. List existing backups and remove stale ones manually if immediate space is needed:
962
1019
  ```bash
963
1020
  mempalace-code backup list
964
- ls -lh ~/.mempalace/backups/palace/
965
- rm ~/.mempalace/backups/palace/<stale_archive>.tar.gz
1021
+ ls -lh "$BACKUP_PATH"
1022
+ : "${BACKUP_PATH:?set BACKUP_PATH to the inspected backup directory}"
1023
+ # Remove only an inspected archive that you intend to discard.
1024
+ rm -i "$BACKUP_PATH/<stale_archive>.tar.gz"
966
1025
  ```
967
1026
  3. Re-run the backup once enough space is freed.
968
1027
 
@@ -243,6 +243,22 @@ in human mode or `recovery_command` in the single JSON object on stdout. Review
243
243
  target, and mutation authority before using the exact emitted command. Do not add flags, change the
244
244
  action, or invent a nearby retry.
245
245
 
246
+ ## Backup configuration and recovery
247
+
248
+ Backup operations use the direct CLI; the minimal memory profile exposes no backup
249
+ tool. Follow [BACKUP_RESTORE.md](BACKUP_RESTORE.md#choosing-the-managed-backup-directory)
250
+ when the owner requests backup configuration or recovery. `backup_dir` selects a root
251
+ with a separate managed child for each palace; `MEMPALACE_BACKUP_DIR` takes precedence.
252
+ Use an absolute path for services and scheduled jobs. Preserve existing configuration
253
+ keys and inspect `mempalace-code backup list --json` to confirm archive paths.
254
+
255
+ Changing the setting moves or deletes no existing archives. An invalid or inaccessible
256
+ configured path fails; retain the requested destination and report the error. Do not
257
+ unset it, change mounts, or add `--out` as an unapproved recovery. An owner-selected
258
+ `--out` destination bypasses managed rotation. Backup permission does not authorize
259
+ archive deletion, restore over an existing palace, or service changes. Use the inspected
260
+ restore procedure in the linked guide within the current authority.
261
+
246
262
  ## Ambiguous Write Outcome
247
263
 
248
264
  On timeout, lost response, restart, or context loss after calling `mempalace_add_drawer`, `mempalace_kg_add`, `mempalace_kg_invalidate`, or `mempalace_diary_write`, do not immediately repeat the write. Reconcile observable poststate before any retry.
@@ -50,7 +50,28 @@ Update the version, changelog, public documentation, and generated scorecard in
50
50
  one reviewable change. Keep `## Unreleased` at the top of `CHANGELOG.md`; move
51
51
  the completed items into the new version heading when cutting the release.
52
52
 
53
- Run the local checks from the release commit. None of them needs the candidate
53
+ Resolve existing authorization before asking for another approval. Preparation,
54
+ disposable-platform testing, candidate push, public promotion, publication and
55
+ live deployment are separate effects; apply the active request to each. A missing
56
+ permission blocks only its dependent effect. Qualification remains credential-free.
57
+
58
+ Check each changed behavior's public routes: README, its feature guide, agent
59
+ installation and LLM rules, CLI/MCP examples, and packaged instructions when the
60
+ capability belongs there. Update current claims, defaults, environment precedence,
61
+ failure recovery and preservation guarantees against source. Keep dated historical
62
+ evidence intact. Do not add backup operations to the minimal memory plugin, which
63
+ exposes only its declared memory tools.
64
+
65
+ Inspect every path selected for the public commit, including newly staged backlog
66
+ records. Private journals and machine-bound task histories remain local. Use the
67
+ existing ignore owner and supported backlog operations; preserve sealed records and
68
+ validate the store. An index-only exclusion preserves files at that moment, but a
69
+ later branch switch or merge can remove them if another ref still tracks them.
70
+ Before such integration, retain verified sealed bytes through the supported backup
71
+ or validated export route; compare their hashes and run native backlog validation
72
+ afterward. A clean Git tree proves no uncommitted diff, not preservation of ignored data.
73
+
74
+ Run source and documentation checks before building the installed candidate. None needs the candidate
54
75
  SHA or public `main`; the exact-SHA public admission runs in section 3c, after
55
76
  public `main` carries the candidate:
56
77
 
@@ -59,11 +80,7 @@ python scripts/docs_drift_guard.py
59
80
  python scripts/public_safety_scan.py --tracked --staged
60
81
  python scripts/quality_scorecard.py --check
61
82
  python scripts/gen_code_intelligence_packet.py --check
62
- python scripts/release_preflight.py --tag vX.Y.Z --require-clean
63
- python scripts/release_install_metadata_smoke.py --all-installers --install-spec . --json
64
- python -m build --wheel --outdir dist
65
- WHEEL=dist/mempalace_code-X.Y.Z-py3-none-any.whl
66
- python scripts/release_readiness_gate.py --installed-golden-wheel "$WHEEL" --json
83
+ python scripts/release_preflight.py --json
67
84
  python -m pytest tests/ -x -q -m "not needs_network"
68
85
  python -m pytest tests/test_mcp_protocol_compat.py -q
69
86
  python -m pytest tests/test_cli_golden_scenarios.py -q
@@ -73,9 +90,41 @@ python -m pyright --pythonpath "$(python -c 'import sys; print(sys.executable)')
73
90
  python -m pyright -p pyrightconfig.strict.json
74
91
  ```
75
92
 
76
- With `--tag`, the preflight also reports an `acceptance_report` row. It fails until
77
- section 1a's report for this exact package tree is committed, so run section 1a
78
- once the other checks pass, then rerun the preflight.
93
+ Then build both distribution formats into an owned output directory, check their
94
+ members and metadata, and use one exact wheel for all installed checks:
95
+
96
+ ```bash
97
+ python -m build --outdir dist
98
+ WHEEL="$(pwd)/dist/mempalace_code-X.Y.Z-py3-none-any.whl"
99
+ python scripts/release_artifact_gate.py --dist dist --require-wheel --require-sdist --json
100
+ python scripts/release_install_metadata_smoke.py --all-installers --install-spec "$WHEEL" --json
101
+ python scripts/release_readiness_gate.py --installed-golden-wheel "$WHEEL" --json
102
+ ```
103
+
104
+ Use the pending version in place of `X.Y.Z`; retain the wheel digest and the source
105
+ objects it represents. On a supported Linux fixture run the same exact-wheel
106
+ installer command with `MEMPALACE_RELEASE_SYSTEMD_USER=1`, as described below.
107
+ An unavailable Linux user manager leaves that receipt `UNRUN`; it does not invalidate
108
+ already passing platform rows or authorize a live service change.
109
+
110
+ Write section 1a's report after installed qualification, then commit the reviewed
111
+ source, report and public-safe metadata within the active authority. Scan the full
112
+ staged tree again before committing so new files are included. Finally run:
113
+
114
+ ```bash
115
+ python scripts/release_preflight.py --tag vX.Y.Z --require-clean --json
116
+ ```
117
+
118
+ With `--tag`, the preflight verifies the committed `acceptance_report` for the
119
+ exact package objects. A pending report or dirty tree is a prerequisite during
120
+ preparation, not a reason to ask again for an already authorized source commit.
121
+ Rebuild distribution archives after a documentation-only source change. Compare
122
+ their members with the tested wheel: runtime/plugin files, dependency and entrypoint
123
+ metadata, and accepted package source objects must match before reusing application
124
+ evidence. A README-only change in the wheel's metadata requires a new artifact check
125
+ and installed metadata smoke; record both wheel identities and the exact difference.
126
+ Other package changes require rerunning the affected installed acceptance and
127
+ updating its report. Archive timestamps alone do not prove a runtime change.
79
128
 
80
129
  `gen_code_intelligence_packet.py --check` regenerates the code-intelligence demo
81
130
  packet in a temp directory and compares it with the committed
@@ -92,7 +141,8 @@ check. It is the canonical pre-tag command and fails closed when upstream
92
141
  python scripts/release_preflight.py --tag vX.Y.Z --require-clean --check-live-upstream
93
142
  ```
94
143
 
95
- `release_install_metadata_smoke.py --all-installers` installs the current checkout through
144
+ `release_install_metadata_smoke.py --all-installers --install-spec "$WHEEL"` installs
145
+ the exact candidate wheel through
96
146
  the canonical `venv`, `bootstrap-venv`, `pipx`, and `uv-tool` contours and proves
97
147
  `importlib.metadata.version`,
98
148
  `mempalace_code.__version__`, and `mempalace-code version-check --status`
@@ -118,7 +168,7 @@ evidence. Recovery: rerun the same aggregate command in the disposable Ubuntu jo
118
168
 
119
169
  ```bash
120
170
  MEMPALACE_RELEASE_SYSTEMD_USER=1 python scripts/release_install_metadata_smoke.py \
121
- --all-installers --install-spec dist/mempalace_code-*.whl --json
171
+ --all-installers --install-spec "$WHEEL" --json
122
172
  ```
123
173
 
124
174
  The manager matrix above remains a lightweight metadata, recovery, plugin, and
@@ -256,7 +306,36 @@ an LLM agent would, following the public documentation literally.
256
306
  agent configuration, crontab, launchd, or systemd user units; render schedules
257
307
  and daemon files without installing them.
258
308
  3. **Exercise every area** below and record what ran in the report's coverage
259
- table:
309
+ table. Direct functional acceptance is a mandatory release condition, separate
310
+ from source tests and CI. Discover commands, delegated subcommands, tools and
311
+ profiles from the installed package. For each supported operation, record the
312
+ exact public-interface invocation, accepted input, expected result, observed
313
+ result and relevant state after failure or retry. Exercise each enabled MCP
314
+ tool in each profile through a separate stdio client, including both supported
315
+ protocol handshakes. Listing a tool proves discovery only. `--help`, parent
316
+ guidance and missing-argument errors prove guidance only; they cannot replace
317
+ execution of the operation. A deliberately retired or unauthorized operation
318
+ is covered by its documented refusal and unchanged-state check, explicitly
319
+ labelled as refusal-only. Live operations use disposable supported fixtures;
320
+ never widen operational authority to satisfy coverage.
321
+
322
+ Reconcile the discovered surface with executed scenarios. An omitted required
323
+ case is blocking `UNRUN`; do not mark the release PASS or defer the missing
324
+ case as a low-severity issue. Platform-specific behavior must run on a supported
325
+ platform. Preserve machine-readable invocation and outcome evidence outside
326
+ the published tree, bound to the exact wheel SHA-256. The existing installed
327
+ owner remains `scripts/release_readiness_gate.py`; supplement its scenarios
328
+ where its aggregate evidence does not establish the required behavior.
329
+
330
+ The installed owner discovers the root parser and the delegated
331
+ `wing-migration` parser. It attributes checked successes, documented refusals
332
+ and verified daemon launches separately from guidance and discovery. A parent
333
+ usage message or an operation's `--help` cannot satisfy its execution case.
334
+ MCP scenarios use a separate disposable palace for each profile, validate each
335
+ enabled tool's result and mutation post-state, and check both protocol
336
+ handshakes with recovery after invalid modern metadata. The suite aggregate
337
+ fails when a discovered operation or enabled tool/profile case is missing.
338
+
260
339
 
261
340
  | Area | Scope |
262
341
  |---|---|
@@ -304,6 +383,61 @@ recorded in the report.
304
383
 
305
384
  ## 2. Review public repository surfaces
306
385
 
386
+ ### Privacy audit before public delivery
387
+
388
+ Run this audit for each release before any public candidate push, promotion or
389
+ publication. Reuse results only when the tree, artifacts and outgoing ancestry
390
+ are unchanged. Enumerate files with Git, which includes hidden tracked paths;
391
+ default filesystem searches can omit them:
392
+
393
+ ```bash
394
+ git ls-files
395
+ git diff --cached --name-only
396
+ python scripts/public_safety_scan.py --committed --tracked --staged
397
+ python scripts/gitleaks_scan.py full-history --artifact-dir .codex-local/release-privacy
398
+ python scripts/release_artifact_gate.py --dist dist --require-wheel --require-sdist --json
399
+ ```
400
+
401
+ Inspect `AGENTS.md`, `CLAUDE.md`, every tracked `.agents/` and `.claude/` instruction,
402
+ prompt, shared reference and setting, `docs/LLM_USAGE_RULES.md`, packaged plugin
403
+ instructions, examples, workflows and all newly staged metadata. Examine sealed
404
+ backlog history as well as current task fields. Check for private remotes, hosts,
405
+ addresses, machine identifiers, real local paths, personal/customer information,
406
+ private project or operational context and credentials. Do not read local credential
407
+ stores or invoke AI clients to perform qualification. Reports contain file positions,
408
+ categories and redacted findings, never secret values or private transcripts.
409
+
410
+ Review ambiguous matches against source and provenance. Generic examples, synthetic
411
+ fixtures and intended public author/contact metadata can resemble private data;
412
+ neither a pattern match nor an automatic PASS settles their classification. Do not
413
+ assume an internal author label is approved for disclosure just because it is sealed
414
+ or already tracked. Record the classification and its basis in the private evidence.
415
+
416
+ Inspect member names and text contents of both wheel and sdist, including README
417
+ metadata, internal instructions and serialized data. The artifact gate checks
418
+ distribution shape; it does not replace content review. Retain the exact archive
419
+ digests, source SHA, scope, findings, dispositions and any uninspected binary members.
420
+
421
+ The pinned full-history scan includes reachable refs. Check the actual outgoing
422
+ ref's parent history separately: excluding a file from the current tree leaves older
423
+ blobs reachable. Local development history and ignored maintainer notes may contain
424
+ retained private evidence. Keep them local. Section 3's candidate carries the reviewed
425
+ tree with current public `main` as its parent; never send local development history
426
+ as a substitute. Inspect the outgoing candidate and archive identities again before
427
+ delivery. If existing public ancestry contains a confirmed disclosure, record it as
428
+ an unresolved exposure; a new clean snapshot cannot remove it.
429
+
430
+ A confirmed private disclosure or consequential unknown classification blocks its
431
+ public delivery. Do not rename an unknown to PASS, delete evidence, edit sealed JSON,
432
+ rewrite published history or add a scanner exemption. Preserve the finding and
433
+ propose the smallest in-scope correction; a history rewrite or disclosure-policy
434
+ change needs its own authority. A clean-tree or secret-scan result alone cannot be
435
+ reported as "no private data remains in the repository". Recovery: inspect the
436
+ retained redacted report, correct the affected surface within authority, then rerun
437
+ the affected scan and exact-ref check.
438
+
439
+ ### Public presentation
440
+
307
441
  Before asking for tag/publish approval, inspect the public repository as a
308
442
  visitor would:
309
443
 
@@ -161,7 +161,8 @@ storage handles are closed before retained resources are measured. The `lsof` me
161
161
  counts numeric descriptors; `cwd`, `txt`, and `mem` records are excluded.
162
162
  Unavailable or incomplete descriptor measurements fail the measurement check;
163
163
  they cannot produce zero growth or a passing descriptor result.
164
- Managed pre-optimize backups use `backups/<palace name>/` and are included in the
164
+ With `backup_dir` unset, managed pre-optimize backups use `backups/<palace name>/`
165
+ and are included in the
165
166
  regression's disk measurement and retention assertion, which requires at least one
166
167
  archive. The fixture uses a disposable HOME and palace.
167
168
 
@@ -202,7 +203,8 @@ The workflow initializes a fixture project, mines it, performs a no-op mine,
202
203
  backs up and restores the palace, searches and reads mined content, and runs one
203
204
  real `--on-save` watch cycle. The no-op output includes `no changes detected`,
204
205
  creates no managed backup archive, and has zero byte growth across the palace and
205
- its sibling `backups/` directory. The watcher waits for `state=watch-ready`,
206
+ its default sibling `backups/` directory (`backup_dir` is unset in this fixture).
207
+ The watcher waits for `state=watch-ready`,
206
208
  updates one already-mined source, accepts one post-debounce retry for native
207
209
  watch registration, observes `[project: 1 change(s)]`, then exits cleanly on
208
210
  SIGTERM with `1 re-mine cycle(s), 1 event(s)`.
@@ -54,9 +54,15 @@ and complete is for the reviewer.
54
54
  The wheel digest identifies the tested artifact. The preflight binds the source ids
55
55
  instead, because the tag workflow rebuilds the distributions from the same tree.
56
56
 
57
- `result: PASS` is allowed only when no confirmed critical or high issue is open,
58
- every other finding is fixed or explicitly deferred with a reason and a follow-up,
59
- and every coverage row ran or states why it could not.
57
+ `result: PASS` requires complete direct functional coverage under RELEASING
58
+ section 1a. Every discovered supported command/subcommand and enabled MCP tool
59
+ in every profile needs actual installed-interface execution and checked results.
60
+ Separate success, documented refusal, failure/retry, and discovery-only evidence.
61
+ Help, parser errors, listings, direct handler calls and source-test counts cannot
62
+ substitute for operation coverage. Missing required coverage is blocking `UNRUN`;
63
+ it cannot be deferred to obtain PASS. Platform-specific cases run on a supported
64
+ platform. No confirmed critical or high issue may remain open; other product
65
+ findings must be fixed or explicitly deferred with a reason and a backlog reference.
60
66
 
61
67
  ## Sections
62
68