AbstractMemory 0.4.0__tar.gz → 0.5.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 (311) hide show
  1. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/CHANGELOG.md +191 -0
  2. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/PKG-INFO +11 -2
  3. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/README.md +10 -1
  4. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/adr/0001-altered-memories-ripple.md +6 -1
  5. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/adr/0003-one-graph-ledger-provenance-and-revisions.md +14 -1
  6. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/adr/README.md +2 -2
  7. abstractmemory-0.5.0/docs/api.md +642 -0
  8. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/architecture.md +6 -2
  9. abstractmemory-0.5.0/docs/backlog/completed/knowledge_graph_convergence/0059_record_understanding_rewrites_in_place_with_versions.md +169 -0
  10. abstractmemory-0.5.0/docs/backlog/completed/knowledge_graph_convergence/0060_memory_task_queue.md +154 -0
  11. abstractmemory-0.5.0/docs/backlog/completed/knowledge_graph_convergence/0061_ripple_v1_over_the_task_queue.md +123 -0
  12. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/overview.md +79 -23
  13. abstractmemory-0.5.0/docs/backlog/planned/knowledge_graph_convergence/0053_self_organisation_communities_consolidation_reflection.md +69 -0
  14. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/planned/knowledge_graph_convergence/0054_ripple_propagation_and_activation.md +7 -1
  15. abstractmemory-0.5.0/docs/backlog/planned/knowledge_graph_convergence/0059_record_understanding_rewrites_in_place_with_versions.md +1 -0
  16. abstractmemory-0.5.0/docs/backlog/planned/knowledge_graph_convergence/0060_memory_task_queue.md +1 -0
  17. abstractmemory-0.5.0/docs/backlog/planned/knowledge_graph_convergence/0061_ripple_v1_over_the_task_queue.md +1 -0
  18. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/planned/knowledge_graph_convergence/README.md +24 -3
  19. abstractmemory-0.5.0/docs/backlog/proposed/0062_write_barrier_residual_windows.md +72 -0
  20. abstractmemory-0.5.0/docs/backlog/proposed/0064_community_facts_merged_into.md +55 -0
  21. abstractmemory-0.5.0/docs/backlog/proposed/0065_embed_missing_vector_generation_bump_batching.md +57 -0
  22. abstractmemory-0.5.0/docs/backlog/proposed/0066_placement_index_misses_dissolve_only_versions.md +51 -0
  23. abstractmemory-0.5.0/docs/backlog/proposed/0067_communities_read_is_not_one_snapshot.md +50 -0
  24. abstractmemory-0.5.0/docs/backlog/proposed/0068_api_doc_queue_less_list_omits_communities.md +41 -0
  25. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/proposed/ripple_wave/0001_change_records_and_ripple_primitives.md +6 -0
  26. abstractmemory-0.5.0/docs/backlog/proposed/ripple_wave/0063_ripple_v1_consumer_seam.md +60 -0
  27. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/faq.md +2 -1
  28. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/memory-system.md +30 -4
  29. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/operator.md +1 -1
  30. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/stores.md +2 -1
  31. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/troubleshooting.md +8 -0
  32. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/examples/entity_home_maintenance_proof.py +2 -2
  33. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/llms-full.txt +217 -31
  34. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/llms.txt +3 -1
  35. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/pyproject.toml +1 -1
  36. abstractmemory-0.5.0/release-notes.md +188 -0
  37. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/__init__.py +73 -1
  38. abstractmemory-0.5.0/src/abstractmemory/activation_gate.py +174 -0
  39. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/alive_drives.py +4 -2
  40. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/archive_import.py +5 -22
  41. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/candidate_miner.py +51 -14
  42. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/canonical_text.py +56 -18
  43. abstractmemory-0.5.0/src/abstractmemory/commit_guard.py +84 -0
  44. abstractmemory-0.5.0/src/abstractmemory/communities.py +1783 -0
  45. abstractmemory-0.5.0/src/abstractmemory/community_index.py +884 -0
  46. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/consolidation.py +45 -7
  47. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/diary.py +25 -1
  48. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/doctoring.py +73 -32
  49. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/dream_signals.py +6 -29
  50. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/engram.py +65 -17
  51. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/entity_card.py +68 -15
  52. abstractmemory-0.5.0/src/abstractmemory/formation_authoring.py +199 -0
  53. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/graph/graph.py +17 -8
  54. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/graph/lancedb_backend.py +6 -2
  55. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/identity_review.py +3 -1
  56. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/in_memory_store.py +81 -10
  57. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/journal.py +91 -2
  58. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/journal_memory.py +117 -7
  59. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/journal_sqlite.py +150 -48
  60. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/journal_sqlite_rows.py +52 -1
  61. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/lancedb_store.py +17 -3
  62. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/maintenance.py +87 -15
  63. abstractmemory-0.5.0/src/abstractmemory/memory_tasks.py +1494 -0
  64. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/probe.py +4 -4
  65. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/recall_reads.py +3 -1
  66. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/recent_records.py +2 -2
  67. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/records.py +129 -9
  68. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/redigestion.py +21 -1
  69. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/reembed.py +3 -2
  70. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/replay.py +160 -20
  71. abstractmemory-0.5.0/src/abstractmemory/ripple.py +561 -0
  72. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/seam.py +1 -1
  73. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/shelf.py +13 -9
  74. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/situate.py +2 -2
  75. abstractmemory-0.5.0/src/abstractmemory/sleep_cadence.py +687 -0
  76. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/sqlite_store.py +109 -35
  77. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/system.py +49 -3
  78. abstractmemory-0.5.0/src/abstractmemory/system_understanding.py +197 -0
  79. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/tend.py +3 -1
  80. abstractmemory-0.5.0/src/abstractmemory/understanding.py +1728 -0
  81. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/world_model.py +223 -34
  82. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/world_model_alias.py +99 -4
  83. abstractmemory-0.5.0/src/abstractmemory/write_barrier.py +246 -0
  84. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/conftest.py +3 -1
  85. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_archive_import.py +5 -4
  86. abstractmemory-0.5.0/tests/test_atomic_formation.py +264 -0
  87. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_cadence_cursor.py +1 -1
  88. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_candidate_miner.py +4 -2
  89. abstractmemory-0.5.0/tests/test_commit_guard.py +862 -0
  90. abstractmemory-0.5.0/tests/test_communities.py +856 -0
  91. abstractmemory-0.5.0/tests/test_communities_embed_missing.py +187 -0
  92. abstractmemory-0.5.0/tests/test_communities_never_recalled.py +283 -0
  93. abstractmemory-0.5.0/tests/test_communities_rounds.py +157 -0
  94. abstractmemory-0.5.0/tests/test_communities_scale.py +273 -0
  95. abstractmemory-0.5.0/tests/test_community_placement.py +914 -0
  96. abstractmemory-0.5.0/tests/test_declare_pending.py +468 -0
  97. abstractmemory-0.5.0/tests/test_diary_summary_authored.py +444 -0
  98. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_disposal.py +1 -1
  99. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_doctoring.py +42 -1
  100. abstractmemory-0.5.0/tests/test_dream_pass_signals.py +55 -0
  101. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_dream_resolution.py +1 -1
  102. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_dream_signals.py +6 -19
  103. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_engram.py +208 -27
  104. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_entity_card.py +63 -0
  105. abstractmemory-0.5.0/tests/test_formation_authoring.py +349 -0
  106. abstractmemory-0.5.0/tests/test_formation_concurrency.py +296 -0
  107. abstractmemory-0.5.0/tests/test_identical_authoring_settles.py +166 -0
  108. abstractmemory-0.5.0/tests/test_memory_task_queue.py +466 -0
  109. abstractmemory-0.5.0/tests/test_pending_formations.py +507 -0
  110. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_phase_artifact_pin.py +5 -1
  111. abstractmemory-0.5.0/tests/test_reading_provenance.py +212 -0
  112. abstractmemory-0.5.0/tests/test_rearm_pending.py +380 -0
  113. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_reconstruct.py +3 -3
  114. abstractmemory-0.5.0/tests/test_records_since_maintenance.py +347 -0
  115. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_replay.py +9 -1
  116. abstractmemory-0.5.0/tests/test_retitle.py +431 -0
  117. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_review_wave.py +1 -1
  118. abstractmemory-0.5.0/tests/test_rewrite_digest_in_place.py +445 -0
  119. abstractmemory-0.5.0/tests/test_ripple_v1.py +331 -0
  120. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_store_vectors.py +1 -1
  121. abstractmemory-0.5.0/tests/test_stored_text_whole.py +119 -0
  122. abstractmemory-0.5.0/tests/test_titles_whole.py +126 -0
  123. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_two_sided_visit_contract.py +1 -1
  124. abstractmemory-0.5.0/tests/test_untitled_records.py +423 -0
  125. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_world_model.py +40 -5
  126. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_world_model_alias.py +1 -1
  127. abstractmemory-0.5.0/tests/test_world_model_rekey.py +368 -0
  128. abstractmemory-0.5.0/tests/test_write_barrier.py +690 -0
  129. abstractmemory-0.4.0/docs/api.md +0 -505
  130. abstractmemory-0.4.0/docs/backlog/planned/knowledge_graph_convergence/0053_self_organisation_communities_consolidation_reflection.md +0 -38
  131. abstractmemory-0.4.0/release-notes.md +0 -146
  132. abstractmemory-0.4.0/src/abstractmemory/sleep_cadence.py +0 -290
  133. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  134. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/.github/workflows/ci.yml +0 -0
  135. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/.github/workflows/release.yml +0 -0
  136. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/.gitignore +0 -0
  137. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/ACKNOWLEDGMENTS.md +0 -0
  138. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/CODE_OF_CONDUCT.md +0 -0
  139. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/CONTRIBUTING.md +0 -0
  140. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/LICENSE +0 -0
  141. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/SECURITY.md +0 -0
  142. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/README.md +0 -0
  143. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/adr/0002-abstractmemory-owns-the-memory-graph.md +0 -0
  144. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/0008_gateway_memory_install_and_config_boundary.md +0 -0
  145. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/002_sqlite_database_compatibility_and_store_capabilities.md +0 -0
  146. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/004_recall_trace_and_access_events_contract.md +0 -0
  147. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/005_source_linked_summaries_and_derived_assertion_lineage.md +0 -0
  148. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/007_read_only_memory_observer_contract.md +0 -0
  149. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/extension_wave/0037_familiarity_metamemory_read.md +0 -0
  150. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/extension_wave/0038_open_commitments_and_triggers.md +0 -0
  151. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/extension_wave/0039_tend_election_grammar.md +0 -0
  152. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/extension_wave/0049_stable_shelf_order_for_prefix_reuse.md +0 -0
  153. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/memory_system_v1/0009_assertion_identity_and_batch_read_contract.md +0 -0
  154. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/memory_system_v1/0010_append_only_closure_records_for_retract_and_supersede.md +0 -0
  155. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/memory_system_v1/0011_cross_backend_parity_conformance_suite.md +0 -0
  156. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/memory_system_v1/0013_store_concurrency_and_thread_safety_contract.md +0 -0
  157. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/memory_system_v1/0014_embedding_space_integrity_manifest.md +0 -0
  158. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/memory_system_v1/0017_memory_journal_and_scope_bindings_layer.md +0 -0
  159. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/memory_system_v1/0018_neurotransmitter_attention_strengthen_weaken_decay.md +0 -0
  160. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/memory_system_v1/0019_hybrid_retrieval_channels_fts_vector_exact.md +0 -0
  161. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/memory_system_v1/0020_reconstruction_shelf_and_selection_traces.md +0 -0
  162. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/memory_system_v1/0021_memory_records_and_remember_api.md +0 -0
  163. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/memory_system_v1/0022_probe_and_bounded_source_expansion.md +0 -0
  164. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/memory_system_v1/0023_maintenance_sleep_consolidate_dream.md +0 -0
  165. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/memory_system_v1/0024_memory_system_facade_and_consumer_migration.md +0 -0
  166. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/memory_system_v1/0025_graph_backend_decision_record_memgraph_rejected.md +0 -0
  167. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/memory_system_v1/0026_spreading_activation_and_working_set.md +0 -0
  168. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/memory_system_v1/0027_runtime_seam_contract_v1.md +0 -0
  169. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/memory_system_v1/0029_sleep_reactivity_dreams_as_reaction.md +0 -0
  170. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/memory_system_v1/0030_fork_comparison_adoption_wave.md +0 -0
  171. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/memory_system_v1/0031_second_fork_pass_and_lifecycle_closure.md +0 -0
  172. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/memory_system_v1/0036_third_pass_extension_wave.md +0 -0
  173. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/subconscious_wave/0032_dream_subconscious_lifecycle.md +0 -0
  174. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/subconscious_wave/0033_world_model_orientation_cards.md +0 -0
  175. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/subconscious_wave/0034_situate_temporal_relational_reconstruction.md +0 -0
  176. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/subconscious_wave/0035_lessons_layer_conventions.md +0 -0
  177. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/deprecated/001_semantics_aligned_memory_record_conventions.md +0 -0
  178. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/deprecated/003_bounded_graph_traversal_over_triples.md +0 -0
  179. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/deprecated/006_deterministic_anchor_and_facet_index.md +0 -0
  180. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/planned/extension_wave/README.md +0 -0
  181. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/planned/knowledge_graph_convergence/0050_entity_registry_identity_and_reversible_merges.md +0 -0
  182. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/planned/knowledge_graph_convergence/0051_claim_lifecycle_and_revision_log.md +0 -0
  183. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/planned/knowledge_graph_convergence/0052_document_knowledge_retrieval.md +0 -0
  184. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/planned/knowledge_graph_convergence/0055_notes_and_diary_layer_for_consumers.md +0 -0
  185. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/planned/knowledge_graph_convergence/0056_ledger_provenance_contract_and_revision_log.md +0 -0
  186. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/planned/knowledge_graph_convergence/0057_one_mind_per_plane_sqlite_home.md +0 -0
  187. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/planned/knowledge_graph_convergence/0058_home_store_performance_indexes_vectors.md +0 -0
  188. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/planned/subconscious_wave/README.md +0 -0
  189. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/proposed/extension_wave/0040_recurrence_probe_and_presentation_fold.md +0 -0
  190. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/proposed/extension_wave/0041_loss_absence_anchors.md +0 -0
  191. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/proposed/extension_wave/0042_explain_recall_serving_contract.md +0 -0
  192. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/proposed/extension_wave/0043_mind_health_report.md +0 -0
  193. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/proposed/extension_wave/0044_origin_time_axis_for_imports.md +0 -0
  194. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/proposed/extension_wave/0045_n_party_memory_contract.md +0 -0
  195. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/proposed/extension_wave/0046_transcript_adoption_verb.md +0 -0
  196. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/proposed/extension_wave/0047_cue_hygiene_at_recall_boundary.md +0 -0
  197. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/proposed/extension_wave/0048_writer_forensics_for_homes.md +0 -0
  198. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/proposed/extension_wave/README.md +0 -0
  199. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/proposed/memory_system_v1/0012_lancedb_backend_hardening_and_explicit_schema.md +0 -0
  200. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/proposed/memory_system_v1/0015_capabilities_extensions_and_deterministic_export_import.md +0 -0
  201. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/proposed/memory_system_v1/0016_semantics_vocabulary_validation_and_aliasing_module.md +0 -0
  202. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/proposed/memory_system_v1/0028_lateral_inhibition_theory.md +0 -0
  203. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/proposed/memory_system_v1/README.md +0 -0
  204. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/development.md +0 -0
  205. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/getting-started.md +0 -0
  206. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/examples/realistic_session.py +0 -0
  207. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/attention.py +0 -0
  208. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/channels.py +0 -0
  209. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/cognition_health.py +0 -0
  210. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/concept_anchor.py +0 -0
  211. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/disposal.py +0 -0
  212. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/dream_resolution.py +0 -0
  213. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/drive_grouping.py +0 -0
  214. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/drive_pressure.py +0 -0
  215. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/embedding_pin.py +0 -0
  216. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/embeddings.py +0 -0
  217. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/embeddings_openai_compat.py +0 -0
  218. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/engine_manifest.py +0 -0
  219. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/feelings_reads.py +0 -0
  220. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/folds.py +0 -0
  221. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/gradation.py +0 -0
  222. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/graph/__init__.py +0 -0
  223. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/graph/backend.py +0 -0
  224. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/graph/provenance.py +0 -0
  225. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/graph/revisions.py +0 -0
  226. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/journal_common.py +0 -0
  227. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/mind_mass.py +0 -0
  228. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/models.py +0 -0
  229. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/origin_diversity.py +0 -0
  230. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/reconstruct.py +0 -0
  231. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/render_order.py +0 -0
  232. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/selection.py +0 -0
  233. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/self_component.py +0 -0
  234. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/sleep_policy.py +0 -0
  235. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/spark.py +0 -0
  236. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/spreading.py +0 -0
  237. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/store.py +0 -0
  238. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/store_tuning.py +0 -0
  239. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/system_access.py +0 -0
  240. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/system_valence.py +0 -0
  241. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/text_tokens.py +0 -0
  242. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/vector_matrix.py +0 -0
  243. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/vector_scoring.py +0 -0
  244. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/bench/bench_graph.py +0 -0
  245. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/bench/bench_store.py +0 -0
  246. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/golden/pre_identity_wave_result.json +0 -0
  247. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/graph_support.py +0 -0
  248. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/realistic_fixtures.py +0 -0
  249. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_access_counts.py +0 -0
  250. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_alive_drives.py +0 -0
  251. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_anchored_summon.py +0 -0
  252. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_attention.py +0 -0
  253. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_audit_wave.py +0 -0
  254. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_binding_visibility.py +0 -0
  255. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_clean_owner_keys.py +0 -0
  256. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_close_assertion.py +0 -0
  257. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_co_use_trails.py +0 -0
  258. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_cognition_health.py +0 -0
  259. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_commitments.py +0 -0
  260. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_consolidation.py +0 -0
  261. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_drive_grouping.py +0 -0
  262. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_drive_pressure.py +0 -0
  263. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_embedding_pin.py +0 -0
  264. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_engine_manifest.py +0 -0
  265. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_explain_recall.py +0 -0
  266. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_familiarity.py +0 -0
  267. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_feelings_reads.py +0 -0
  268. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_gradation.py +0 -0
  269. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_graph_conformance.py +0 -0
  270. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_graph_e2e.py +0 -0
  271. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_graph_performance.py +0 -0
  272. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_graph_provenance.py +0 -0
  273. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_graph_revisions.py +0 -0
  274. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_home_lease_contract.py +0 -0
  275. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_home_open_is_a_read.py +0 -0
  276. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_identity_review.py +0 -0
  277. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_identity_self.py +0 -0
  278. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_in_memory_query_text_fallback.py +0 -0
  279. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_journal_backends.py +0 -0
  280. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_keyword_fts.py +0 -0
  281. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_lancedb_triple_store.py +0 -0
  282. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_lessons_layer.py +0 -0
  283. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_maintenance.py +0 -0
  284. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_mind_mass.py +0 -0
  285. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_narrow_assertion.py +0 -0
  286. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_origin_diversity.py +0 -0
  287. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_participants_channel.py +0 -0
  288. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_probe.py +0 -0
  289. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_realistic_lmstudio.py +0 -0
  290. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_recall_reads.py +0 -0
  291. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_recent_records.py +0 -0
  292. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_records.py +0 -0
  293. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_redigestion.py +0 -0
  294. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_render_order.py +0 -0
  295. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_replay_idempotency.py +0 -0
  296. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_seam_addendum.py +0 -0
  297. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_seam_contracts.py +0 -0
  298. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_situate.py +0 -0
  299. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_spark.py +0 -0
  300. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_spreading.py +0 -0
  301. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_sqlite_triple_store.py +0 -0
  302. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_stm_union.py +0 -0
  303. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_store_performance.py +0 -0
  304. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_system.py +0 -0
  305. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_tend.py +0 -0
  306. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_term_canonicalization.py +0 -0
  307. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_triple_store_limits.py +0 -0
  308. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_valence_gradation.py +0 -0
  309. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_vector_encoding_marker.py +0 -0
  310. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_vector_matrix.py +0 -0
  311. {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_vector_matrix_footprint.py +0 -0
@@ -5,6 +5,197 @@ All notable changes to this package will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html) (pre-1.0).
7
7
 
8
+ ## [0.5.0] - 2026-11-10
9
+
10
+ Every memory now carries an authored title and summary, a home keeps a persistent queue of what still needs
11
+ understanding, a record's understanding is rewritten in place with every earlier reading kept, the home's topics are
12
+ formed during sleep, and a host can fence every memory write behind its Stop (backlogs 0059, 0060, 0061;
13
+ [ADR 0001](docs/adr/0001-altered-memories-ripple.md),
14
+ [ADR 0003](docs/adr/0003-one-graph-ledger-provenance-and-revisions.md) decision 6a).
15
+
16
+ ### Upgrading
17
+
18
+ - **Open homes that form records with `MemorySystem(..., task_queue=True)`.** A missing title or summary is always
19
+ stored beside the task that writes it, so these refuse a home without a task queue, before writing anything:
20
+ `world_model_pass`, `dream_pass`, `mine_candidates_pass`, `consolidation_pass`, `wake_cue_dedup_pass`,
21
+ `sleep_pass`, `communities_pass`, `embed_missing`, the ripple verbs, a `remember_many` record with `pending=...`,
22
+ and an `engram` whose unnamed spark items get no authored title (`report_only` reads still run). `declare_pending`
23
+ and `rearm_pending` answer `no_task_queue`. The queue adds its tables (`memq_*`) to the home's file on first open.
24
+ - **Pass an `author` callable.** Memory calls no model: `world_model_pass` / `world_model_update`, `dream_pass`,
25
+ `mine_candidates_pass`, `consolidation_pass`, `wake_cue_dedup_pass`, `sleep_pass`, `communities_pass` and `engram`
26
+ take `author(kind, body, context) -> {title, summary, author, reader, sources}`. Without it, or when it fails, the
27
+ records still form, pending, and every result's `authoring = {authored, failures}` names the failures
28
+ (`no_author_supplied`, `author_raised`, `invalid_result`).
29
+ - **Treat a title as optional while it is pending.** `MemoryRecordInput.title` may be `None` with
30
+ `pending=("title",)`, and every read serves a pending title as `None` (`MemoryHandle.title` is `Optional[str]`,
31
+ display blocks and `record_understanding` carry `pending`), never a placeholder or words from the body. A host's
32
+ drainer completes `title.author` / `digest.author` tasks with `retitle` / `rewrite_digest`; records stored before
33
+ 0.5.0 without an authored title or summary are brought into the same state with `declare_pending`.
34
+ `MemoryRecordInput` raises `ValueError` for an empty title without `pending=("title",)`, and for a title given
35
+ with it.
36
+ - **Memory's passes no longer store their own titles or summaries.** Cards, dreams, offers, consolidation candidates
37
+ and the dedup day summary form authored or pending; their bookkeeping text ("World model: ...", "Dream: ...") is
38
+ only the provisional body their tasks author from. `world_model_pass` no longer queues `card.author` for new cards
39
+ (`digest.author` owns the body; `card.author` remains for legacy cards).
40
+ - **Hosts that fence writes** pass `commit_guard=` and wrap the moment they flip it in `system.write_barrier()`.
41
+ Two residual windows remain: a LanceDB store takes no write lock (a LanceDB write whose guard passed before the
42
+ flip may land after it, at most one per concurrent writer; `BarrierHold.uncovered` names it with a `#FALLBACK`
43
+ warning), and the two SQLite autocommit commit points (`SQLiteTripleStore._write_pin` without a cursor, the
44
+ off-file graph's `mark_journal_applied`) are covered only by a barrier taken on the same handle.
45
+ - **Community records are never embedded and never recalled**: a store's embedding paths, recall shelves, keyword
46
+ indexes and memory scans skip kind `community` (`canonical_text.NON_EMBEDDED_KINDS`).
47
+ - `CANONICAL_TEXT_VERSION` is 3 (stored text is never cut). Record digests render as before; a plain assertion
48
+ with an `original_context` longer than 400 characters keeps its earlier text and vector until `reembed_store`
49
+ re-derives it.
50
+ - `version_count` is 1 for a record that was never rewritten (was 0); `digest_version` stays 0.
51
+ - `apply_redigestion` is deprecated (it forms a new record with zero usage); use `rewrite_digest`.
52
+
53
+ ### Added: titles and summaries are always authored
54
+
55
+ - `MemoryRecordInput(pending=(), pending_failure=None)`: `pending` is a subset of `PENDING_FIELDS`
56
+ (`{"title", "summary"}`). A pending record carries `attributes.pending = {title, summary, since, attempts}` (plus
57
+ `failure` when authoring failed) and `remember_many` queues its authoring task (`PENDING_TASK_KINDS`:
58
+ `title.author` / `digest.author`, capability `summaries`, `FORMATION_PRIORITY`). A pending summary is refused on
59
+ the entity's own words (`UNDERSTANDING_PROTECTED_KINDS`), except a public diary projection's summary.
60
+ - The host's `author` callable on every pass (`formation_authoring`): authored fields are stored with their
61
+ provenance (`title_provenance`, `understanding`, version 0, cause `formation`) and owe no task; a standing record is
62
+ never authored again.
63
+ - `engram(..., author=None)`: a spark item without a `name` has its title authored before it forms (it was
64
+ `<section>-<ordinal>`, such as `trait-0`), else it forms pending; a `name` stays the title. `EngramResult.authoring`.
65
+ - `retitle(record_id, *, title, author, cause, expected_version, ...)`: changes only a record's title, in place, for
66
+ every kind; the body and the reading stay byte-identical, the previous title is kept as a version, `title_version`
67
+ is the compare-and-set. Refusals: `empty_title`, `hash_chained` (an owner-direct diary entry whose `entry_hash`
68
+ attests its title), `closed`, `stale`, `embedder_unavailable`. A digest or card reading that changes the title
69
+ writes the title version too.
70
+ - `declare_pending(record_id, *, fields=("title", "summary"), cause="repair", reason=None)`: a stored record whose
71
+ title or summary was never authored gets exactly the state of a record formed pending (marker and tasks in one
72
+ transaction; a declared title is stored `None`, its old title kept as a version). Idempotent (`already_pending`).
73
+ - `rearm_pending(record_id, ...)` re-queues the authoring task of a pending field whose tasks all ran out, and
74
+ `pending_records(*, scopes=None, live_task=False)` lists the records still pending, with their live and unowned
75
+ fields.
76
+ - A public diary entry's summary is authored like any record's (at formation, or declared pending for an existing
77
+ entry); its body, the book's entry and every hash chain are untouched. Owner-direct, hash-chained and private
78
+ entries stay protected (`diary.diary_summary_refusal`).
79
+ - `rekey_world_model(old_key, new_key, *, scope, owner_id, author, cause, ...)`: moves a standing card to a new key
80
+ in place and keeps the old key as an alias, so a retitled interest's next `world_model_pass` forms no second card.
81
+ An untitled interest's card is keyed `topic:<graph id>` and `retitle` re-keys it when the title lands
82
+ (`card_rekey` in the result).
83
+ - `REWRITE_CAUSES` gains `repair` (a correction of what a process wrote wrong).
84
+
85
+ ### Added: understanding rewritten in place (0059)
86
+
87
+ - `rewrite_digest`: replaces a record's digest, title and keywords in place. The record keeps its graph id, digest
88
+ assertion id, edges, usage counts and journal; its keyword entry and vector are replaced in the same transaction.
89
+ `expected_version` is a compare-and-set; each reading records `author` (`AUTHOR_KINDS`), `reader`
90
+ (`{provider, model, thinking}`), `sources` (mandatory for a model author) and `cause`. Refusals are named results
91
+ that write nothing. Results carry `cosine_distance` between the old and new vectors.
92
+ - `narrate_dream` (a narration beside a dream's summary), `revert_digest`, `versions`, `current_of`,
93
+ `record_understanding`, `understanding_fields`; `author_world_model` rewrites a card in place by default (accepts
94
+ `reader`, `sources`, `expected_fingerprint`; `in_place=False` keeps the revision path).
95
+ - The journal's version family `UnderstandingVersion`, and the opt-in replay family `revision`
96
+ (`OPT_IN_FAMILIES`; the default six families are unchanged). Display blocks carry the reading's provenance
97
+ (`digest_method`, `digest_version`, `version_count`, `authored_by`, `reader`, `understood_at`, `cause`).
98
+ - Every record says who wrote its words, when and why, even when its writer stamped nothing: a row without a stamp
99
+ reads as its formation reading, derived from its origin (`understanding.reading_provenance`); `remember_many`
100
+ records that reading at formation.
101
+
102
+ ### Added: the memory task queue (0060) and ripple v1 (0061)
103
+
104
+ - `MemorySystem(task_queue=True)` keeps its queue in the home's file (`memq_tasks`, `memq_log`, `memq_windows`,
105
+ `memq_ripples`, `memq_ripple_gates`, `memq_maintenance`; a private in-memory database for the in-memory store). `system.tasks` (`MemoryTaskQueue`): `enqueue`, `select_for_window(budget_seconds, sensitivity)` (activation
106
+ through ADR 0001's logistic gate, strongest first, bounded by the window's time; every live task selected or left
107
+ out with a reason), `claim` / `ack` / `release` (leases, attempts, defer without spending an attempt), `left_out`.
108
+ `understanding_debt`, `enqueue_debt` (the backfill, dry-run by default) and `task_packet` on `MemorySystem`. The
109
+ understanding verbs accept `task_id=` and settle the task in their own transaction.
110
+ - A formed record and the tasks it owes commit together (`memory_tasks.form_with_tasks`): one transaction on the
111
+ SQLite home; on the in-memory pair a failure rolls back exactly that attempt's rows, bindings and tasks.
112
+ - `maintenance_due(..., tasks=)` reports pending tasks and is due when ripple or night-only work is pending.
113
+ - Ripple v1: `seed_ripple`, `settle_reconsideration`, `form_consolidation` (night only), `refresh_ripples`,
114
+ `revert_ripple`, and the reads `ripples` / `ripple`. Candidates by relation, by the cards built on a memory and by
115
+ vector similarity; impact decays per hop through the logistic gate (floor 0.1), at most 2 hops and 20
116
+ reconsiderations per ripple and per window; protected kinds are never reconsidered; every gate decision is stored
117
+ with its potential.
118
+
119
+ ### Added: communities (topics)
120
+
121
+ - A community is a formed record of kind `community` (`abstractmemory.communities.COMMUNITY_KIND`), one record per
122
+ version, with a stable `attributes.community_key` across versions. `communities_pass(system, *, scopes, owner_id,
123
+ author, cancelled, ...)`, which a host runs during its sleep, detects them (deterministic warm-started Louvain over
124
+ the vectored records, at most 5 rounds), attaches vector-less records through their engraved relations, lays them
125
+ out, authors the changed ones and writes the version in one guarded transaction. `embed_missing(...)` embeds the
126
+ formed records that have no vector with the store's own embedder.
127
+ - Placement at formation: on a `task_queue=True` home, `remember_many` places every record it forms in its
128
+ provisional community inside the formation's transaction (nearest centroid, else the majority community of its
129
+ formation edges) and writes one `placed` journal event (an audit kind, never scored).
130
+ - Reads (`abstractmemory.community_index`): `communities(system, *, scopes, owner_id, version=None)` (the payload
131
+ version 2 a host serves, with each community's `facts`: span, activity, hub, bridges, paths,
132
+ `changed_since_last_sleep`) and `community_of(system, record_id)`. A community record replays like any formed
133
+ record; its binding envelope draws only `refines`.
134
+ - Topic titles come first: a community's `title.author` / `digest.author` tasks are queued at `COMMUNITY_PRIORITY`
135
+ (3, ahead of every other pending record's `FORMATION_PRIORITY` 5), so a drainer with a small budget names the
136
+ topics before a long repair tail. `communities_pass`'s `budget` goes to its topics, largest first, one call per
137
+ topic for both its title and its summary (`None` authors every topic); the receipt carries `budget` and
138
+ `budget_spent`. A topic's briefing keeps its member lines within 1500 tokens, the first line too.
139
+
140
+ ### Added: sleep cadence
141
+
142
+ - `records_since_maintenance(system, *, scopes=None, after=None) -> {count, last_maintenance_at, since,
143
+ boundary_source, fragmented}`: the host's idle → sleep threshold. `sleep_pass` records when a whole night ran to
144
+ its end (a cancelled, `report_only` or anchored night records nothing; a cycle window is recorded as kind `cycle`
145
+ and does not reset the count); `after` is the host's own last maintenance, and the later of the two is the
146
+ boundary. `fragmented = {count, share, provisional, unvectored, pending}` says how much of the live home a sleep
147
+ would make whole. `MemoryTaskQueue.record_maintenance` / `last_maintenance`.
148
+ - `sleep_pass(..., cancelled=None)`: the host's Stop check, read at every sub-phase boundary and immediately before
149
+ the completion marker; a stopped night records no completion and carries `cancelled_after`.
150
+
151
+ ### Added: the Stop fence hooks
152
+
153
+ - `MemorySystem(..., commit_guard=None)`: the host's `guard(where)` is installed on the store and journal and called
154
+ inside every write transaction immediately before its COMMIT, once per outermost transaction, whoever writes (the
155
+ facade, `MemoryGraph`, the task queue, the sleep passes). Raising rolls the write back; nothing of it lands and the
156
+ exception reaches the caller unchanged. A store or journal type whose writes do not call a guard is refused
157
+ (`TypeError`), and so is a second, different guard (`ValueError`).
158
+ - `MemorySystem.write_barrier(*, timeout=None)` / `write_barrier(system, *, timeout=None)`: a context manager the
159
+ host wraps around its flip of the guard. It holds this home's in-process locks in the writers' own order and one
160
+ `BEGIN IMMEDIATE` per distinct SQLite file, so every transaction whose guard passed commits before the block and
161
+ every later one calls its guard after it. It writes nothing; `WriteBarrierTimeout` names the lock or file still
162
+ held.
163
+
164
+ ### Changed
165
+
166
+ - Stored text is never cut: a world-model card quotes its evidence whole, a dream signal's `fragment` is kept whole
167
+ (`dream_signals.FRAGMENT_CAP` is gone), an assertion's `original_context` renders whole in the canonical text, a
168
+ plain assertion's "s p o" display title and an imported file's prose are kept whole. Readers shorten text at
169
+ display time (`canonical_text.short_title`).
170
+ - Titles are explicit and whole: a card formed from an interest keeps the interest's whole subject head as its
171
+ target; lesson-candidate, interest-candidate and group-offer titles are no longer bounded.
172
+ - `world_model_pass`: an interest whose title heads to an alias of a card counts as an election of the card's
173
+ primary key.
174
+ - `dream_pass` returns `signals` and `signals_omitted`.
175
+ - `journal_cold_cut` copies the version family and the task queue.
176
+ - The identity card's `lessons` section also counts the lessons written in the diary (`diary_type='lesson'`), once
177
+ each when a lesson record derives from the entry.
178
+ - The identity card's record briefs carry the reading fields (`authored_by`, `understood_at`, `cause`,
179
+ `digest_version`, `version_count`); diary-redacted replay blocks carry `authored_by`, `understood_at` and `cause`,
180
+ never the entry's words.
181
+
182
+ ### Fixed
183
+
184
+ - `records_since_maintenance(...)["fragmented"]["count"]` counts each live record once: a record both vector-less
185
+ and pending, or placed and pending, is one fragmented record, and a placement whose record has been closed since
186
+ counts in `provisional` only, so `share` never exceeds 1.0. The per-kind counts are unchanged.
187
+ - Identical authored words settle a pending field: an in-place write whose words equal the provisional ones clears
188
+ the marker, completes the task and records the reading (it answered `unchanged` and left the task leased).
189
+ - On the in-memory pair, formation and rewriting share one lock (they could deadlock), and a failed formation
190
+ removes only its own rows and bindings, never a concurrent writer's.
191
+ - `form_with_tasks` calls the commit guard immediately before its COMMITs, after the rows, bindings and tasks.
192
+ - A completed task no longer carries the error of an earlier failed attempt (the failure stays in the task log).
193
+ - The wake-cue dedup pass no longer tokenizes a missing title as "None".
194
+
195
+ ### Deprecated
196
+
197
+ - `apply_redigestion` (emits `DeprecationWarning`): use `rewrite_digest`.
198
+
8
199
  ## [0.4.0] - 2026-10-27
9
200
 
10
201
  The memory graph ([ADR 0003](docs/adr/0003-one-graph-ledger-provenance-and-revisions.md), backlogs 0056-0058):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: AbstractMemory
3
- Version: 0.4.0
3
+ Version: 0.5.0
4
4
  Summary: AbstractMemory: temporal, provenance-aware semantic memory primitives for AbstractFramework.
5
5
  Project-URL: AbstractFramework (monorepo), https://github.com/lpalbou/abstractframework
6
6
  Author: Laurent-Philippe Albou
@@ -55,6 +55,15 @@ Storage never decays and nothing is ever deleted; only retrieval strength change
55
55
  - The authoritative export list is [`src/abstractmemory/__init__.py`](src/abstractmemory/__init__.py); [`docs/api.md`](docs/api.md) documents it.
56
56
  - Requires Python 3.10+.
57
57
 
58
+ ## What's new in 0.5.0
59
+
60
+ - Every memory's title and summary is authored: memory's passes take a host `author` callable, and a record whose authoring failed forms pending, with its task, until a reader completes it (`retitle`, `rewrite_digest`, `declare_pending`, `rearm_pending`).
61
+ - A persistent task queue per home (`MemorySystem(task_queue=True)`), ripple v1, and understanding rewritten in place with every earlier reading kept as a version.
62
+ - Topics: `community` records formed during sleep, with provisional placement of each new record at formation.
63
+ - The sleep cadence read `records_since_maintenance`, and the Stop fence hooks `commit_guard` and `write_barrier`.
64
+
65
+ Upgrading from 0.4.x: see the "Upgrading" notes in [`CHANGELOG.md`](CHANGELOG.md).
66
+
58
67
  ## Ecosystem (AbstractFramework)
59
68
 
60
69
  AbstractMemory is a component of the **AbstractFramework** ecosystem. It has no dependency on AbstractCore or AbstractRuntime; embeddings for semantic retrieval can come from any OpenAI-compatible `/embeddings` endpoint (`OpenAICompatTextEmbedder`), from an AbstractGateway deployment (`AbstractGatewayTextEmbedder`), or from your own `TextEmbedder` implementation.
@@ -181,7 +190,7 @@ system.commit_selection(result.trace_id, [h.record_id for h in result.handles[:2
181
190
 
182
191
  ## Design principles
183
192
 
184
- - **Append-only, no deletion**: updates are new assertions; belief revision is closure records (retract/supersede/reinterpreted/merged); forgetting is decay of retrieval strength plus closures and silencing — the substrate is lossless.
193
+ - **Append-only, no deletion**: updates are new assertions; belief revision is closure records (retract/supersede/reinterpreted/merged); forgetting is decay of retrieval strength plus closures and silencing — the substrate is lossless. The one mutable cell is a record's understanding: `rewrite_digest` and `retitle` rewrite a digest or a title in place and keep every earlier reading as a version.
185
194
  - **Reads are pure**: reconstruction, inspection, replay, and the entity card deposit nothing. `commit_selection` is the only strengthening path.
186
195
  - **One seq axis**: the journal assigns a monotonic `seq` to every record; any past state is reproducible by anchoring reads at `as_of`.
187
196
  - **Works-or-loud**: degraded paths are labeled `#FALLBACK` in result warnings; invalid inputs raise actionable errors instead of silently meaning something else.
@@ -13,6 +13,15 @@ Storage never decays and nothing is ever deleted; only retrieval strength change
13
13
  - The authoritative export list is [`src/abstractmemory/__init__.py`](src/abstractmemory/__init__.py); [`docs/api.md`](docs/api.md) documents it.
14
14
  - Requires Python 3.10+.
15
15
 
16
+ ## What's new in 0.5.0
17
+
18
+ - Every memory's title and summary is authored: memory's passes take a host `author` callable, and a record whose authoring failed forms pending, with its task, until a reader completes it (`retitle`, `rewrite_digest`, `declare_pending`, `rearm_pending`).
19
+ - A persistent task queue per home (`MemorySystem(task_queue=True)`), ripple v1, and understanding rewritten in place with every earlier reading kept as a version.
20
+ - Topics: `community` records formed during sleep, with provisional placement of each new record at formation.
21
+ - The sleep cadence read `records_since_maintenance`, and the Stop fence hooks `commit_guard` and `write_barrier`.
22
+
23
+ Upgrading from 0.4.x: see the "Upgrading" notes in [`CHANGELOG.md`](CHANGELOG.md).
24
+
16
25
  ## Ecosystem (AbstractFramework)
17
26
 
18
27
  AbstractMemory is a component of the **AbstractFramework** ecosystem. It has no dependency on AbstractCore or AbstractRuntime; embeddings for semantic retrieval can come from any OpenAI-compatible `/embeddings` endpoint (`OpenAICompatTextEmbedder`), from an AbstractGateway deployment (`AbstractGatewayTextEmbedder`), or from your own `TextEmbedder` implementation.
@@ -139,7 +148,7 @@ system.commit_selection(result.trace_id, [h.record_id for h in result.handles[:2
139
148
 
140
149
  ## Design principles
141
150
 
142
- - **Append-only, no deletion**: updates are new assertions; belief revision is closure records (retract/supersede/reinterpreted/merged); forgetting is decay of retrieval strength plus closures and silencing — the substrate is lossless.
151
+ - **Append-only, no deletion**: updates are new assertions; belief revision is closure records (retract/supersede/reinterpreted/merged); forgetting is decay of retrieval strength plus closures and silencing — the substrate is lossless. The one mutable cell is a record's understanding: `rewrite_digest` and `retitle` rewrite a digest or a title in place and keep every earlier reading as a version.
143
152
  - **Reads are pure**: reconstruction, inspection, replay, and the entity card deposit nothing. `commit_selection` is the only strengthening path.
144
153
  - **One seq axis**: the journal assigns a monotonic `seq` to every record; any past state is reproducible by anchoring reads at `as_of`.
145
154
  - **Works-or-loud**: degraded paths are labeled `#FALLBACK` in result warnings; invalid inputs raise actionable errors instead of silently meaning something else.
@@ -2,7 +2,10 @@
2
2
 
3
3
  Status: Accepted (operator ruling, 2026-10-21; activation model confirmed with the operator the same day).
4
4
  Amended 2026-10-27 (operator ruling): the ripple is AbstractMemory's process end to end, not a consumer's
5
- (ADR 0002). Aspirational: AbstractMemory does not implement it yet; AbstractNote holds a prototype
5
+ (ADR 0002). Implemented in part (2026-11-08, backlog 0061, ripple v1): propagation over the memory task queue
6
+ with the logistic gate of decision 7, the floor, decay, hops, budget, refractory-per-ripple, every gate decision on
7
+ record, the no-write unchanged settle, sleep consolidation; mass, edge learning and closures caused by a ripple
8
+ remain planned (backlog 0054). Before 0061: AbstractMemory did not implement it; AbstractNote holds a prototype
6
9
  (its ADR 0008 propagation lane) that is to be absorbed here, not kept as the implementation.
7
10
 
8
11
  ## Context
@@ -132,6 +135,8 @@ asks "given that A changed this much, what must be reconsidered about B and E?".
132
135
  - Proposed: [ripple_wave/0001_change_records_and_ripple_primitives.md](../backlog/proposed/ripple_wave/0001_change_records_and_ripple_primitives.md)
133
136
  (the AbstractMemory primitives: change records with magnitude, closure causes, `maintenance_due` counting pending
134
137
  ripples, `narrow_assertion`).
138
+ - Implemented (v1): [knowledge_graph_convergence/0061_ripple_v1_over_the_task_queue.md](../backlog/planned/knowledge_graph_convergence/0061_ripple_v1_over_the_task_queue.md)
139
+ (the gate and its constants in `activation_gate.py`; propagation, settle and consolidation in `ripple.py`).
135
140
  - Planned: [knowledge_graph_convergence/0054_ripple_propagation_and_activation.md](../backlog/planned/knowledge_graph_convergence/0054_ripple_propagation_and_activation.md)
136
141
  (the propagation, activation and reconsideration process in AbstractMemory).
137
142
  - Prototype to absorb, not to keep: AbstractNote ADR 0008 and its propagation lane (R6, 2026-10-20/21: calibrated
@@ -6,6 +6,8 @@ convergence track (backlog 0050-0058).
6
6
  Amended 2026-10-27 (operator rulings on `abstractframework/untracked/memory-transition/report.md`): decisions 2 and
7
7
  13, visibility is strict ownership (report decision 5); decision 3, one graph surface with stores as connectors
8
8
  behind it, SQLite the default connector (report decision 2).
9
+ Amended 2026-11-08 (operator ruling 2026-11-07 rule 2, confirmed in the understanding-pass decisions; backlog 0059):
10
+ decision 6a, a record's understanding is the one mutable cell, rewritten in place with every earlier reading kept.
9
11
 
10
12
  ## Context
11
13
 
@@ -111,6 +113,16 @@ change of understanding, can be reconstructed from the ledger.
111
113
  the operations applied together and atomically (assert, close, narrow, and, as the track lands them, entity and
112
114
  alias operations). Replaying the revision log into an empty store yields the same graph. A revision is
113
115
  idempotent on its id. The in-place `close_assertion` becomes a revision op (`close`) and is journaled with it.
116
+ 6a. **A record's understanding is the one mutable cell** (amendment 2026-11-08, backlog 0059). A formed record's
117
+ digest (its summary text, title and keywords; a card's text; a dream's narration beside its summary) may be
118
+ rewritten IN PLACE, and only through `rewrite_digest`, `author_world_model` and `narrate_dream`. The record keeps
119
+ its subject id, its digest assertion id (usage keys on it), its edges and every journal record; the previous
120
+ reading is appended to the journal's `versions` family with its author, reader, ledger sources and cause, so the
121
+ as-recorded axis stays answerable ("what did this mind hold at R" reads the version current at R). The verbatim
122
+ is never touched. The keyword entry and the vector are replaced in the same transaction as the row, so recall
123
+ never serves words the row no longer holds. Where a home holds the graph tables, a rewrite becomes a revision op
124
+ (`rewrite`) logged like `close` and `narrow`; entity homes today hold no graph tables, so the version row is the
125
+ record of the change.
114
126
  7. **Closures carry their cause and their successor.** A closed window records `kind`
115
127
  (`retract | supersede | reinterpreted | narrowed | merged`), the `revision_id` that closed it, the replacement
116
128
  ids ("superseded by ..."), and for a ripple the source memory and hop count (ADR 0001). The window on the row and
@@ -244,7 +256,8 @@ change of understanding, can be reconstructed from the ledger.
244
256
  per plane, LanceDB optional, import of the existing plane store),
245
257
  [0058](../backlog/planned/knowledge_graph_convergence/0058_home_store_performance_indexes_vectors.md)
246
258
  (indexes, column projection, binary vectors and the matrix cache).
247
- - Track: [knowledge_graph_convergence/](../backlog/planned/knowledge_graph_convergence/README.md) (0050-0058);
259
+ - Decision 6a: [0059](../backlog/planned/knowledge_graph_convergence/0059_record_understanding_rewrites_in_place_with_versions.md).
260
+ - Track: [knowledge_graph_convergence/](../backlog/planned/knowledge_graph_convergence/README.md) (0050-0061);
248
261
  [ripple_wave/0001](../backlog/proposed/ripple_wave/0001_change_records_and_ripple_primitives.md).
249
262
  - Consumers: AbstractNote backlog 0033-0037 (its track `planned/memory_convergence/`); AbstractRuntime ADR 0009 and
250
263
  its memory facade item; AbstractGateway memory routes item; AbstractEntity `docs/backlog` memory provenance item.
@@ -5,6 +5,6 @@ policy the work must respect.
5
5
 
6
6
  | ADR | Title | Status |
7
7
  |---|---|---|
8
- | [0001](0001-altered-memories-ripple.md) | An altered memory ripples through the memories connected to it | Accepted (2026-10-21; amended 2026-10-27: owned by AbstractMemory) |
8
+ | [0001](0001-altered-memories-ripple.md) | An altered memory ripples through the memories connected to it | Accepted (2026-10-21; amended 2026-10-27: owned by AbstractMemory; v1 implemented 2026-11-08, backlog 0061) |
9
9
  | [0002](0002-abstractmemory-owns-the-memory-graph.md) | AbstractMemory owns the semantic temporal memory graph and all of its processing | Accepted (2026-10-27) |
10
- | [0003](0003-one-graph-ledger-provenance-and-revisions.md) | One semantic temporal graph, every memory tied to the ledger, every change a revision | Accepted (2026-10-27; amended 2026-10-27: strict ownership; decision 3, one graph surface, stores as connectors, SQLite default) |
10
+ | [0003](0003-one-graph-ledger-provenance-and-revisions.md) | One semantic temporal graph, every memory tied to the ledger, every change a revision | Accepted (2026-10-27; amended 2026-10-27: strict ownership; decision 3, one graph surface, stores as connectors, SQLite default; amended 2026-11-08: decision 6a, a record's understanding is the one mutable cell) |