mempalace-code 1.10.4__tar.gz → 1.11.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 (236) hide show
  1. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/.claude/skills/release/SKILL.md +46 -10
  2. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/.github/workflows/ci.yml +19 -0
  3. mempalace_code-1.11.0/.github/workflows/dependency-audit.yml +86 -0
  4. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/CHANGELOG.md +56 -1
  5. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/PKG-INFO +46 -2
  6. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/README.md +45 -1
  7. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/docs/BACKLOG-archived.yaml +65 -0
  8. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/docs/BACKLOG.yaml +24 -99
  9. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/docs/BACKUP_RESTORE.md +28 -0
  10. mempalace_code-1.11.0/docs/DEPENDENCY_UPGRADE_GATE.md +265 -0
  11. mempalace_code-1.11.0/docs/demo/code-intelligence-packet.json +266 -0
  12. mempalace_code-1.11.0/docs/demo/code-intelligence-packet.md +1535 -0
  13. mempalace_code-1.11.0/docs/dependency-audit-allowlist.json +4 -0
  14. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/docs/quality/README.md +23 -0
  15. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/docs/quality/scorecard.json +19 -13
  16. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/docs/quality/scorecard.md +11 -10
  17. mempalace_code-1.11.0/docs/task-evidence/AUTOPILOT-DEMO-CODE-INTELLIGENCE-GOLDEN-PACKET-review.md +68 -0
  18. mempalace_code-1.11.0/docs/task-evidence/AUTOPILOT-DEMO-CODE-INTELLIGENCE-PACKET-ACCEPTANCE-FIX-review.md +44 -0
  19. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/examples/HOOKS_TUTORIAL.md +2 -2
  20. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/examples/gemini_cli_setup.md +6 -29
  21. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/hooks/README.md +4 -4
  22. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/hooks/mempal_precompact_hook.sh +6 -12
  23. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/hooks/mempal_save_hook.sh +4 -10
  24. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/cli.py +6 -2
  25. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/cli_commands/backup_restore.py +11 -2
  26. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/cli_commands/export_import.py +26 -1
  27. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/cli_commands/ingest.py +17 -0
  28. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/cli_commands/maintenance.py +22 -2
  29. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/cli_commands/model.py +5 -1
  30. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/cli_commands/query.py +42 -10
  31. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/cli_commands/watch.py +56 -1
  32. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/entity_detector.py +19 -2
  33. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/onboarding.py +1 -1
  34. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/room_detector_local.py +5 -1
  35. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/searcher.py +22 -4
  36. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/watcher.py +107 -8
  37. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/pyproject.toml +1 -1
  38. mempalace_code-1.11.0/scripts/dependency_upgrade_gate.py +1230 -0
  39. mempalace_code-1.11.0/scripts/gen_code_intelligence_packet.py +1280 -0
  40. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/scripts/quality_scorecard.py +5 -0
  41. mempalace_code-1.11.0/scripts/release_status_gate.py +606 -0
  42. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_backup_cli.py +2 -0
  43. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_cli.py +187 -8
  44. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_cli_command_modules.py +18 -2
  45. mempalace_code-1.11.0/tests/test_code_intelligence_packet.py +678 -0
  46. mempalace_code-1.11.0/tests/test_dependency_upgrade_gate.py +1416 -0
  47. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_entity_detector.py +30 -1
  48. mempalace_code-1.11.0/tests/test_offline.py +507 -0
  49. mempalace_code-1.11.0/tests/test_release_status_gate.py +666 -0
  50. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_searcher.py +41 -5
  51. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_watcher.py +411 -4
  52. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/uv.lock +1 -1
  53. mempalace_code-1.10.4/tests/test_offline.py +0 -87
  54. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/.claude/prompts/codex-hardening-review.md +0 -0
  55. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/.claude/prompts/codex-plan-review.md +0 -0
  56. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/.claude/settings.json +0 -0
  57. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/.claude/skills/_shared/commit-checkpoint.md +0 -0
  58. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/.claude/skills/_shared/mode-classification.md +0 -0
  59. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/.claude/skills/_shared/task-state.md +0 -0
  60. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/.claude/skills/bench/SKILL.md +0 -0
  61. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/.claude/skills/doc-refresh/INSTRUCTIONS.md +0 -0
  62. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/.claude/skills/doc-refresh/SKILL.md +0 -0
  63. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/.claude/skills/entropy-gc/INSTRUCTIONS.md +0 -0
  64. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/.claude/skills/entropy-gc/SKILL.md +0 -0
  65. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/.claude/skills/mine/SKILL.md +0 -0
  66. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/.claude/skills/palace-health/SKILL.md +0 -0
  67. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/.claude/skills/release-prep/SKILL.md +0 -0
  68. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/.claude/skills/ship/INSTRUCTIONS.md +0 -0
  69. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/.claude/skills/ship/SKILL.md +0 -0
  70. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/.claude/skills/start/INSTRUCTIONS.md +0 -0
  71. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/.claude/skills/start/SKILL.md +0 -0
  72. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/.claude/skills/status/SKILL.md +0 -0
  73. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/.claude/skills/task-hardening/INSTRUCTIONS.md +0 -0
  74. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/.claude/skills/task-hardening/SKILL.md +0 -0
  75. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/.claude/skills/task-plan/INSTRUCTIONS.md +0 -0
  76. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/.claude/skills/task-plan/SKILL.md +0 -0
  77. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/.claude/skills/verify/INSTRUCTIONS.md +0 -0
  78. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/.claude/skills/verify/SKILL.md +0 -0
  79. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  80. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  81. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  82. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/.github/workflows/dotnet-bench.yml +0 -0
  83. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/.github/workflows/publish.yml +0 -0
  84. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/.gitignore +0 -0
  85. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/.pre-commit-config.yaml +0 -0
  86. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/AGENTS.md +0 -0
  87. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/CLAUDE.md +0 -0
  88. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/CONTRIBUTING.md +0 -0
  89. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/LICENSE +0 -0
  90. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/NOTICE +0 -0
  91. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/assets/mempalace_banner.jpg +0 -0
  92. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/benchmarks/BENCHMARKS.md +0 -0
  93. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/benchmarks/HYBRID_MODE.md +0 -0
  94. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/benchmarks/README.md +0 -0
  95. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/benchmarks/code_retrieval_bench.py +0 -0
  96. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/benchmarks/convomem_bench.py +0 -0
  97. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/benchmarks/data/code_retrieval_queries.json +0 -0
  98. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/benchmarks/dotnet_bench.py +0 -0
  99. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/benchmarks/embed_ab_bench.py +0 -0
  100. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/benchmarks/locomo_bench.py +0 -0
  101. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/benchmarks/longmemeval_bench.py +0 -0
  102. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/benchmarks/membench_bench.py +0 -0
  103. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/benchmarks/results_embed_ab_2026-04-09.json +0 -0
  104. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/benchmarks/results_token_delta_mempalace.json +0 -0
  105. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/benchmarks/token_delta_bench.py +0 -0
  106. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/docs/AGENT_INSTALL.md +0 -0
  107. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/docs/BENCH_TOKEN_DELTA.md +0 -0
  108. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/docs/COMPARISON_GRAPHIFY.md +0 -0
  109. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/docs/HOW_SEARCH_WORKS.md +0 -0
  110. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/docs/LLM_USAGE_RULES.md +0 -0
  111. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/docs/OFFLINE_USAGE.md +0 -0
  112. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/docs/UPSTREAM_HARDENING.md +0 -0
  113. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/docs/WHY_THIS_FORK.md +0 -0
  114. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/docs/quality/workflow-review-protocol.md +0 -0
  115. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/docs/refactoring/REFAC-MINER-MODULES/progress.md +0 -0
  116. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/examples/basic_mining.py +0 -0
  117. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/examples/convo_import.py +0 -0
  118. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/examples/mcp_setup.md +0 -0
  119. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace/__init__.py +0 -0
  120. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace/mcp_server.py +0 -0
  121. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/README.md +0 -0
  122. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/__init__.py +0 -0
  123. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/__main__.py +0 -0
  124. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/_chroma_store.py +0 -0
  125. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/_stdio.py +0 -0
  126. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/architecture.py +0 -0
  127. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/backup.py +0 -0
  128. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/cli_commands/__init__.py +0 -0
  129. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/cli_commands/alias.py +0 -0
  130. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/cli_commands/common.py +0 -0
  131. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/cli_commands/diary.py +0 -0
  132. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/cli_commands/preflight.py +0 -0
  133. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/cli_commands/version_check.py +0 -0
  134. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/config.py +0 -0
  135. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/convo_miner.py +0 -0
  136. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/dialect.py +0 -0
  137. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/disk_budget.py +0 -0
  138. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/entity_registry.py +0 -0
  139. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/export.py +0 -0
  140. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/general_extractor.py +0 -0
  141. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/knowledge_graph.py +0 -0
  142. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/language_catalog.py +0 -0
  143. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/layers.py +0 -0
  144. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/mcp/__init__.py +0 -0
  145. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/mcp/dispatch.py +0 -0
  146. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/mcp/protocol_text.py +0 -0
  147. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/mcp/registry.py +0 -0
  148. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/mcp/runtime.py +0 -0
  149. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/mcp/tools/__init__.py +0 -0
  150. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/mcp/tools/architecture.py +0 -0
  151. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/mcp/tools/diary.py +0 -0
  152. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/mcp/tools/graph.py +0 -0
  153. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/mcp/tools/kg.py +0 -0
  154. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/mcp/tools/read.py +0 -0
  155. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/mcp/tools/search.py +0 -0
  156. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/mcp/tools/write.py +0 -0
  157. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/mcp_server.py +0 -0
  158. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/mcp_tool_profiles.py +0 -0
  159. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/migrate.py +0 -0
  160. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/miner.py +0 -0
  161. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/mining/__init__.py +0 -0
  162. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/mining/batching.py +0 -0
  163. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/mining/chunkers.py +0 -0
  164. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/mining/kg_extract.py +0 -0
  165. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/mining/languages.py +0 -0
  166. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/mining/orchestrator.py +0 -0
  167. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/mining/projects.py +0 -0
  168. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/mining/scanner.py +0 -0
  169. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/mining/symbols.py +0 -0
  170. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/mirror_preflight.py +0 -0
  171. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/normalize.py +0 -0
  172. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/palace_graph.py +0 -0
  173. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/py.typed +0 -0
  174. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/reader.py +0 -0
  175. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/retrieval_rerank.py +0 -0
  176. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/search_reranker.py +0 -0
  177. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/spellcheck.py +0 -0
  178. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/split_mega_files.py +0 -0
  179. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/storage.py +0 -0
  180. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/treesitter.py +0 -0
  181. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/version.py +0 -0
  182. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/mempalace_code/version_check.py +0 -0
  183. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/pyrightconfig.strict.json +0 -0
  184. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/scripts/bootstrap.sh +0 -0
  185. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/scripts/codex-review.sh +0 -0
  186. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/scripts/migrate_storage_smoke.py +0 -0
  187. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/scripts/nuke_wing.py +0 -0
  188. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/scripts/public_safety_scan.py +0 -0
  189. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/conftest.py +0 -0
  190. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/fixtures/unreasoned_suppression.py +0 -0
  191. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_architecture_extraction.py +0 -0
  192. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_backup.py +0 -0
  193. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_chroma_compat.py +0 -0
  194. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_chroma_import_errors.py +0 -0
  195. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_chunking.py +0 -0
  196. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_code_retrieval_bench.py +0 -0
  197. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_config.py +0 -0
  198. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_convo_miner.py +0 -0
  199. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_dialect.py +0 -0
  200. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_disk_budget.py +0 -0
  201. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_dotnet_bench.py +0 -0
  202. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_dotnet_config.py +0 -0
  203. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_e2e.py +0 -0
  204. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_embed_ab_bench.py +0 -0
  205. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_entity_registry.py +0 -0
  206. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_export.py +0 -0
  207. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_general_extractor.py +0 -0
  208. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_kg_extract.py +0 -0
  209. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_knowledge_graph.py +0 -0
  210. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_lang_detect.py +0 -0
  211. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_language_catalog.py +0 -0
  212. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_layers.py +0 -0
  213. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_mcp_registry.py +0 -0
  214. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_mcp_server.py +0 -0
  215. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_mcp_tool_profiles.py +0 -0
  216. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_migrate.py +0 -0
  217. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_migrate_storage_smoke.py +0 -0
  218. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_miner.py +0 -0
  219. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_miner_modules.py +0 -0
  220. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_normalize.py +0 -0
  221. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_packaging_namespace.py +0 -0
  222. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_palace_graph.py +0 -0
  223. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_public_safety_scan.py +0 -0
  224. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_quality_scorecard.py +0 -0
  225. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_reader.py +0 -0
  226. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_retrieval_rerank.py +0 -0
  227. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_search_reranker.py +0 -0
  228. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_split_mega_files.py +0 -0
  229. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_stdio.py +0 -0
  230. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_storage.py +0 -0
  231. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_storage_lance.py +0 -0
  232. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_symbol_extract.py +0 -0
  233. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_treesitter.py +0 -0
  234. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_type_suppressions.py +0 -0
  235. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_version_check.py +0 -0
  236. {mempalace_code-1.10.4 → mempalace_code-1.11.0}/tests/test_version_consistency.py +0 -0
@@ -111,12 +111,55 @@ unavailable and the user explicitly approves the fallback.
111
111
 
112
112
  ### Step 6: Verify Hosted Status
113
113
 
114
- Check all public surfaces separately:
114
+ Run the release-status gate first. It checks every public publication surface
115
+ and exits non-zero when any blocker remains:
115
116
 
116
117
  ```bash
118
+ python scripts/release_status_gate.py --version X.Y.Z \
119
+ --repo rergards/mempalace-code \
120
+ --remote publish \
121
+ --branch main
122
+ ```
123
+
124
+ The gate checks:
125
+ 1. publish remote git tag (`v X.Y.Z` on the `publish` remote)
126
+ 2. branch Tests workflow — most recent completed run on `main` must be green
127
+ 3. Publish to PyPI workflow — most recent completed run must be green
128
+ 4. GitHub Release metadata — non-draft, non-prerelease, `isLatest=true`
129
+ 5. PyPI JSON — `info.version == X.Y.Z` and both wheel and sdist present
130
+ 6. Install smoke — `pip install --no-cache-dir mempalace-code==X.Y.Z` in a disposable venv
131
+
132
+ A release is **not shipped** when any blocker remains. Report the gate's
133
+ `Remaining blockers` list verbatim in the release summary and do not use
134
+ "shipped" or "latest" language until the gate exits 0.
135
+
136
+ For machine-readable status (e.g. Autopilot gating):
137
+
138
+ ```bash
139
+ python scripts/release_status_gate.py --version X.Y.Z --json
140
+ ```
141
+
142
+ **Diagnostic-only mode** (skips install smoke; cannot be labeled fully shipped):
143
+
144
+ ```bash
145
+ python scripts/release_status_gate.py --version X.Y.Z --skip-smoke
146
+ ```
147
+
148
+ If the gate finds blockers, investigate the specific surface that failed.
149
+ Manual fallback diagnostics for individual surfaces:
150
+
151
+ ```bash
152
+ # Tag
153
+ git ls-remote --tags publish "refs/tags/vX.Y.Z"
154
+
155
+ # Workflows
117
156
  gh run list --repo rergards/mempalace-code --branch main --workflow Tests --limit 5
118
157
  gh run list --repo rergards/mempalace-code --workflow "Publish to PyPI" --limit 5
158
+
159
+ # GitHub Release
119
160
  gh release view vX.Y.Z --repo rergards/mempalace-code
161
+
162
+ # PyPI JSON
120
163
  python - <<'PY'
121
164
  import json, urllib.request
122
165
  version = "X.Y.Z"
@@ -126,10 +169,6 @@ assert data["info"]["version"] == version
126
169
  PY
127
170
  ```
128
171
 
129
- If the branch Tests run is red, the tag publish succeeded but the release is not
130
- clean. Fix and publish a follow-up patch before creating or advertising the
131
- GitHub Release as latest.
132
-
133
172
  If PyPI is visible but `gh release view` reports no release, create the GitHub
134
173
  Release only after hosted Tests are green:
135
174
 
@@ -151,11 +190,8 @@ tokens, hostnames, or incident-only details.
151
190
  Version: X.Y.Z
152
191
  Tag: vX.Y.Z
153
192
  Pushed to publish: [yes/no]
154
- Hosted Tests: [pass/fail/not-run]
155
- Publish to PyPI: [pass/fail/not-run]
156
- PyPI visible: [yes/no]
157
- GitHub Release: [created/existing/missing]
193
+ Release status gate: [passed/failed]
158
194
 
159
195
  Remaining blockers:
160
- - [none or exact blocker]
196
+ - [none or exact blocker from release_status_gate.py output]
161
197
  ```
@@ -83,6 +83,25 @@ jobs:
83
83
  - name: Pyright strict slice
84
84
  run: python -m pyright -p pyrightconfig.strict.json
85
85
 
86
+ dependency-upgrade-gate:
87
+ runs-on: ubuntu-latest
88
+ if: github.event_name != 'workflow_dispatch'
89
+ steps:
90
+ - uses: actions/checkout@v5
91
+ with:
92
+ fetch-depth: 0
93
+ - uses: actions/setup-python@v6
94
+ with:
95
+ python-version: "3.13"
96
+ cache: pip
97
+ cache-dependency-path: |
98
+ pyproject.toml
99
+ uv.lock
100
+ - name: Dependency upgrade gate
101
+ run: |
102
+ python scripts/dependency_upgrade_gate.py ci-check \
103
+ --base-ref "${{ github.event_name == 'pull_request' && github.event.pull_request.base.sha || github.event.before }}"
104
+
86
105
  model-tests:
87
106
  runs-on: ubuntu-latest
88
107
  if: github.event_name == 'workflow_dispatch' && github.event.inputs.model_tests == 'true'
@@ -0,0 +1,86 @@
1
+ name: Dependency Audit
2
+
3
+ on:
4
+ schedule:
5
+ - cron: "0 6 * * 1" # Weekly on Monday at 06:00 UTC
6
+ workflow_dispatch:
7
+
8
+ permissions:
9
+ contents: read
10
+ issues: write
11
+
12
+ jobs:
13
+ current-audit:
14
+ runs-on: ubuntu-latest
15
+ steps:
16
+ - uses: actions/checkout@v5
17
+
18
+ - uses: actions/setup-python@v6
19
+ with:
20
+ python-version: "3.13"
21
+ cache: pip
22
+ cache-dependency-path: |
23
+ pyproject.toml
24
+ uv.lock
25
+
26
+ - name: Install audit dependencies
27
+ run: pip install pip-audit
28
+
29
+ - name: Run current dependency audit
30
+ id: audit
31
+ run: |
32
+ set +e
33
+ python scripts/dependency_upgrade_gate.py current-audit \
34
+ --out-dir dependency-audit-output
35
+ rc=$?
36
+ echo "audit_exit=$rc" >> "$GITHUB_OUTPUT"
37
+ exit $rc
38
+ continue-on-error: true
39
+
40
+ - name: Upload audit artifacts
41
+ if: always()
42
+ uses: actions/upload-artifact@v4
43
+ with:
44
+ name: dependency-audit-report
45
+ path: dependency-audit-output/
46
+ if-no-files-found: warn
47
+
48
+ - name: Create or update dependency-audit issue
49
+ if: steps.audit.outcome == 'failure'
50
+ env:
51
+ GH_TOKEN: ${{ github.token }}
52
+ run: |
53
+ ISSUE_TITLE="[dependency-audit] current dependency audit findings"
54
+ ISSUE_BODY_FILE="dependency-audit-output/current-audit-issue-body.md"
55
+ ISSUE_LABEL="dependency-audit"
56
+
57
+ if [ ! -f "$ISSUE_BODY_FILE" ]; then
58
+ echo "No issue body file found; skipping issue creation." >&2
59
+ exit 0
60
+ fi
61
+
62
+ # Find existing open issue with the stable title
63
+ EXISTING=$(gh issue list \
64
+ --state open \
65
+ --search "\"$ISSUE_TITLE\" in:title" \
66
+ --json number \
67
+ --jq '.[0].number // empty' 2>/dev/null || true)
68
+
69
+ if [ -n "$EXISTING" ]; then
70
+ gh issue edit "$EXISTING" --body-file "$ISSUE_BODY_FILE"
71
+ echo "Updated existing issue #$EXISTING"
72
+ else
73
+ gh issue create \
74
+ --title "$ISSUE_TITLE" \
75
+ --body-file "$ISSUE_BODY_FILE" \
76
+ --label "$ISSUE_LABEL" 2>/dev/null || \
77
+ gh issue create \
78
+ --title "$ISSUE_TITLE" \
79
+ --body-file "$ISSUE_BODY_FILE"
80
+ fi
81
+
82
+ - name: Fail workflow on audit findings
83
+ if: steps.audit.outcome == 'failure'
84
+ run: |
85
+ echo "Dependency audit found actionable findings. See uploaded artifact and issue."
86
+ exit 1
@@ -2,7 +2,62 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
- No changes yet.
5
+ ## v1.11.0 — 2026-06-18
6
+
7
+ Minor release for release-readiness gates, dependency audit automation, offline
8
+ search guards, watcher reliability, and clearer CLI recovery guidance.
9
+
10
+ ### Added
11
+
12
+ - Code-intelligence demo packet with deterministic public exhibits: generated fixture
13
+ project mined, searched, and read via real CLI with exact commands and normalized
14
+ output captured in `docs/demo/code-intelligence-packet.{md,json}`.
15
+ - Generation script `scripts/gen_code_intelligence_packet.py` with `--check` mode
16
+ for drift detection and public-safety validation; wired into `/verify` and CI.
17
+ - Comprehensive test suite for packet generation with coverage for output
18
+ normalization, known-answer retrieval assertions, and artifact cleanup.
19
+ - Dependency upgrade/audit gate covering proposed dependency changes, current
20
+ resolver audit checks, CI integration, allowlist handling, and documentation.
21
+ - Weekly scheduled dependency audit workflow for the current dependency graph.
22
+ - Six-surface release publication status gate covering publish remote tags,
23
+ branch tests, PyPI publish workflow status, GitHub Release metadata, PyPI JSON,
24
+ and fresh install smoke.
25
+ - Watcher startup readiness markers for `watch_and_mine` and `watch_all`, making
26
+ daemon initialization distinguishable from stale post-recovery log entries.
27
+
28
+ ### Changed
29
+
30
+ - Human-facing CLI failures now prefer explicit `Next:` recovery guidance across
31
+ search, read, export, backup/restore, watch status, mine-all, compress, health,
32
+ cleanup, and model-fetch flows.
33
+ - Pipe-sensitive commands keep machine-readable output clean: `read` failures and
34
+ `export --out -` diagnostics go to stderr, and generated backup/watch schedule
35
+ snippets remain on stdout while install hints go to stderr.
36
+ - Legacy Claude Code hook prompts now give concise MCP save contracts instead of
37
+ broad "save everything" instructions, while Codex/Gemini docs point to MCP +
38
+ canonical usage rules.
39
+
40
+ ### Fixed
41
+
42
+ - `watch_and_mine` and `watch_all` now refuse uninitialized roots before starting
43
+ macOS FSEvents observers, preventing runaway watcher churn on broad local roots.
44
+ - Cached Hugging Face model fetch and search paths are guarded by subprocess-level
45
+ offline regressions that catch token warnings or metadata network calls.
46
+ - `watch status` now reports the top-level launchd service state instead of
47
+ nested coalition state from `launchctl print`.
48
+ - Release status gate no longer requests unsupported `gh release view --json
49
+ isLatest`; latest release is checked through `gh release list`.
50
+ - Release install smoke subprocesses are bounded by a timeout so public-surface
51
+ diagnostics cannot hang indefinitely on resolver/network stalls.
52
+ - Release gate token sanitization avoids self-matching scanner literals while
53
+ still redacting GitHub and PyPI token-shaped values from diagnostics.
54
+ - `search --palace <missing>` now fails with a clear stderr diagnostic instead
55
+ of reporting an empty result set.
56
+
57
+ ### Removed
58
+
59
+ - Ignored `.tasks/` and `docs/audits/` Autopilot artifacts are no longer tracked
60
+ in the public tree.
6
61
 
7
62
  ## v1.10.4 — 2026-06-06
8
63
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mempalace-code
3
- Version: 1.10.4
3
+ Version: 1.11.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
@@ -335,6 +335,50 @@ launchctl unload ~/Library/LaunchAgents/com.mempalace.watch.plist # stop until
335
335
  launchctl load ~/Library/LaunchAgents/com.mempalace.watch.plist # re-enable after freeing space
336
336
  ```
337
337
 
338
+ **Diagnosing and stopping a crash-looping job:**
339
+
340
+ If the daemon was pointed at an uninitialized directory it will crash-loop under `KeepAlive`. Confirm with:
341
+
342
+ ```bash
343
+ mempalace-code watch ~/projects/ status # shows state, runs count, and last exit code
344
+ ```
345
+
346
+ Stop and optionally remove it:
347
+
348
+ ```bash
349
+ # macOS 10.11+ preferred — unregisters the job immediately:
350
+ launchctl bootout gui/$(id -u)/com.mempalace.watch
351
+
352
+ # Older macOS / alternative:
353
+ launchctl unload ~/Library/LaunchAgents/com.mempalace.watch.plist
354
+
355
+ # Remove permanently (re-install after fixing the watch root):
356
+ rm ~/Library/LaunchAgents/com.mempalace.watch.plist
357
+ ```
358
+
359
+ **Daemon health check:**
360
+
361
+ The daemon emits `WATCH_RUN` lines at each startup transition so the appended log at `/tmp/mempalace-watch.log` can be searched to confirm the latest startup reached the watch loop. Use this sequence to diagnose daemon state:
362
+
363
+ ```bash
364
+ # 1. Process state — is the daemon running?
365
+ launchctl print gui/$(id -u)/com.mempalace.watch
366
+ # Or use the watch status shortcut:
367
+ mempalace-code watch ~/projects/ status
368
+
369
+ # 2. Palace storage health
370
+ mempalace-code --palace ~/.mempalace/palace health
371
+
372
+ # 3. Find the latest startup that reached watch-ready
373
+ grep -a 'state=watch-ready' /tmp/mempalace-watch.log | tail -1
374
+ # Example output: WATCH_RUN run_id=20260616T120102Z-p12345 state=watch-ready
375
+
376
+ # 4. Filter that run's context (replace the run_id from step 3):
377
+ grep -a 'run_id=20260616T120102Z-p12345' /tmp/mempalace-watch.log
378
+ ```
379
+
380
+ A log file may contain `WATCH_RUN` lines from older runs that exited with disk-budget or backup failures. The `run_id` on the latest `state=watch-ready` line identifies the current healthy startup — lines from prior runs with different `run_id` values are stale and can be ignored. If no `watch-ready` line appears, check the most recent `run-started` line and the state that followed it (for example `state=pre-watch-backup-failed` or `state=initial-mine-skipped reason=disk-budget`).
381
+
338
382
  Configure the threshold via environment variable or `~/.mempalace/config.json`:
339
383
 
340
384
  ```bash
@@ -1002,7 +1046,7 @@ python -m pyright --pythonpath "$(python -c 'import sys; print(sys.executable)')
1002
1046
  Apache 2.0 — see [LICENSE](LICENSE) and [NOTICE](NOTICE).
1003
1047
 
1004
1048
  <!-- Link Definitions -->
1005
- [version-shield]: https://img.shields.io/badge/version-1.10.2-4dc9f6?style=flat-square&labelColor=0a0e14
1049
+ [version-shield]: https://img.shields.io/badge/version-1.11.0-4dc9f6?style=flat-square&labelColor=0a0e14
1006
1050
  [release-link]: https://github.com/rergards/mempalace-code/releases
1007
1051
  [python-shield]: https://img.shields.io/badge/python-3.11+-7dd8f8?style=flat-square&labelColor=0a0e14&logo=python&logoColor=7dd8f8
1008
1052
  [python-link]: https://www.python.org/
@@ -286,6 +286,50 @@ launchctl unload ~/Library/LaunchAgents/com.mempalace.watch.plist # stop until
286
286
  launchctl load ~/Library/LaunchAgents/com.mempalace.watch.plist # re-enable after freeing space
287
287
  ```
288
288
 
289
+ **Diagnosing and stopping a crash-looping job:**
290
+
291
+ If the daemon was pointed at an uninitialized directory it will crash-loop under `KeepAlive`. Confirm with:
292
+
293
+ ```bash
294
+ mempalace-code watch ~/projects/ status # shows state, runs count, and last exit code
295
+ ```
296
+
297
+ Stop and optionally remove it:
298
+
299
+ ```bash
300
+ # macOS 10.11+ preferred — unregisters the job immediately:
301
+ launchctl bootout gui/$(id -u)/com.mempalace.watch
302
+
303
+ # Older macOS / alternative:
304
+ launchctl unload ~/Library/LaunchAgents/com.mempalace.watch.plist
305
+
306
+ # Remove permanently (re-install after fixing the watch root):
307
+ rm ~/Library/LaunchAgents/com.mempalace.watch.plist
308
+ ```
309
+
310
+ **Daemon health check:**
311
+
312
+ The daemon emits `WATCH_RUN` lines at each startup transition so the appended log at `/tmp/mempalace-watch.log` can be searched to confirm the latest startup reached the watch loop. Use this sequence to diagnose daemon state:
313
+
314
+ ```bash
315
+ # 1. Process state — is the daemon running?
316
+ launchctl print gui/$(id -u)/com.mempalace.watch
317
+ # Or use the watch status shortcut:
318
+ mempalace-code watch ~/projects/ status
319
+
320
+ # 2. Palace storage health
321
+ mempalace-code --palace ~/.mempalace/palace health
322
+
323
+ # 3. Find the latest startup that reached watch-ready
324
+ grep -a 'state=watch-ready' /tmp/mempalace-watch.log | tail -1
325
+ # Example output: WATCH_RUN run_id=20260616T120102Z-p12345 state=watch-ready
326
+
327
+ # 4. Filter that run's context (replace the run_id from step 3):
328
+ grep -a 'run_id=20260616T120102Z-p12345' /tmp/mempalace-watch.log
329
+ ```
330
+
331
+ A log file may contain `WATCH_RUN` lines from older runs that exited with disk-budget or backup failures. The `run_id` on the latest `state=watch-ready` line identifies the current healthy startup — lines from prior runs with different `run_id` values are stale and can be ignored. If no `watch-ready` line appears, check the most recent `run-started` line and the state that followed it (for example `state=pre-watch-backup-failed` or `state=initial-mine-skipped reason=disk-budget`).
332
+
289
333
  Configure the threshold via environment variable or `~/.mempalace/config.json`:
290
334
 
291
335
  ```bash
@@ -953,7 +997,7 @@ python -m pyright --pythonpath "$(python -c 'import sys; print(sys.executable)')
953
997
  Apache 2.0 — see [LICENSE](LICENSE) and [NOTICE](NOTICE).
954
998
 
955
999
  <!-- Link Definitions -->
956
- [version-shield]: https://img.shields.io/badge/version-1.10.2-4dc9f6?style=flat-square&labelColor=0a0e14
1000
+ [version-shield]: https://img.shields.io/badge/version-1.11.0-4dc9f6?style=flat-square&labelColor=0a0e14
957
1001
  [release-link]: https://github.com/rergards/mempalace-code/releases
958
1002
  [python-shield]: https://img.shields.io/badge/python-3.11+-7dd8f8?style=flat-square&labelColor=0a0e14&logo=python&logoColor=7dd8f8
959
1003
  [python-link]: https://www.python.org/
@@ -961,3 +961,68 @@ items:
961
961
  resolution: '2026-05-29: completed in pipeline run (commit=7588660, 9 files changed, 213 insertions(+), 1 deletion(-))'
962
962
  archived_date: "2026-05-29"
963
963
  done_summary: completed in pipeline run (commit=7588660, 9 files changed, 213 insertions(+), 1 deletion(-))
964
+ - key: AUTOPILOT-DEMO-QUALITY-SCORECARD
965
+ summary: Add a deterministic public quality scorecard that makes Autopilot cleanup progress visible across releases.
966
+ resolution: '2026-06-05: Deterministic public scorecard: scripts/quality_scorecard.py emits Markdown+JSON; --check gates shape/determinism/public-safety in CI lint job and /verify; baseline committed to docs/quality/; update workflow in docs/quality/README.md'
967
+ archived_date: "2026-06-11"
968
+ done_summary: 'Deterministic public scorecard: scripts/quality_scorecard.py emits Markdown+JSON; --check gates shape/determinism/public-safety in CI lint job and /verify; baseline committed to docs/quality/; update workflow in docs/quality/README.md'
969
+ - key: AUTOPILOT-DEMO-PUBLIC-SAFETY-GATE
970
+ summary: Add a repo-wide public-safety gate for tracked and staged files.
971
+ resolution: '2026-06-06: Added scripts/public_safety_scan.py --tracked --staged, CI and /verify wiring, focused tests, and removed tracked .verify-state while adding it to .gitignore.'
972
+ archived_date: "2026-06-11"
973
+ done_summary: Repo-wide public-safety scan now gates tracked/staged files and redacts matched content; .verify-state is local-only.
974
+ - key: AUTOPILOT-DEMO-RUFF-RATCHET
975
+ summary: Reduce transitional Ruff ignores in a measurable ratchet without broad style-only churn.
976
+ resolution: '2026-06-06: Reduced global Ruff ignores from 33 to 3 by keeping existing package/test debt scoped to per-file ignores and making new scripts inherit the stricter rule set.'
977
+ archived_date: "2026-06-11"
978
+ done_summary: 'Ruff global ignore ratchet: broad historical ignores are now scoped away from scripts; no new inline suppressions.'
979
+ - key: AUTOPILOT-DEMO-PYRIGHT-STRICT-SLICE
980
+ summary: Establish a strict Pyright slice for stable low-level modules and expand it gradually.
981
+ resolution: '2026-06-06: Added pyrightconfig.strict.json for version.py, mcp_tool_profiles.py, and disk_budget.py; annotated disk_budget.py enough to pass strict; wired strict slice into CI and /verify.'
982
+ archived_date: "2026-06-11"
983
+ done_summary: Initial strict Pyright slice gates three stable low-level modules in CI and /verify.
984
+ - key: AUTOPILOT-DEMO-WORKFLOW-REVIEW-PROTOCOL
985
+ summary: Document the public-safe adversarial Claude workflow protocol for repo quality work.
986
+ resolution: '2026-06-06: Added docs/quality/workflow-review-protocol.md and linked it from docs/quality/README.md.'
987
+ archived_date: "2026-06-11"
988
+ done_summary: Public-safe multi-agent workflow review protocol is documented for future quality improvements.
989
+ - key: AUTOPILOT-DEMO-CODE-INTELLIGENCE-GOLDEN-PACKET
990
+ summary: Generate a deterministic public-safe code-intelligence packet from real MemPalace CLI output and one minimal MCP stdio exhibit on a synthetic fixture project.
991
+ resolution: '2026-06-11: Deterministic code-intelligence demo packet implemented. scripts/gen_code_intelligence_packet.py builds fixture, mines, generates docs/demo/code-intelligence-packet.{md,json} with 1.5k lines of exhibits. Tests (464 lines) validate normalization, known-answer queries, check-mode drift, and cleanup. Wired into /verify and CI lint job. Quality scorecard updated.'
992
+ archived_date: "2026-06-11"
993
+ done_summary: Code-intelligence packet generation script and comprehensive demo artifacts with full test coverage; wired into /verify and CI.
994
+ - key: WATCH-MACOS-FSEVENTS-RUNAWAY-GUARD
995
+ summary: Prevent broken macOS watch jobs from monitoring broad uninitialized roots and driving sustained FSEvents or Spotlight churn.
996
+ resolution: '2026-06-11: completed in pipeline run (delivered: Add macOS watch runaway guard: root validation in render_watch_schedule, ThrottleInterval in launchd plist, on-save SKIP_DIRS event pruning with pre-start warning, crash-loop signal in watch status, and operator recovery docs in README, artifacts: mempalace_code/watcher.py, mempalace_code/cli_commands/watch.py, tests/test_watcher.py (+1), verified: VER-1, VER-2, VER-3 (+12), phase_commit=2c2716f, final_commit=10ff04f, 24 files changed, 1371 insertions(+), 16 deletions(-))'
997
+ archived_date: "2026-06-11"
998
+ done_summary: 'completed in pipeline run (delivered: Add macOS watch runaway guard: root validation in render_watch_schedule, ThrottleInterval in launchd plist, on-save SKIP_DIRS event pruning with pre-start warning, crash-loop signal in watch status, and operator recovery docs in README, artifacts: mempalace_code/watcher.py, mempalace_code/cli_commands/watch.py, tests/test_watcher.py (+1), verified: VER-1, VER-2, VER-3 (+12), phase_commit=2c2716f, final_commit=10ff04f, 24 files changed, 1371 insertions(+), 16 deletions(-))'
999
+ - key: STORE-HF-CACHED-SEARCH-SUBPROCESS-GUARD
1000
+ summary: Add subprocess-level guard that cached model search/fetch never emits HuggingFace token warnings or performs network metadata calls after setup.
1001
+ resolution: '2026-06-11: completed in pipeline run (delivered: Add subprocess-level offline guards in tests/test_offline.py: four non-network tests spawn real CLI subprocesses with fake sentence_transformers/huggingface_hub and a socket blocker via PYTHONPATH, proving cached fetch-model and search use only local_files_only model resolution and emit no HF token-warning output., artifacts: tests/test_offline.py, verified: VER-1, VER-2, VER-3 (+5))'
1002
+ archived_date: "2026-06-11"
1003
+ done_summary: 'completed in pipeline run (delivered: Add subprocess-level offline guards in tests/test_offline.py: four non-network tests spawn real CLI subprocesses with fake sentence_transformers/huggingface_hub and a socket blocker via PYTHONPATH, proving cached fetch-model and search use only local_files_only model resolution and emit no HF token-warning output., artifacts: tests/test_offline.py, verified: VER-1, VER-2, VER-3 (+5))'
1004
+ - key: DEPENDENCY-SECURITY-UPGRADE-GATE
1005
+ summary: Add a repeatable audited dependency-upgrade gate before raising package ceilings or refreshing the lock.
1006
+ resolution: '2026-06-11: completed in pipeline run (delivered: Add dependency_upgrade_gate.py (audit/verify-report/ci-check), 17 focused tests, DEPENDENCY_UPGRADE_GATE.md documentation, CI gate step in Tests workflow with fetch-depth:0 and base-ref expressions, and regenerated quality scorecard., artifacts: scripts/dependency_upgrade_gate.py, tests/test_dependency_upgrade_gate.py, docs/DEPENDENCY_UPGRADE_GATE.md (+3), verified: VER-1, VER-2, VER-3 (+11), phase_commit=a6e7b12, final_commit=52035df, 23 files changed, 4452 insertions(+), 45 deletions(-))'
1007
+ archived_date: "2026-06-11"
1008
+ done_summary: 'completed in pipeline run (delivered: Add dependency_upgrade_gate.py (audit/verify-report/ci-check), 17 focused tests, DEPENDENCY_UPGRADE_GATE.md documentation, CI gate step in Tests workflow with fetch-depth:0 and base-ref expressions, and regenerated quality scorecard., artifacts: scripts/dependency_upgrade_gate.py, tests/test_dependency_upgrade_gate.py, docs/DEPENDENCY_UPGRADE_GATE.md (+3), verified: VER-1, VER-2, VER-3 (+11), phase_commit=a6e7b12, final_commit=52035df, 23 files changed, 4452 insertions(+), 45 deletions(-))'
1009
+ - key: DEPENDENCY-SCHEDULED-AUDIT-CI
1010
+ summary: Add a scheduled dependency audit workflow that checks current resolved packages without changing bounds.
1011
+ resolution: '2026-06-11: completed in pipeline run (delivered: Add current-audit subcommand to dependency_upgrade_gate.py, weekly scheduled workflow, allowlist file, updated docs, and 8 focused acceptance tests., artifacts: scripts/dependency_upgrade_gate.py, tests/test_dependency_upgrade_gate.py, .github/workflows/dependency-audit.yml (+4), verified: VER-1, VER-2, VER-3 (+11), phase_commit=9f8e737, final_commit=5816c9b, 24 files changed, 3528 insertions(+), 6 deletions(-))'
1012
+ archived_date: "2026-06-11"
1013
+ done_summary: 'completed in pipeline run (delivered: Add current-audit subcommand to dependency_upgrade_gate.py, weekly scheduled workflow, allowlist file, updated docs, and 8 focused acceptance tests., artifacts: scripts/dependency_upgrade_gate.py, tests/test_dependency_upgrade_gate.py, .github/workflows/dependency-audit.yml (+4), verified: VER-1, VER-2, VER-3 (+11), phase_commit=9f8e737, final_commit=5816c9b, 24 files changed, 3528 insertions(+), 6 deletions(-))'
1014
+ - key: RELEASE-PUBLICATION-STATUS-GATE
1015
+ summary: Add a release-status verification gate that checks every public publication surface before calling a release shipped.
1016
+ resolution: '2026-06-11: completed in pipeline run (delivered: Add scripts/release_status_gate.py (stdlib-only, 6-surface gate), 8 mocked tests covering AC-1 through AC-5, updated release skill (Step 6 now calls the gate), and regenerated quality scorecard., artifacts: scripts/release_status_gate.py, tests/test_release_status_gate.py, .claude/skills/release/SKILL.md (+2), verified: VER-1, VER-2, VER-3 (+9), phase_commit=404491c, final_commit=5b3231a, 23 files changed, 3567 insertions(+), 20 deletions(-))'
1017
+ archived_date: "2026-06-11"
1018
+ done_summary: 'completed in pipeline run (delivered: Add scripts/release_status_gate.py (stdlib-only, 6-surface gate), 8 mocked tests covering AC-1 through AC-5, updated release skill (Step 6 now calls the gate), and regenerated quality scorecard., artifacts: scripts/release_status_gate.py, tests/test_release_status_gate.py, .claude/skills/release/SKILL.md (+2), verified: VER-1, VER-2, VER-3 (+9), phase_commit=404491c, final_commit=5b3231a, 23 files changed, 3567 insertions(+), 20 deletions(-))'
1019
+ - key: AUTOPILOT-DEMO-CODE-INTELLIGENCE-PACKET-ACCEPTANCE-FIX
1020
+ summary: Close owner-acceptance blockers on the code-intelligence golden packet without broadening into new demo, docs-drift, or repo-wide public-safety work.
1021
+ resolution: '2026-06-11: completed in pipeline run (delivered: Add owner-acceptance checklist to packet generator/artifacts, fix B905 zip strictness, encode scanner-flagged token literal, relocate audit evidence to public-safe path, replace fallback golden-packet plan with durable plan., artifacts: scripts/gen_code_intelligence_packet.py, tests/test_code_intelligence_packet.py, docs/demo/code-intelligence-packet.json (+6), verified: VER-1, VER-3, VER-4 (+12), phase_commit=680870f, final_commit=99bff31, 23 files changed, 1492 insertions(+), 84 deletions(-))'
1022
+ archived_date: "2026-06-11"
1023
+ done_summary: 'completed in pipeline run (delivered: Add owner-acceptance checklist to packet generator/artifacts, fix B905 zip strictness, encode scanner-flagged token literal, relocate audit evidence to public-safe path, replace fallback golden-packet plan with durable plan., artifacts: scripts/gen_code_intelligence_packet.py, tests/test_code_intelligence_packet.py, docs/demo/code-intelligence-packet.json (+6), verified: VER-1, VER-3, VER-4 (+12), phase_commit=680870f, final_commit=99bff31, 23 files changed, 1492 insertions(+), 84 deletions(-))'
1024
+ - key: WATCH-RUN-READINESS-DIAGNOSTICS
1025
+ summary: Make watch-daemon startup state easy to distinguish from stale appended log failures after disk-budget recovery.
1026
+ resolution: '2026-06-16: completed in pipeline run (delivered: Add WATCH_RUN startup state markers to watch_and_mine/watch_all, update _optimize_once to return outcome, add TestWatchRunReadinessDiagnostics tests, and document health check workflow in README.md and docs/BACKUP_RESTORE.md, artifacts: mempalace_code/watcher.py, tests/test_watcher.py, README.md (+1), verified: VER-1, VER-2, VER-3 (+9), follow-ups: WATCH-ALL-BACKUP-FAIL-TEST, phase_commit=1b9b3e5, final_commit=936ae57, 8 files changed, 267 insertions(+), 15 deletions(-))'
1027
+ archived_date: "2026-06-16"
1028
+ done_summary: 'completed in pipeline run (delivered: Add WATCH_RUN startup state markers to watch_and_mine/watch_all, update _optimize_once to return outcome, add TestWatchRunReadinessDiagnostics tests, and document health check workflow in README.md and docs/BACKUP_RESTORE.md, artifacts: mempalace_code/watcher.py, tests/test_watcher.py, README.md (+1), verified: VER-1, VER-2, VER-3 (+9), follow-ups: WATCH-ALL-BACKUP-FAIL-TEST, phase_commit=1b9b3e5, final_commit=936ae57, 8 files changed, 267 insertions(+), 15 deletions(-))'
@@ -47,99 +47,28 @@ sections:
47
47
  # OPEN ITEMS
48
48
  # ============================================================
49
49
  items:
50
- - key: STORE-HF-CACHED-SEARCH-SUBPROCESS-GUARD
51
- section: quality
52
- status: open
53
- priority: P2
54
- summary: Add subprocess-level guard that cached model search/fetch never emits HuggingFace token warnings or performs network metadata calls after setup.
55
- acceptance:
56
- - Run a real CLI subprocess with a preseeded HuggingFace cache and network/socket access blocked or mocked.
57
- - Assert `mempalace-code search` exits successfully without `HF_TOKEN`, `unauthenticated`, `huggingface.co`, or retry noise on stdout/stderr.
58
- - Assert repeated `mempalace-code fetch-model` on a cached model uses local-only resolution and does not perform Hub metadata requests.
59
- - Keep the existing network-marked download tests separate from this no-network regression guard.
60
- - key: DEPENDENCY-SECURITY-UPGRADE-GATE
61
- section: quality
62
- status: open
63
- priority: P1
64
- summary: Add a repeatable audited dependency-upgrade gate before raising package ceilings or refreshing the lock.
65
- acceptance:
66
- - Enumerate current and target versions for direct runtime, dev, and optional dependencies from package metadata before changing bounds.
67
- - Query OSV or an equivalent advisory source for both current and target direct dependency versions; block target ranges that are compromised or currently affected.
68
- - Run pip-audit or an equivalent resolver-level audit on fresh environments for the default install and every optional extra whose bounds change.
69
- - Keep deprecated optional backends capped away from affected ranges; do not raise ChromaDB to 1.x while GHSA-f4j7-r4q5-qw2c affects the available 1.x line.
70
- - Update uv.lock only after the audited resolver passes, then run hosted-CI-equivalent tests in a clean pip environment so stale local locks cannot hide dependency drift.
71
- - key: DEPENDENCY-SCHEDULED-AUDIT-CI
50
+ - key: BENCHMARK-FIXTURE-FRESHNESS-FACTS
72
51
  section: quality
73
52
  status: open
74
53
  priority: P1
75
- summary: Add a scheduled dependency audit workflow that checks current resolved packages without changing bounds.
76
- acceptance:
77
- - Add a GitHub Actions workflow on `schedule` and `workflow_dispatch` that installs the default package and every optional extra in fresh environments.
78
- - Run `pip-audit` or an equivalent resolver-level audit for default, `[dev]`, `[treesitter]`, `[spellcheck]`, and `[chroma]` installs.
79
- - Query OSV or an equivalent advisory source for direct dependency versions including `lancedb`, `sentence-transformers`, `pyyaml`, `packaging`, `chromadb`, and tree-sitter packages.
80
- - Treat known accepted risks as explicit allowlist entries with advisory ID, package, affected range, reason, and expiry date.
81
- - Publish only package names, versions, advisory IDs, and remediation notes; never include private resolver caches, machine paths, or credentials.
82
- - Open or update a backlog item when an advisory appears, a package becomes yanked, or a previously safe target range becomes affected.
83
- - key: RELEASE-PUBLICATION-STATUS-GATE
54
+ summary: Refresh benchmark baselines and publish compact fixture facts so public savings claims do not depend on stale repo size numbers.
55
+ acceptance:
56
+ - Run the token-savings benchmark against the current canonical large-repo fixture and record commit/ref, tracked file count, mined drawer count, supported-language count, median/average/peak savings, and retrieval precision.
57
+ - Update public benchmark docs and marketing-safe snippets to use the measured fixture facts instead of the older 19k-chunk wording.
58
+ - Add a small benchmark metadata file or script output that prints fixture facts alongside results so future reruns cannot omit repo size, language coverage, or precision.
59
+ - Add a freshness guard that warns when fixture drawer count or tracked file count drifts materially from the documented baseline.
60
+ - Keep the published facts concise and non-private; do not include customer repo names, private remotes, machine paths, or incident history.
61
+ - key: VERSION-INSTALL-METADATA-CONSISTENCY
84
62
  section: quality
85
63
  status: open
86
- priority: P1
87
- summary: Add a release-status verification gate that checks every public publication surface before calling a release shipped.
88
- acceptance:
89
- - Add a script or documented command that takes an expected version and checks tag existence, tag workflow status, GitHub Release presence, PyPI version visibility, and clean install smoke from PyPI.
90
- - Verify `publish/main`, the version tag, GitHub Actions tag publish run, GitHub Releases, and PyPI JSON/API state as separate facts with separate pass/fail rows.
91
- - Fail if branch tests pass but tag publish, release creation, or PyPI visibility is missing or red.
92
- - Keep output public-safe: no private remote URLs, tokens, local paths, hostnames, or non-public incident notes.
93
- - Wire the command into the `/release` skill/runbook and require it before release completion summaries.
94
- - Add tests for parsing mocked GitHub/PyPI responses and for partial-success states such as "tests green, PyPI missing".
95
- - key: AUTOPILOT-DEMO-QUALITY-SCORECARD
96
- section: autopilot_demo
97
- status: done
98
- priority: P1
99
- summary: Add a deterministic public quality scorecard that makes Autopilot cleanup progress visible across releases.
100
- acceptance:
101
- - Add a script or command that emits markdown and JSON metrics for code size, largest modules, Ruff ignore counts, Pyright mode, unreasoned suppressions, test count, and available smoke suites.
102
- - Generate any raw baseline evidence under local ignored docs/audits/, then commit only a sanitized public summary with public repo data and relative paths.
103
- - Document how each Autopilot demo task updates the scorecard with before/after metrics.
104
- - CI or `/verify` runs the scorecard command and fails on malformed output.
105
- resolution: "2026-06-05: Deterministic public scorecard: scripts/quality_scorecard.py emits Markdown+JSON; --check gates shape/determinism/public-safety in CI lint job and /verify; baseline committed to docs/quality/; update workflow in docs/quality/README.md"
106
- done_summary: "Deterministic public scorecard: scripts/quality_scorecard.py emits Markdown+JSON; --check gates shape/determinism/public-safety in CI lint job and /verify; baseline committed to docs/quality/; update workflow in docs/quality/README.md"
107
- - key: AUTOPILOT-DEMO-PUBLIC-SAFETY-GATE
108
- section: autopilot_demo
109
- status: done
110
- priority: P1
111
- summary: Add a repo-wide public-safety gate for tracked and staged files.
112
- acceptance:
113
- - Add a stdlib scanner that checks tracked worktree files and staged index blobs.
114
- - Block secret-like tokens, real local machine paths, and local-only artifact paths without printing the matched secret text.
115
- - Wire the scanner into CI and `/verify`.
116
- - Remove or ignore any local-only artifact that is already tracked.
117
- resolution: "2026-06-06: Added scripts/public_safety_scan.py --tracked --staged, CI and /verify wiring, focused tests, and removed tracked .verify-state while adding it to .gitignore."
118
- done_summary: "Repo-wide public-safety scan now gates tracked/staged files and redacts matched content; .verify-state is local-only."
119
- - key: AUTOPILOT-DEMO-RUFF-RATCHET
120
- section: autopilot_demo
121
- status: done
122
- priority: P1
123
- summary: Reduce transitional Ruff ignores in a measurable ratchet without broad style-only churn.
124
- acceptance:
125
- - Record baseline counts for global ignores, per-file ignores, and inline suppressions before edits.
126
- - Remove at least one global ignore family or reduce per-file ignore entries by at least 25% for a focused module group.
127
- - Replace any necessary inline suppressions with reasoned, narrow suppressions; no new blanket `noqa` entries.
128
- - "`ruff check`, `ruff format --check`, Pyright, and the relevant focused tests pass; update the quality scorecard."
129
- resolution: "2026-06-06: Reduced global Ruff ignores from 33 to 3 by keeping existing package/test debt scoped to per-file ignores and making new scripts inherit the stricter rule set."
130
- done_summary: "Ruff global ignore ratchet: broad historical ignores are now scoped away from scripts; no new inline suppressions."
131
- - key: AUTOPILOT-DEMO-PYRIGHT-STRICT-SLICE
132
- section: autopilot_demo
133
- status: done
134
- priority: P1
135
- summary: Establish a strict Pyright slice for stable low-level modules and expand it gradually.
64
+ priority: P2
65
+ summary: Add a release/install smoke that catches mismatches between package metadata, `mempalace_code.__version__`, and the CLI version-check output.
136
66
  acceptance:
137
- - Add a strict typecheck config or command for a small stable slice such as config, reader, MCP tool profiles, and mining scanner.
138
- - Replace ad hoc `Any` and broad dictionaries in that slice with typed contracts where the code owns the boundary.
139
- - Keep compatibility shims and third-party stub gaps outside the first strict slice unless they can be fixed narrowly.
140
- - CI or `/verify` runs both the existing basic Pyright check and the strict-slice check; update the quality scorecard.
141
- resolution: "2026-06-06: Added pyrightconfig.strict.json for version.py, mcp_tool_profiles.py, and disk_budget.py; annotated disk_budget.py enough to pass strict; wired strict slice into CI and /verify."
142
- done_summary: "Initial strict Pyright slice gates three stable low-level modules in CI and /verify."
67
+ - In a fresh isolated install, assert `importlib.metadata.version("mempalace-code")`, `mempalace_code.__version__`, and `mempalace-code version-check --status` report the same version.
68
+ - Include pipx or uv-tool style invocation coverage if practical, because operator installs commonly use those surfaces.
69
+ - Fail with a clear diagnostic that names the disagreeing surfaces and recommended reinstall command without exposing private paths.
70
+ - Wire the smoke into release verification or the release-status gate, not the whole fast unit suite unless it stays cheap.
71
+ - Add a local troubleshooting note for stale tool environments where installed metadata and module source disagree.
143
72
  - key: AUTOPILOT-DEMO-PYRIGHT-STRICT-SLICE-EXPANSION
144
73
  section: autopilot_demo
145
74
  status: open
@@ -163,18 +92,6 @@ items:
163
92
  - Add tests proving deleted local-only files do not trigger tracked worktree failures, while committed local-only paths still fail.
164
93
  - Wire committed-tree mode into release verification docs or `/release`, not into every edit-time `/verify` run unless it remains fast.
165
94
  - Ensure all failure output remains redacted to rule id and file position only.
166
- - key: AUTOPILOT-DEMO-WORKFLOW-REVIEW-PROTOCOL
167
- section: autopilot_demo
168
- status: done
169
- priority: P1
170
- summary: Document the public-safe adversarial Claude workflow protocol for repo quality work.
171
- acceptance:
172
- - Define review lenses, skeptical refutation, synthesis, implementation, and verification steps.
173
- - Separate publishable summaries from local-only raw workflow artifacts.
174
- - Link the protocol from quality docs.
175
- - Include the canonical quality verification commands.
176
- resolution: "2026-06-06: Added docs/quality/workflow-review-protocol.md and linked it from docs/quality/README.md."
177
- done_summary: "Public-safe multi-agent workflow review protocol is documented for future quality improvements."
178
95
  - key: AUTOPILOT-DEMO-ARCHITECTURE-GUARD
179
96
  section: autopilot_demo
180
97
  status: open
@@ -269,3 +186,11 @@ items:
269
186
  - Keep raw multi-agent transcripts local-only under ignored paths; commit only the synthesized public summary when needed.
270
187
  - Document that passive review output is not enough: each surviving finding must either change code/tests/docs or become a backlog item with acceptance criteria.
271
188
  - Add tests for accepted summaries, missing evidence, missing action, and accidental private path/token content.
189
+ - key: WATCH-ALL-BACKUP-FAIL-TEST
190
+ summary: "Add test for watch_all pre-watch-backup-failed state path"
191
+ type: task
192
+ status: open
193
+ priority: low
194
+ size: XS
195
+ section_id: quality
196
+ description: "## Problem\nThe `pre-watch-backup-failed` WATCH_RUN state is emitted in `watch_all` (watcher.py:787) on the same code path as `watch_and_mine`, but only `watch_and_mine` has a dedicated test (`test_pre_watch_backup_failure_emits_failed_state_for_same_run`). A regression in the `watch_all` backup-gate branch would go undetected.\n\n## Deliverable\nAdd a `TestWatchRunReadinessDiagnostics` test case that patches `create_backup` to raise in a `watch_all` call with existing lance data, asserts `state=pre-watch-backup-failed` is emitted on the same `run_id`, and asserts `state=watch-ready` is absent.\n\n## Constraints\n- Must use the same mock pattern as the existing AC-2 test.\n- Must not change production code.\n\n## Acceptance criteria\n\npython -m pytest tests/test_watcher.py::TestWatchRunReadinessDiagnostics::test_watch_all_backup_failure_emits_failed_state -q passes\n\n## Scope\n\npython -m pytest tests/test_watcher.py::TestWatchRunReadinessDiagnostics::test_watch_all_backup_failure_emits_failed_state -q passes\n\n## Evidence\n\n- docs/audits/WATCH-RUN-READINESS-DIAGNOSTICS-round-1.md\n- Source task: WATCH-RUN-READINESS-DIAGNOSTICS"