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