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.
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/CHANGELOG.md +191 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/PKG-INFO +11 -2
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/README.md +10 -1
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/adr/0001-altered-memories-ripple.md +6 -1
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/adr/0003-one-graph-ledger-provenance-and-revisions.md +14 -1
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/adr/README.md +2 -2
- abstractmemory-0.5.0/docs/api.md +642 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/architecture.md +6 -2
- abstractmemory-0.5.0/docs/backlog/completed/knowledge_graph_convergence/0059_record_understanding_rewrites_in_place_with_versions.md +169 -0
- abstractmemory-0.5.0/docs/backlog/completed/knowledge_graph_convergence/0060_memory_task_queue.md +154 -0
- abstractmemory-0.5.0/docs/backlog/completed/knowledge_graph_convergence/0061_ripple_v1_over_the_task_queue.md +123 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/overview.md +79 -23
- abstractmemory-0.5.0/docs/backlog/planned/knowledge_graph_convergence/0053_self_organisation_communities_consolidation_reflection.md +69 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/planned/knowledge_graph_convergence/0054_ripple_propagation_and_activation.md +7 -1
- abstractmemory-0.5.0/docs/backlog/planned/knowledge_graph_convergence/0059_record_understanding_rewrites_in_place_with_versions.md +1 -0
- abstractmemory-0.5.0/docs/backlog/planned/knowledge_graph_convergence/0060_memory_task_queue.md +1 -0
- abstractmemory-0.5.0/docs/backlog/planned/knowledge_graph_convergence/0061_ripple_v1_over_the_task_queue.md +1 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/planned/knowledge_graph_convergence/README.md +24 -3
- abstractmemory-0.5.0/docs/backlog/proposed/0062_write_barrier_residual_windows.md +72 -0
- abstractmemory-0.5.0/docs/backlog/proposed/0064_community_facts_merged_into.md +55 -0
- abstractmemory-0.5.0/docs/backlog/proposed/0065_embed_missing_vector_generation_bump_batching.md +57 -0
- abstractmemory-0.5.0/docs/backlog/proposed/0066_placement_index_misses_dissolve_only_versions.md +51 -0
- abstractmemory-0.5.0/docs/backlog/proposed/0067_communities_read_is_not_one_snapshot.md +50 -0
- abstractmemory-0.5.0/docs/backlog/proposed/0068_api_doc_queue_less_list_omits_communities.md +41 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/proposed/ripple_wave/0001_change_records_and_ripple_primitives.md +6 -0
- abstractmemory-0.5.0/docs/backlog/proposed/ripple_wave/0063_ripple_v1_consumer_seam.md +60 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/faq.md +2 -1
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/memory-system.md +30 -4
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/operator.md +1 -1
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/stores.md +2 -1
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/troubleshooting.md +8 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/examples/entity_home_maintenance_proof.py +2 -2
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/llms-full.txt +217 -31
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/llms.txt +3 -1
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/pyproject.toml +1 -1
- abstractmemory-0.5.0/release-notes.md +188 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/__init__.py +73 -1
- abstractmemory-0.5.0/src/abstractmemory/activation_gate.py +174 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/alive_drives.py +4 -2
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/archive_import.py +5 -22
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/candidate_miner.py +51 -14
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/canonical_text.py +56 -18
- abstractmemory-0.5.0/src/abstractmemory/commit_guard.py +84 -0
- abstractmemory-0.5.0/src/abstractmemory/communities.py +1783 -0
- abstractmemory-0.5.0/src/abstractmemory/community_index.py +884 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/consolidation.py +45 -7
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/diary.py +25 -1
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/doctoring.py +73 -32
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/dream_signals.py +6 -29
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/engram.py +65 -17
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/entity_card.py +68 -15
- abstractmemory-0.5.0/src/abstractmemory/formation_authoring.py +199 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/graph/graph.py +17 -8
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/graph/lancedb_backend.py +6 -2
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/identity_review.py +3 -1
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/in_memory_store.py +81 -10
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/journal.py +91 -2
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/journal_memory.py +117 -7
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/journal_sqlite.py +150 -48
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/journal_sqlite_rows.py +52 -1
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/lancedb_store.py +17 -3
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/maintenance.py +87 -15
- abstractmemory-0.5.0/src/abstractmemory/memory_tasks.py +1494 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/probe.py +4 -4
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/recall_reads.py +3 -1
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/recent_records.py +2 -2
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/records.py +129 -9
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/redigestion.py +21 -1
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/reembed.py +3 -2
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/replay.py +160 -20
- abstractmemory-0.5.0/src/abstractmemory/ripple.py +561 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/seam.py +1 -1
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/shelf.py +13 -9
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/situate.py +2 -2
- abstractmemory-0.5.0/src/abstractmemory/sleep_cadence.py +687 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/sqlite_store.py +109 -35
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/system.py +49 -3
- abstractmemory-0.5.0/src/abstractmemory/system_understanding.py +197 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/tend.py +3 -1
- abstractmemory-0.5.0/src/abstractmemory/understanding.py +1728 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/world_model.py +223 -34
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/world_model_alias.py +99 -4
- abstractmemory-0.5.0/src/abstractmemory/write_barrier.py +246 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/conftest.py +3 -1
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_archive_import.py +5 -4
- abstractmemory-0.5.0/tests/test_atomic_formation.py +264 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_cadence_cursor.py +1 -1
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_candidate_miner.py +4 -2
- abstractmemory-0.5.0/tests/test_commit_guard.py +862 -0
- abstractmemory-0.5.0/tests/test_communities.py +856 -0
- abstractmemory-0.5.0/tests/test_communities_embed_missing.py +187 -0
- abstractmemory-0.5.0/tests/test_communities_never_recalled.py +283 -0
- abstractmemory-0.5.0/tests/test_communities_rounds.py +157 -0
- abstractmemory-0.5.0/tests/test_communities_scale.py +273 -0
- abstractmemory-0.5.0/tests/test_community_placement.py +914 -0
- abstractmemory-0.5.0/tests/test_declare_pending.py +468 -0
- abstractmemory-0.5.0/tests/test_diary_summary_authored.py +444 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_disposal.py +1 -1
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_doctoring.py +42 -1
- abstractmemory-0.5.0/tests/test_dream_pass_signals.py +55 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_dream_resolution.py +1 -1
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_dream_signals.py +6 -19
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_engram.py +208 -27
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_entity_card.py +63 -0
- abstractmemory-0.5.0/tests/test_formation_authoring.py +349 -0
- abstractmemory-0.5.0/tests/test_formation_concurrency.py +296 -0
- abstractmemory-0.5.0/tests/test_identical_authoring_settles.py +166 -0
- abstractmemory-0.5.0/tests/test_memory_task_queue.py +466 -0
- abstractmemory-0.5.0/tests/test_pending_formations.py +507 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_phase_artifact_pin.py +5 -1
- abstractmemory-0.5.0/tests/test_reading_provenance.py +212 -0
- abstractmemory-0.5.0/tests/test_rearm_pending.py +380 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_reconstruct.py +3 -3
- abstractmemory-0.5.0/tests/test_records_since_maintenance.py +347 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_replay.py +9 -1
- abstractmemory-0.5.0/tests/test_retitle.py +431 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_review_wave.py +1 -1
- abstractmemory-0.5.0/tests/test_rewrite_digest_in_place.py +445 -0
- abstractmemory-0.5.0/tests/test_ripple_v1.py +331 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_store_vectors.py +1 -1
- abstractmemory-0.5.0/tests/test_stored_text_whole.py +119 -0
- abstractmemory-0.5.0/tests/test_titles_whole.py +126 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_two_sided_visit_contract.py +1 -1
- abstractmemory-0.5.0/tests/test_untitled_records.py +423 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_world_model.py +40 -5
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_world_model_alias.py +1 -1
- abstractmemory-0.5.0/tests/test_world_model_rekey.py +368 -0
- abstractmemory-0.5.0/tests/test_write_barrier.py +690 -0
- abstractmemory-0.4.0/docs/api.md +0 -505
- abstractmemory-0.4.0/docs/backlog/planned/knowledge_graph_convergence/0053_self_organisation_communities_consolidation_reflection.md +0 -38
- abstractmemory-0.4.0/release-notes.md +0 -146
- abstractmemory-0.4.0/src/abstractmemory/sleep_cadence.py +0 -290
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/.github/workflows/ci.yml +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/.github/workflows/release.yml +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/.gitignore +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/ACKNOWLEDGMENTS.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/CODE_OF_CONDUCT.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/CONTRIBUTING.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/LICENSE +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/SECURITY.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/README.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/adr/0002-abstractmemory-owns-the-memory-graph.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/0008_gateway_memory_install_and_config_boundary.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/002_sqlite_database_compatibility_and_store_capabilities.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/004_recall_trace_and_access_events_contract.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/005_source_linked_summaries_and_derived_assertion_lineage.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/007_read_only_memory_observer_contract.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/extension_wave/0037_familiarity_metamemory_read.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/extension_wave/0038_open_commitments_and_triggers.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/extension_wave/0039_tend_election_grammar.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/extension_wave/0049_stable_shelf_order_for_prefix_reuse.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/memory_system_v1/0009_assertion_identity_and_batch_read_contract.md +0 -0
- {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
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/memory_system_v1/0011_cross_backend_parity_conformance_suite.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/memory_system_v1/0013_store_concurrency_and_thread_safety_contract.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/memory_system_v1/0014_embedding_space_integrity_manifest.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/memory_system_v1/0017_memory_journal_and_scope_bindings_layer.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/memory_system_v1/0018_neurotransmitter_attention_strengthen_weaken_decay.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/memory_system_v1/0019_hybrid_retrieval_channels_fts_vector_exact.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/memory_system_v1/0020_reconstruction_shelf_and_selection_traces.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/memory_system_v1/0021_memory_records_and_remember_api.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/memory_system_v1/0022_probe_and_bounded_source_expansion.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/memory_system_v1/0023_maintenance_sleep_consolidate_dream.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/memory_system_v1/0024_memory_system_facade_and_consumer_migration.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/memory_system_v1/0025_graph_backend_decision_record_memgraph_rejected.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/memory_system_v1/0026_spreading_activation_and_working_set.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/memory_system_v1/0027_runtime_seam_contract_v1.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/memory_system_v1/0029_sleep_reactivity_dreams_as_reaction.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/memory_system_v1/0030_fork_comparison_adoption_wave.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/memory_system_v1/0031_second_fork_pass_and_lifecycle_closure.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/memory_system_v1/0036_third_pass_extension_wave.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/subconscious_wave/0032_dream_subconscious_lifecycle.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/subconscious_wave/0033_world_model_orientation_cards.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/subconscious_wave/0034_situate_temporal_relational_reconstruction.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/completed/subconscious_wave/0035_lessons_layer_conventions.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/deprecated/001_semantics_aligned_memory_record_conventions.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/deprecated/003_bounded_graph_traversal_over_triples.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/deprecated/006_deterministic_anchor_and_facet_index.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/planned/extension_wave/README.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/planned/knowledge_graph_convergence/0050_entity_registry_identity_and_reversible_merges.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/planned/knowledge_graph_convergence/0051_claim_lifecycle_and_revision_log.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/planned/knowledge_graph_convergence/0052_document_knowledge_retrieval.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/planned/knowledge_graph_convergence/0055_notes_and_diary_layer_for_consumers.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/planned/knowledge_graph_convergence/0056_ledger_provenance_contract_and_revision_log.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/planned/knowledge_graph_convergence/0057_one_mind_per_plane_sqlite_home.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/planned/knowledge_graph_convergence/0058_home_store_performance_indexes_vectors.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/planned/subconscious_wave/README.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/proposed/extension_wave/0040_recurrence_probe_and_presentation_fold.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/proposed/extension_wave/0041_loss_absence_anchors.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/proposed/extension_wave/0042_explain_recall_serving_contract.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/proposed/extension_wave/0043_mind_health_report.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/proposed/extension_wave/0044_origin_time_axis_for_imports.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/proposed/extension_wave/0045_n_party_memory_contract.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/proposed/extension_wave/0046_transcript_adoption_verb.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/proposed/extension_wave/0047_cue_hygiene_at_recall_boundary.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/proposed/extension_wave/0048_writer_forensics_for_homes.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/proposed/extension_wave/README.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/proposed/memory_system_v1/0012_lancedb_backend_hardening_and_explicit_schema.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/proposed/memory_system_v1/0015_capabilities_extensions_and_deterministic_export_import.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/proposed/memory_system_v1/0016_semantics_vocabulary_validation_and_aliasing_module.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/proposed/memory_system_v1/0028_lateral_inhibition_theory.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/backlog/proposed/memory_system_v1/README.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/development.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/docs/getting-started.md +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/examples/realistic_session.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/attention.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/channels.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/cognition_health.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/concept_anchor.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/disposal.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/dream_resolution.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/drive_grouping.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/drive_pressure.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/embedding_pin.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/embeddings.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/embeddings_openai_compat.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/engine_manifest.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/feelings_reads.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/folds.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/gradation.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/graph/__init__.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/graph/backend.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/graph/provenance.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/graph/revisions.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/journal_common.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/mind_mass.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/models.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/origin_diversity.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/reconstruct.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/render_order.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/selection.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/self_component.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/sleep_policy.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/spark.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/spreading.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/store.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/store_tuning.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/system_access.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/system_valence.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/text_tokens.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/vector_matrix.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/src/abstractmemory/vector_scoring.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/bench/bench_graph.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/bench/bench_store.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/golden/pre_identity_wave_result.json +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/graph_support.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/realistic_fixtures.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_access_counts.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_alive_drives.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_anchored_summon.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_attention.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_audit_wave.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_binding_visibility.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_clean_owner_keys.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_close_assertion.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_co_use_trails.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_cognition_health.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_commitments.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_consolidation.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_drive_grouping.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_drive_pressure.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_embedding_pin.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_engine_manifest.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_explain_recall.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_familiarity.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_feelings_reads.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_gradation.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_graph_conformance.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_graph_e2e.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_graph_performance.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_graph_provenance.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_graph_revisions.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_home_lease_contract.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_home_open_is_a_read.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_identity_review.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_identity_self.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_in_memory_query_text_fallback.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_journal_backends.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_keyword_fts.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_lancedb_triple_store.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_lessons_layer.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_maintenance.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_mind_mass.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_narrow_assertion.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_origin_diversity.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_participants_channel.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_probe.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_realistic_lmstudio.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_recall_reads.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_recent_records.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_records.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_redigestion.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_render_order.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_replay_idempotency.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_seam_addendum.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_seam_contracts.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_situate.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_spark.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_spreading.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_sqlite_triple_store.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_stm_union.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_store_performance.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_system.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_tend.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_term_canonicalization.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_triple_store_limits.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_valence_gradation.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_vector_encoding_marker.py +0 -0
- {abstractmemory-0.4.0 → abstractmemory-0.5.0}/tests/test_vector_matrix.py +0 -0
- {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.
|
|
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).
|
|
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
|
-
-
|
|
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) |
|