memleaf 0.2.92__tar.gz → 0.2.93__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 (186) hide show
  1. {memleaf-0.2.92 → memleaf-0.2.93}/CHANGELOG.md +18 -0
  2. {memleaf-0.2.92/src/memleaf.egg-info → memleaf-0.2.93}/PKG-INFO +2 -2
  3. {memleaf-0.2.92 → memleaf-0.2.93}/README.en.md +1 -1
  4. {memleaf-0.2.92 → memleaf-0.2.93}/README.md +1 -1
  5. {memleaf-0.2.92 → memleaf-0.2.93}/docs/body-compaction.md +10 -3
  6. {memleaf-0.2.92 → memleaf-0.2.93}/pyproject.toml +1 -1
  7. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/__init__.py +1 -1
  8. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/compaction.py +5 -2
  9. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/hermes_provider/plugin.yaml +1 -1
  10. {memleaf-0.2.92 → memleaf-0.2.93/src/memleaf.egg-info}/PKG-INFO +2 -2
  11. {memleaf-0.2.92 → memleaf-0.2.93}/LICENSE +0 -0
  12. {memleaf-0.2.92 → memleaf-0.2.93}/MANIFEST.in +0 -0
  13. {memleaf-0.2.92 → memleaf-0.2.93}/docs/acceptance-evidence-guide.md +0 -0
  14. {memleaf-0.2.92 → memleaf-0.2.93}/docs/automatic-processing-route.md +0 -0
  15. {memleaf-0.2.92 → memleaf-0.2.93}/docs/candidate-reconciliation.md +0 -0
  16. {memleaf-0.2.92 → memleaf-0.2.93}/docs/capture-budget-design.md +0 -0
  17. {memleaf-0.2.92 → memleaf-0.2.93}/docs/config-migrations.md +0 -0
  18. {memleaf-0.2.92 → memleaf-0.2.93}/docs/core-refactor.md +0 -0
  19. {memleaf-0.2.92 → memleaf-0.2.93}/docs/development-closeout.md +0 -0
  20. {memleaf-0.2.92 → memleaf-0.2.93}/docs/evidence-retention.md +0 -0
  21. {memleaf-0.2.92 → memleaf-0.2.93}/docs/explicit-memory-update.md +0 -0
  22. {memleaf-0.2.92 → memleaf-0.2.93}/docs/extraction-latency.md +0 -0
  23. {memleaf-0.2.92 → memleaf-0.2.93}/docs/failed-run-recovery.md +0 -0
  24. {memleaf-0.2.92 → memleaf-0.2.93}/docs/gate-evidence-boundary.md +0 -0
  25. {memleaf-0.2.92 → memleaf-0.2.93}/docs/general-processing.md +0 -0
  26. {memleaf-0.2.92 → memleaf-0.2.93}/docs/hermes-mcp-runtime.md +0 -0
  27. {memleaf-0.2.92 → memleaf-0.2.93}/docs/hermes-provider-compatibility.md +0 -0
  28. {memleaf-0.2.92 → memleaf-0.2.93}/docs/hermes-source-comparison-context.md +0 -0
  29. {memleaf-0.2.92 → memleaf-0.2.93}/docs/host-acceptance-runbook.md +0 -0
  30. {memleaf-0.2.92 → memleaf-0.2.93}/docs/immutable-release-assets.md +0 -0
  31. {memleaf-0.2.92 → memleaf-0.2.93}/docs/incremental-commit-contract.md +0 -0
  32. {memleaf-0.2.92 → memleaf-0.2.93}/docs/incremental-execution.md +0 -0
  33. {memleaf-0.2.92 → memleaf-0.2.93}/docs/incremental-native-comparison.md +0 -0
  34. {memleaf-0.2.92 → memleaf-0.2.93}/docs/incremental-partial-recovery.md +0 -0
  35. {memleaf-0.2.92 → memleaf-0.2.93}/docs/incremental-planner-preview.md +0 -0
  36. {memleaf-0.2.92 → memleaf-0.2.93}/docs/incremental-runtime-contract.md +0 -0
  37. {memleaf-0.2.92 → memleaf-0.2.93}/docs/incremental-scope-registration.md +0 -0
  38. {memleaf-0.2.92 → memleaf-0.2.93}/docs/incremental-selected-retention.md +0 -0
  39. {memleaf-0.2.92 → memleaf-0.2.93}/docs/installed-artifact-verification.md +0 -0
  40. {memleaf-0.2.92 → memleaf-0.2.93}/docs/memory-lifecycle-tools.md +0 -0
  41. {memleaf-0.2.92 → memleaf-0.2.93}/docs/memory-state-contract.md +0 -0
  42. {memleaf-0.2.92 → memleaf-0.2.93}/docs/migration-preflight.md +0 -0
  43. {memleaf-0.2.92 → memleaf-0.2.93}/docs/processing-quality-acceptance.md +0 -0
  44. {memleaf-0.2.92 → memleaf-0.2.93}/docs/public-query-integrity.md +0 -0
  45. {memleaf-0.2.92 → memleaf-0.2.93}/docs/query-performance.md +0 -0
  46. {memleaf-0.2.92 → memleaf-0.2.93}/docs/remember-incremental-route.md +0 -0
  47. {memleaf-0.2.92 → memleaf-0.2.93}/docs/runtime-state-retention.md +0 -0
  48. {memleaf-0.2.92 → memleaf-0.2.93}/docs/semantic-extraction-protocol.md +0 -0
  49. {memleaf-0.2.92 → memleaf-0.2.93}/docs/source-work-contract.md +0 -0
  50. {memleaf-0.2.92 → memleaf-0.2.93}/docs/v0.2.26-processing-status.md +0 -0
  51. {memleaf-0.2.92 → memleaf-0.2.93}/examples/README.md +0 -0
  52. {memleaf-0.2.92 → memleaf-0.2.93}/examples/basic_usage.py +0 -0
  53. {memleaf-0.2.92 → memleaf-0.2.93}/examples/incremental_acceptance.json +0 -0
  54. {memleaf-0.2.92 → memleaf-0.2.93}/examples/mcp_stdio.ndjson +0 -0
  55. {memleaf-0.2.92 → memleaf-0.2.93}/examples/query_benchmark.py +0 -0
  56. {memleaf-0.2.92 → memleaf-0.2.93}/install.ps1 +0 -0
  57. {memleaf-0.2.92 → memleaf-0.2.93}/install.sh +0 -0
  58. {memleaf-0.2.92 → memleaf-0.2.93}/setup.cfg +0 -0
  59. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/__main__.py +0 -0
  60. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/acceptance.py +0 -0
  61. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/adapters/__init__.py +0 -0
  62. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/adapters/antigravity.py +0 -0
  63. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/adapters/base.py +0 -0
  64. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/adapters/codex.py +0 -0
  65. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/adapters/hermes.py +0 -0
  66. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/admission.py +0 -0
  67. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/batch_review.py +0 -0
  68. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/budget.py +0 -0
  69. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/capture.py +0 -0
  70. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/cli.py +0 -0
  71. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/config.py +0 -0
  72. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/create_coordinator.py +0 -0
  73. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/credentials.py +0 -0
  74. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/evidence_budget.py +0 -0
  75. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/evidence_policy.py +0 -0
  76. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/evidence_structure.py +0 -0
  77. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/evidence_syntax.py +0 -0
  78. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/explicit_text_source.py +0 -0
  79. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/extraction_budget.py +0 -0
  80. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/extraction_capability.py +0 -0
  81. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/extraction_work_state.py +0 -0
  82. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/frontmatter.py +0 -0
  83. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/hermes_provider/README.md +0 -0
  84. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/hermes_provider/__init__.py +0 -0
  85. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/hermes_provider/_mcp_client.py +0 -0
  86. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/hermes_provider/_provider.py +0 -0
  87. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/hermes_provider/_shared.py +0 -0
  88. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/hermes_provider/evidence_budget.py +0 -0
  89. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/hermes_provider/provider_compatibility.py +0 -0
  90. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/hermes_runtime.py +0 -0
  91. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/historical_context.py +0 -0
  92. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/host_events.py +0 -0
  93. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/host_retention.py +0 -0
  94. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/host_runtime.py +0 -0
  95. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/host_turn_identity.py +0 -0
  96. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/inbox.py +0 -0
  97. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/incremental_commit.py +0 -0
  98. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/incremental_dates.py +0 -0
  99. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/incremental_execution.py +0 -0
  100. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/incremental_explicit.py +0 -0
  101. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/incremental_failed_recovery.py +0 -0
  102. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/incremental_journal.py +0 -0
  103. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/incremental_merge.py +0 -0
  104. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/incremental_native.py +0 -0
  105. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/incremental_partial.py +0 -0
  106. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/incremental_preview.py +0 -0
  107. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/incremental_prompts.py +0 -0
  108. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/incremental_protocol.py +0 -0
  109. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/incremental_recovery.py +0 -0
  110. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/incremental_run_state.py +0 -0
  111. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/incremental_runtime.py +0 -0
  112. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/incremental_scopes.py +0 -0
  113. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/incremental_selection.py +0 -0
  114. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/incremental_semantics.py +0 -0
  115. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/index.py +0 -0
  116. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/inspection.py +0 -0
  117. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/installer.py +0 -0
  118. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/legacy_update_journal.py +0 -0
  119. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/lifecycle_maintenance.py +0 -0
  120. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/llm/__init__.py +0 -0
  121. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/llm/base.py +0 -0
  122. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/llm/claude_compatible.py +0 -0
  123. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/llm/gemini.py +0 -0
  124. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/llm/openai_compatible.py +0 -0
  125. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/llm/router.py +0 -0
  126. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/llm/thinking.py +0 -0
  127. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/locking.py +0 -0
  128. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/mcp_server.py +0 -0
  129. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/memory_commit.py +0 -0
  130. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/memory_planner.py +0 -0
  131. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/memory_retraction.py +0 -0
  132. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/memory_update.py +0 -0
  133. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/memory_writer.py +0 -0
  134. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/migration.py +0 -0
  135. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/model_capabilities.py +0 -0
  136. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/model_discovery.py +0 -0
  137. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/model_execution.py +0 -0
  138. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/models.py +0 -0
  139. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/native_index.py +0 -0
  140. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/native_registration.py +0 -0
  141. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/parallel_model.py +0 -0
  142. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/planning_candidates.py +0 -0
  143. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/planning_context.py +0 -0
  144. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/process_common.py +0 -0
  145. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/process_jobs.py +0 -0
  146. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/process_journal.py +0 -0
  147. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/process_owner.py +0 -0
  148. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/processing.py +0 -0
  149. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/processing_route.py +0 -0
  150. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/prompts.py +0 -0
  151. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/provenance.py +0 -0
  152. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/provider_compatibility.py +0 -0
  153. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/query_clock.py +0 -0
  154. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/query_progress.py +0 -0
  155. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/query_scan.py +0 -0
  156. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/receipt_codec.py +0 -0
  157. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/recording_policy.py +0 -0
  158. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/redaction.py +0 -0
  159. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/remember_route.py +0 -0
  160. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/retention.py +0 -0
  161. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/retrieval.py +0 -0
  162. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/retrieval_gate.py +0 -0
  163. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/retrieval_lifecycle.py +0 -0
  164. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/runtime_retention.py +0 -0
  165. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/scope_maintenance.py +0 -0
  166. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/scope_state.py +0 -0
  167. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/semantic_maintenance.py +0 -0
  168. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/semantic_protocol.py +0 -0
  169. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/service.py +0 -0
  170. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/single_pass_memory_planner.py +0 -0
  171. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/single_pass_plan.py +0 -0
  172. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/source_policy.py +0 -0
  173. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/state_layout.py +0 -0
  174. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/subprocess_flags.py +0 -0
  175. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/summary_batch.py +0 -0
  176. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/target_reconciliation.py +0 -0
  177. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/turn_audit.py +0 -0
  178. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/turn_plan.py +0 -0
  179. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/update_coordinator.py +0 -0
  180. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/update_review.py +0 -0
  181. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/validation.py +0 -0
  182. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf/vault.py +0 -0
  183. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf.egg-info/SOURCES.txt +0 -0
  184. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf.egg-info/dependency_links.txt +0 -0
  185. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf.egg-info/entry_points.txt +0 -0
  186. {memleaf-0.2.92 → memleaf-0.2.93}/src/memleaf.egg-info/top_level.txt +0 -0
@@ -5,6 +5,24 @@ All notable changes to memleaf are documented here.
5
5
  ## Unreleased
6
6
 
7
7
 
8
+ ## 0.2.93 — 2026-10-05
9
+
10
+ ### Keep useful body compaction when another candidate has no net savings
11
+
12
+ - Skip each valid compaction proposal that does not reduce both the content
13
+ estimate and stored record bytes, including maintenance metadata. Other safe
14
+ proposals in the same response can still commit; all-no-gain batches return
15
+ noop without writing history or a compaction journal.
16
+ - Keep strict whole-response validation, protected metadata, selected-source
17
+ snapshot checks and transactional recovery. Invalid identities, duplicate rows,
18
+ multi-ID merges and extra business fields still reject the batch.
19
+ - Add no model request or retry. Automatic maintenance keeps its existing
20
+ durable budget and input deduplication, including across restarts.
21
+ - Validation: 58 focused regressions and 12 isolated replays of saved real
22
+ DeepSeek responses passed. The original mixed-gain case now shortens its useful
23
+ record while keeping the other file byte-for-byte unchanged. Replays made no
24
+ external model calls; they are not a new live-model run.
25
+
8
26
  ## 0.2.92 — 2026-10-05
9
27
 
10
28
  ### Preserve unresolved review outcomes and schedule bounded lifecycle maintenance
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: memleaf
3
- Version: 0.2.92
3
+ Version: 0.2.93
4
4
  Summary: A local-first Markdown memory core for AI agents
5
5
  Author: memleaf contributors
6
6
  License-Expression: MIT
@@ -23,7 +23,7 @@ Dynamic: license-file
23
23
 
24
24
  [English](README.en.md) · [PyPI](https://pypi.org/project/memleaf/) · [GitHub](https://github.com/miffyblueboo/memleaf)
25
25
 
26
- > **版本:0.2.92。**
26
+ > **版本:0.2.93。**
27
27
  > 自动提炼和复核共用同一条“未来记忆价值”标准:模型综合未来复用、信息增量、再次读取时的直接可用性和忘记成本,只保留对未来理解、判断或行动有实质影响的最小核心;没有明确价值的信息不提炼,不按具体业务场景硬编码排除。
28
28
  > 提炼先比较旧事项中的编号、目标、进展、责任和期限;补全未知信息也应维护原事项,另建独立待办不能替代项目事实更新。确认重复的记忆在现有处理请求中合并,保留历史与来源;项目和独立任务保持各自生命周期,Core 不按标题强行合并。
29
29
  > 新请求兼容等价的字段表示;未知执行人保持 `null`,新增或变更负责人和期限需要真实来源;等待条件在正文维护,不再提炼 `waiting_on`。行动及相关字段经过有界语义复核,提炼与复核共用每份工作的最多五次模型请求额度,成功即停止;复核失败不写入。来源时间用于解析相对日期,不补造事实日期。
@@ -4,7 +4,7 @@
4
4
 
5
5
  [中文](README.md) · [PyPI](https://pypi.org/project/memleaf/) · [GitHub](https://github.com/miffyblueboo/memleaf)
6
6
 
7
- > **Version: 0.2.92.**
7
+ > **Version: 0.2.93.**
8
8
  > Automatic extraction and review share one future-value standard: the model weighs likely reuse, information gain, direct usability when read again, and the cost of forgetting. It keeps only the smallest core that can materially help future understanding, decisions, or actions; information without clear value is not extracted, and no business-specific exclusion rule is hard-coded.
9
9
  > Extraction compares existing identifiers, objectives, progress, responsibility and deadlines first. Filling an unknown also maintains the original item; a separate task does not replace updating shared project facts. Confirmed duplicates can be merged in the existing processing requests with their sources and history preserved. Independent project and task lifecycles remain separate; Core does not merge matching titles.
10
10
  > New requests accept equivalent field representations. Unknown executors remain `null`; new or changed responsibility and deadlines require actual source evidence. Dependencies belong in the body; `waiting_on` is no longer extracted. Proposed actions and related fields undergo bounded semantic verification within a shared five-request limit per work item, stopping on success; failed verification blocks writes. Source time resolves relative dates without inventing factual dates.
@@ -4,7 +4,7 @@
4
4
 
5
5
  [English](README.en.md) · [PyPI](https://pypi.org/project/memleaf/) · [GitHub](https://github.com/miffyblueboo/memleaf)
6
6
 
7
- > **版本:0.2.92。**
7
+ > **版本:0.2.93。**
8
8
  > 自动提炼和复核共用同一条“未来记忆价值”标准:模型综合未来复用、信息增量、再次读取时的直接可用性和忘记成本,只保留对未来理解、判断或行动有实质影响的最小核心;没有明确价值的信息不提炼,不按具体业务场景硬编码排除。
9
9
  > 提炼先比较旧事项中的编号、目标、进展、责任和期限;补全未知信息也应维护原事项,另建独立待办不能替代项目事实更新。确认重复的记忆在现有处理请求中合并,保留历史与来源;项目和独立任务保持各自生命周期,Core 不按标题强行合并。
10
10
  > 新请求兼容等价的字段表示;未知执行人保持 `null`,新增或变更负责人和期限需要真实来源;等待条件在正文维护,不再提炼 `waiting_on`。行动及相关字段经过有界语义复核,提炼与复核共用每份工作的最多五次模型请求额度,成功即停止;复核失败不写入。来源时间用于解析相对日期,不补造事实日期。
@@ -7,8 +7,9 @@ extraction, a task-state update, or a multi-ID deduplication service.
7
7
  ## One existing entry, one narrower model job
8
8
 
9
9
  `service.compact(model=..., router=...)` keeps the existing explicit maintenance
10
- entry and threshold/low-priority candidate selection. Normal extraction still
11
- never invokes it on its return path. The configured threshold is a local storage
10
+ entry and threshold/low-priority candidate selection. Completed `process` and
11
+ `remember` calls can also schedule threshold-driven body maintenance within the
12
+ source turn's remaining request budget. The configured threshold is a local storage
12
13
  estimate, not a claim about a model's context capacity. No default route,
13
14
  package version, incremental prompt or automatic request allowance changes.
14
15
 
@@ -58,7 +59,13 @@ counts this invocation boundary, not independently observed provider billing or
58
59
  hidden transport retries within an externally supplied backend.
59
60
 
60
61
  The output must reduce both the existing content estimate and the actual stored
61
- record bytes. Results expose `record_bytes_before` and `record_bytes_after` for
62
+ record bytes, including new maintenance metadata. Each valid proposal with no
63
+ net savings is skipped independently; other safe proposals in the same response
64
+ can still be committed. If none have savings, the result is `noop` with no
65
+ history or journal writes. All rows are validated before applying this filter;
66
+ invalid structure, identities or protected fields still reject the batch.
67
+ Skipping a row does not trigger another model call. Results expose
68
+ `record_bytes_before` and `record_bytes_after` for
62
69
  changed records; these exclude the retained historical copy and are not total
63
70
  Vault-disk savings. `active_tokens_*` remain local estimates, not tokenizer or
64
71
  latency measurements. A more concise body is not proof of semantic equivalence:
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "memleaf"
7
- version = "0.2.92"
7
+ version = "0.2.93"
8
8
  description = "A local-first Markdown memory core for AI agents"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -1,6 +1,6 @@
1
1
  """Local-first Markdown memory core for AI agents."""
2
2
 
3
- __version__ = "0.2.92"
3
+ __version__ = "0.2.93"
4
4
 
5
5
  from .config import DEFAULT_CONFIG, default_config, load_config, save_config
6
6
  from .frontmatter import FrontmatterError, dump_frontmatter, dump_yaml, load_yaml, parse_frontmatter
@@ -546,10 +546,13 @@ class Compactor:
546
546
  if summary["body"] == source_candidates[0].memory.body:
547
547
  continue
548
548
  replacement = self._build_replacement(summary, source_candidates, now=now)
549
+ # A valid proposal without net savings is a per-record no-op.
550
+ # Include maintenance metadata in byte cost; other safe rows may
551
+ # still be useful. Protocol and snapshot errors remain batch errors.
549
552
  if len(replacement.raw.encode("utf-8")) >= len(source_candidates[0].raw.encode("utf-8")):
550
- raise CompactionError("compaction replacement does not reduce stored bytes")
553
+ continue
551
554
  if replacement.replacement_tokens >= replacement.source_tokens:
552
- raise CompactionError("compaction replacement is not smaller than its sources")
555
+ continue
553
556
  replacements.append(replacement)
554
557
  return replacements
555
558
 
@@ -1,5 +1,5 @@
1
1
  name: memleaf
2
- version: 0.2.92
2
+ version: 0.2.93
3
3
  description: "Hermes-native external MemoryProvider for local-first Markdown memory shared with the memleaf MCP server."
4
4
  hooks:
5
5
  - prefetch
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: memleaf
3
- Version: 0.2.92
3
+ Version: 0.2.93
4
4
  Summary: A local-first Markdown memory core for AI agents
5
5
  Author: memleaf contributors
6
6
  License-Expression: MIT
@@ -23,7 +23,7 @@ Dynamic: license-file
23
23
 
24
24
  [English](README.en.md) · [PyPI](https://pypi.org/project/memleaf/) · [GitHub](https://github.com/miffyblueboo/memleaf)
25
25
 
26
- > **版本:0.2.92。**
26
+ > **版本:0.2.93。**
27
27
  > 自动提炼和复核共用同一条“未来记忆价值”标准:模型综合未来复用、信息增量、再次读取时的直接可用性和忘记成本,只保留对未来理解、判断或行动有实质影响的最小核心;没有明确价值的信息不提炼,不按具体业务场景硬编码排除。
28
28
  > 提炼先比较旧事项中的编号、目标、进展、责任和期限;补全未知信息也应维护原事项,另建独立待办不能替代项目事实更新。确认重复的记忆在现有处理请求中合并,保留历史与来源;项目和独立任务保持各自生命周期,Core 不按标题强行合并。
29
29
  > 新请求兼容等价的字段表示;未知执行人保持 `null`,新增或变更负责人和期限需要真实来源;等待条件在正文维护,不再提炼 `waiting_on`。行动及相关字段经过有界语义复核,提炼与复核共用每份工作的最多五次模型请求额度,成功即停止;复核失败不写入。来源时间用于解析相对日期,不补造事实日期。
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes