AbstractRuntime 0.14.0__tar.gz → 0.15.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.
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/CHANGELOG.md +57 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/PKG-INFO +18 -3
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/README.md +16 -1
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/README.md +1 -0
- abstractruntime-0.15.0/docs/adr/0011_memory_facade_is_the_complete_host_surface_for_abstractmemory.md +131 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/adr/README.md +2 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/api.md +23 -1
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/README.md +4 -2
- abstractruntime-0.15.0/docs/backlog/completed/0855_prefix_stability_contract_of_consecutive_llm_calls.md +36 -0
- abstractruntime-0.15.0/docs/backlog/completed/0856_memory_facade_and_ledger_provenance.md +167 -0
- abstractruntime-0.15.0/docs/backlog/planned/0857_entity_direct_memory_writes_provenance.md +38 -0
- abstractruntime-0.15.0/docs/integrations/abstractmemory.md +195 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/llms-full.txt +244 -2
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/llms.txt +2 -1
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/pyproject.toml +5 -2
- abstractruntime-0.15.0/release-notes.md +54 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/scripts/generate_llms_full.py +1 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/core/models.py +4 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/core/runtime.py +82 -4
- abstractruntime-0.15.0/src/abstractruntime/core/step_context.py +107 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/identity/diary.py +9 -2
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +9 -1
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractmemory/__init__.py +3 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +256 -4
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractmemory/identity_support.py +13 -0
- abstractruntime-0.15.0/src/abstractruntime/integrations/abstractmemory/memory_facade.py +755 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractmemory/seam_handlers.py +16 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/storage/base.py +107 -2
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/storage/json_files.py +291 -1
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/storage/ledger_chain.py +11 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/storage/ledger_slim.py +53 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/storage/observable.py +8 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/storage/offloading.py +21 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/storage/serialize.py +18 -1
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/storage/sqlite.py +70 -12
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +54 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/compiler.py +24 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/visual/executor.py +12 -0
- abstractruntime-0.15.0/tests/test_jsonl_row_index.py +228 -0
- abstractruntime-0.15.0/tests/test_ledger_get_record.py +210 -0
- abstractruntime-0.15.0/tests/test_llm_call_prefix_stability_contract.py +179 -0
- abstractruntime-0.15.0/tests/test_memory_facade.py +555 -0
- abstractruntime-0.15.0/tests/test_memory_revise.py +376 -0
- abstractruntime-0.15.0/tests/test_memory_step_provenance.py +270 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_packaging_extras.py +1 -1
- abstractruntime-0.15.0/tests/test_step_context.py +229 -0
- abstractruntime-0.14.0/release-notes.md +0 -67
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/.github/workflows/ci.yml +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/.github/workflows/release.yml +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/.gitignore +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/ACKNOWLEDGMENTS.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/CODE_OF_CONDUCT.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/CONTRIBUTING.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/LICENSE +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/ROADMAP.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/SECURITY.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/adr/0004_runtime_owns_run_scoped_media_execution_truth.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/adr/0005_runtime_owns_abstractcore_host_discovery_queries.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/adr/0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/adr/0007_runtime_relays_core_owned_model_residency_truth.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/adr/0008_integration_facades_are_the_complete_host_surface.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/adr/0010_one_replay_many_views.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/architecture.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/artifacts.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/automations.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/completed/001_runtime_kernel.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/completed/0030_runtime_host_facades_for_comms_telegram_and_tool_specs.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/completed/0032_runtime_durable_outbound_comms_truth.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/completed/0033_runtime_host_local_prompt_cache_export_import_surface.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/completed/0035_model_residency_provider_truth_for_local_http_clients.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/completed/0037_visualflow_generate_music_node_compiler_parity.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/completed/0039_runtime_music_structure_prompt_bool_contract.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/completed/003_wait_primitives.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/completed/0040_task_agnostic_local_residency_listing.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/completed/0041_runtime_hardware_extras_avoid_nonpermissive_document_stacks.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/completed/0042_core_vision_upscale_and_parameter_surface.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/completed/0043_runtime_vision_adapter_and_batch_surface.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/completed/004_scheduler_driver.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/completed/009_artifact_store.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/completed/010_examples_and_composition.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/completed/011_subworkflow_support.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/completed/019_runtime_host_facade_for_core_operator_surfaces.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/completed/020_runtime_gateway_install_boundary.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/completed/021_runtime_gateway_env_namespace_cleanup.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/completed/022_model_residency_control_plane.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/completed/023_truthful_local_media_residency_boundaries.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/completed/024_runtime_owned_run_scoped_media_execution.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/completed/028_runtime_bloc_kv_lifecycle_and_pruning.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/completed/029_runtime_music_generation_and_discovery_via_abstractcore.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/completed/0846_mlx_instance_scheduling_and_execution_controls.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/completed/0847_automations_v1_controller_contracts_occurrences_triggers.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/completed/0851_per_account_voice_stores.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/completed/0852_capability_refusals_are_not_retried.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/deprecated/0034_agent_runtime_convenience_constructor.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/deprecated/004_tests.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/deprecated/005_docs_updates.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/deprecated/README.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/planned/0070_standalone_wui_browser_session_security_contract.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/planned/0233_real_run_cancellation.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/planned/025_runtime_retention_and_purge_contract.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/planned/026_context_checkpoint_self_compression.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/planned/027_quote_provenance_discipline.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/planned/028_selective_artifact_rehydration.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/planned/0845_session_prompt_cache_resume_and_purge_contract.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/planned/0848_automations_v2_external_event_inbox_and_run_triggers.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/planned/0853_session_tool_policy_before_the_approval_wait.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/planned/0854_replay_view.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_portability/0065_portable_process_and_lock_layer.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_portability/0066_portable_io_and_media_reader.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_portability/README.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/0044_meta_analysis_record.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/0045_crash_replay_harness_and_ordering_invariant.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/0046_per_run_driver_exclusion.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/0047_indexed_idempotency_lookup.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/0048_durable_io_unification.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/0049_llm_client_mechanical_split.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/0050_control_sidecar_all_writers.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/0051_runtime_owned_durable_event_mailbox.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/0052_sync_store_event_loop_tripwire.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/0053_bounded_run_vars_growth.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/0054_runtime_health_counters.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/0055_jsonl_store_honesty.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/0064_prompt_cache_fingerprint_stability.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/0067_durable_write_discipline.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/0068_hot_path_store_reads.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/README.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/proposed/0031_runtime_tool_spec_adapters_for_gateway_and_mcp.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/proposed/0036_local_media_residency_bridge_to_core_residency.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/proposed/0038_core_server_pool_residency_affinity.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/proposed/0069_document_renderer_professional_figures.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/proposed/0849_conversation_search_tool_usage_outputs_and_thinking.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/proposed/0850_growing_automation_history_out_of_the_controller_ledger.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/proposed/runtime_systemic_reliability/0056_schema_version_and_quarantine_loading.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/proposed/runtime_systemic_reliability/0057_trust_boundary_stamp_registry.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/proposed/runtime_systemic_reliability/0058_terminal_run_archival_helper.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/proposed/runtime_systemic_reliability/0059_memory_span_handler_extraction.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/proposed/runtime_systemic_reliability/0060_visualflow_compiler_decomposition.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/proposed/runtime_systemic_reliability/0061_root_api_deprecation_machinery.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/proposed/runtime_systemic_reliability/0062_dependency_honesty_extras.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/proposed/runtime_systemic_reliability/0063_b3_envelope_lane_unification.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/backlog/proposed/runtime_systemic_reliability/README.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/email.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/entity-runtime.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/evidence.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/faq.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/getting-started.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/integrations/abstractcore.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/limits.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/manual_testing.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/mcp-worker.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/proposal.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/provenance.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/replay.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/snapshots.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/tool-approval.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/tools-comms.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/troubleshooting.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/docs/workflow-bundles.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/examples/01_hello_world.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/examples/02_ask_user.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/examples/03_wait_until.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/examples/04_multi_step.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/examples/05_persistence.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/examples/06_llm_integration.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/examples/07_react_agent.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/examples/README.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/mkdocs.yml +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/pytest.ini +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/scripts/backfill_diary_edges.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/scripts/regen_replay_conformance.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/__init__.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/automation_queries.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/automations/__init__.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/automations/adapters.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/automations/attention.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/automations/bundle.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/automations/bundles/automation-controller/flows/controller.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/automations/bundles/automation-controller/manifest.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/automations/commands.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/automations/consumers.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/automations/controller.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/automations/ledger.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/automations/models.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/automations/samples.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/automations/service.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/automations/wakes.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/conversation_search.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/core/__init__.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/core/config.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/core/effect_cancellation.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/core/event_keys.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/core/health.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/core/live_deltas.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/core/policy.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/core/progress_channel.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/core/publish.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/core/run_attribution.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/core/run_identity.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/core/run_lifecycle.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/core/run_origin.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/core/spec.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/core/tool_scope.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/core/vars.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/documents/__init__.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/documents/charts.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/documents/docx.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/documents/pdf.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/email/__init__.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/email/actions.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/email/automations.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/email/binding.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/email/feeder.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/email/frame.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/email/inbox.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/evidence/__init__.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/evidence/recorder.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/history_bundle.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/identity/__init__.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/identity/act_only.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/identity/chat.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/identity/communities.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/identity/digest.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/identity/entity_runtime.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/identity/fingerprint.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/identity/lease.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/identity/life.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/identity/memory_reader.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/identity/night_voice.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/identity/phase_graph.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/identity/phase_spec.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/identity/prelude.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/identity/prompt_overlay.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/identity/reflection.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/identity/spec/entity_phases.vendored.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/identity/substrate.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/identity/tool_effects.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/identity/tool_policy.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/identity/tools.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/identity/visit_workflow.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/integrations/__init__.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/__init__.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/agora_tools.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/command_sandbox_host.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/comms_facade.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/config_facade.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/data_registry_facade.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/discovery_facade.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/discovery_queries.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/email_facade.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/factory.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/host_facade.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/llm_client.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/local_helper_tools.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/mcp_facade.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/media_subprocess.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/output_specs.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/run_facade.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/server_facade.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/structured_facade.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/telegram_facade.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/tool_effects.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/tool_inventory_facade.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/voice_facade.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/voice_library.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractmemory/brain_handlers.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/mail_verbs.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/memory/__init__.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/memory/active_context.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/memory/active_memory.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/memory/compaction.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/memory/kg_packets.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/memory/memact_composer.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/memory/recall_levels.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/memory/token_budget.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/rendering/__init__.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/rendering/json_stringify.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/__init__.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/__init__.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/a2_delegated_approval_completed/expected_view.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/a2_delegated_approval_completed/manifest.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/a2_delegated_approval_completed/records.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/a2_delegated_approval_completed/runs.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/a_delegated_child_approval/expected_view.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/a_delegated_child_approval/manifest.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/a_delegated_child_approval/records.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/a_delegated_child_approval/runs.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/b_timer_without_resume/expected_view.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/b_timer_without_resume/manifest.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/b_timer_without_resume/records.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/b_timer_without_resume/runs.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/c_parallel_tool_batch/expected_view.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/c_parallel_tool_batch/manifest.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/c_parallel_tool_batch/records.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/c_parallel_tool_batch/runs.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/d_cancellation/expected_view.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/d_cancellation/manifest.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/d_cancellation/records.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/d_cancellation/runs.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/e2_structured_repeated_node/expected_view.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/e2_structured_repeated_node/manifest.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/e2_structured_repeated_node/records.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/e2_structured_repeated_node/runs.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/e_structured_output_agents/expected_view.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/e_structured_output_agents/manifest.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/e_structured_output_agents/records.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/e_structured_output_agents/runs.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/f_windowed_slim/expected_view.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/f_windowed_slim/manifest.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/f_windowed_slim/records.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/f_windowed_slim/runs.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/g_ask_user/expected_view.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/g_ask_user/manifest.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/g_ask_user/records.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/g_ask_user/runs.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/h_denied_approval/expected_view.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/h_denied_approval/manifest.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/h_denied_approval/records.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/h_denied_approval/runs.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/i_wait_kinds/expected_view.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/i_wait_kinds/manifest.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/i_wait_kinds/records.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/i_wait_kinds/runs.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/j_event_answered_then_pause/expected_view.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/j_event_answered_then_pause/manifest.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/j_event_answered_then_pause/records.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/j_event_answered_then_pause/runs.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/k_nested_delegation/expected_view.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/k_nested_delegation/manifest.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/k_nested_delegation/records.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/k_nested_delegation/runs.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/l_answer_then_completion/expected_view.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/l_answer_then_completion/manifest.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/l_answer_then_completion/records.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/l_answer_then_completion/runs.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/m_session_tool_policy/expected_view.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/m_session_tool_policy/manifest.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/m_session_tool_policy/records.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/conformance/m_session_tool_policy/runs.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/delta.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/executions.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/replay/view.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/scheduler/__init__.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/scheduler/convenience.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/scheduler/multi_store.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/scheduler/registry.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/scheduler/scheduler.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/session_history.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/session_turns.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/storage/__init__.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/storage/artifacts.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/storage/change_ring.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/storage/commands.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/storage/in_memory.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/storage/lease.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/storage/session_tool_policy.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/storage/snapshots.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/storage/steer_sidecar.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/triggers/__init__.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/triggers/cloudevents.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/triggers/connection_events.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/triggers/connections.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/triggers/email_received.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/triggers/event_frame.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/triggers/feed.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/triggers/manual.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/triggers/protocol.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/triggers/registry.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/triggers/schedule.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/triggers/webhook.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/turn_grounding.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/utils/__init__.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/utils/atomic_files.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/utils/file_filters.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/utils/workspace_paths.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/visual/execution_metrics.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/visual/function_library.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/visual/loop_back_check.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/visual/loop_limit_lowering.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/visual/pin_expressions.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/visual/reroute_lowering.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/workflow_bundle/models.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/workflow_bundle/packer.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/workflow_bundle/reader.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/src/abstractruntime/workflow_bundle/registry.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/README.md +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/automation_harness.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/conftest.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/email_wp2_support.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/fixtures/feeds/atom.xml +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/fixtures/feeds/rdf-not-a-feed.xml +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/fixtures/feeds/rss1-malformed.xml +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/fixtures/feeds/rss1.xml +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/fixtures/feeds/rss2.xml +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/fixtures/schedule_v1_corpus.json +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/live_email/conftest.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/live_email/live_email_support.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/live_email/test_email_live_runtime.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/media_endpoint_profile_probe.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_abstractcore_comms_facade.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_abstractcore_discovery_facade.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_abstractcore_host_facade.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_abstractcore_run_facade.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_abstractcore_server_facade.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_abstractcore_structured_facade.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_abstractcore_telegram_facade.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_active_consumers_index.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_active_context_policy.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_active_index.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_active_memory.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_agora_agent_alias_identity.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_agora_tools_http.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_analyze_media_addressing_and_walling.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_answer_user_effect.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_artifact_session_candidates.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_artifacts.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_automation_calendar_schedule.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_automation_commands.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_automation_controller.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_automation_controller_recovery.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_automation_definition.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_automation_discussion_isolation.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_automation_email_results.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_automation_growing_context.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_automation_index.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_automation_list_reads.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_automation_named_policy_compiler.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_automation_next_fire.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_automation_occurrence_input_resolver.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_automation_occurrence_recovery.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_automation_replay_read_only.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_automation_retry.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_automation_session_turns.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_automation_status.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_automation_tool_approval.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_browser_probe_target_walling.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_budget_law_no_unrequested_caps.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_capability_default_reasoning.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_chat_summarizer_integration.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_code_node_imports.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_code_node_restricted_python.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_command_sandbox_host_facade.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_command_store.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_compaction_helpers.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_compaction_summarizer_route.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_config_facade_models_engines.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_config_facade_voice_input_hint.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_control_adapter_while.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_controller_bundle_packaged.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_conversation_search.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_crash_ordering_inversions.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_create_if_absent.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_data_registry_facade.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_default_model_warmup_switch.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_default_tools_camera_gating.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_default_tools_comms_gating.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_default_tools_include_skim_files.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_default_tools_include_skim_folders.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_default_tools_include_skim_web.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_default_tools_search_files_executor.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_diary_capture.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_diary_write_rescue.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_directory_lease.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_disabled_toolsets_seam.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_discovery_survives_unbuildable_default.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_discovery_tts_unavailable_reason.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_discovery_voice_openai_api_key.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_discussion_session_anchor.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_document_markdown_tables.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_document_renderers_hr_quote.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_durable_toolsets.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_durable_write_discipline.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_effect_cancellation.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_effect_issuance_idempotency.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_effect_payload_stays_json_serializable.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_election_consequence_teaching.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_email_binding_and_refiner.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_email_feeder_batched.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_email_feeder_flags.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_email_gate_fixes.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_email_inbox_and_trigger.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_email_received_mailbox_id.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_email_regate_fixes.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_email_review_fixes.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_email_self_trigger_loop.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_email_stream_consumers.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_email_toolset_and_walls.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_emergence_experiment.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_emit_event_uses_wait_index.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_emit_event_without_workflow_registry.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_endpoint_profile_media_end_to_end.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_endpoint_profile_media_in_process.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_endpoint_profile_media_specs_keep_provider.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_endpoint_profile_route_context.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_entity_awake_memory_fixes.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_entity_brain_effects.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_entity_chat_driver.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_entity_chat_tools_reflection.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_entity_diary.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_entity_execute_tool.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_entity_fetch_url_tool.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_entity_history_window.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_entity_life_loop.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_entity_memory_richness.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_entity_phase_graph_conformance.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_entity_react_visit_window.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_entity_recent_memories.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_entity_runtime.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_entity_search_memory.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_entity_sleep_bound_and_yield_attribution.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_entity_substrate_resolution.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_entity_visit_honesty.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_entity_workspace_cap.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_entity_workspace_tools.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_event_index_cross_process.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_event_wait_index.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_every_path_bearing_tool_is_walled.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_evidence_recorder.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_evidence_recorder_post_policy_envelope.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_execute_command_output_offload.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_execution_capability_discovery.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_explicit_eject_other_clients.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_factory_default_retry_policy.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_format_repair_nudge.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_fresh_install_no_provider.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_gateway_facades_c4899.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_git_read_only_refiner.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_hf_process_residency_merge.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_history_window_multimodal.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_hot_path_store_reads.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_indexed_idempotency_lookup.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_integration_abstractcore.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_integrations_abstractcore.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_json_file_run_store_children_index.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_json_run_cache_bound.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_json_store_scan_memo.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_jsonl_ledger_recovery.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_jsonl_ledger_seq_cross_process.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_kg_learn_and_recall_contract.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_ledger_chain.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_ledger_cursor_invariants.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_ledger_record_slimming.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_ledger_subscription.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_live_token_deltas.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_llm_call_media_artifact_refs.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_llm_call_payload_shape_refusal.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_llm_call_requires_prompt.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_llm_call_response_schema_normalization.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_llm_call_structured_output_fallback.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_llm_call_text_phase_progress.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_llm_call_truncation_retry_contract.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_llm_call_use_context_appends_turn.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_llm_client_grounding_tail.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_llm_client_media_artifacts.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_llm_client_system_context.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_llm_client_tool_call_parsing.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_llm_retry_classification.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_llm_streaming_on_token.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_local_helper_tool_exposure.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_local_residency_host_sweep.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_mail_verbs.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_mailbox_index.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_max_iterations_ceiling.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_mcp_remote_tool_executor.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_mcp_runs_untrusted_and_facade.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_mcp_worker_logging.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_mcp_worker_security.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_mcp_worker_stdio.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_media_artifact_resolution.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_media_capability_default_routing.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_media_host_endpoint_resolver.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_media_only_requests_skip_text_client.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_media_subprocess.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_memact_composer_from_kg_result.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_memory_appraise_handler.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_memory_communities.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_memory_kg_packets.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_memory_kg_predicate_aliasing.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_memory_kg_query_packetization_restart.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_memory_note_effect.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_memory_query_effect.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_memory_query_rich_filters.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_memory_seam_handlers.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_memory_seam_sqlite_durability.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_memory_tag_effect.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_mlx_generation_serialization.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_mlx_process_residency_merge.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_model_eject_cancel.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_model_residency_clean_switch.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_model_residency_control_plane.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_model_residency_lock_and_context_estimate.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_multi_store_scheduler.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_multimodal_abstractcore_integration.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_native_mlx_application_wiring.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_native_mlx_execution_controls_live.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_native_tool_channel.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_night_voice.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_no_default_provider_refusal_ux.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_occurrence_named_inputs.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_occurrence_samples.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_offload_answer_chain_c4978.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_offloaded_node_traces_report_unknown_not_zero.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_offloading.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_parallel_readonly_tool_execution.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_pause_resume.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_pdf_unicode_rendering.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_personal_cycle.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_phantom_attachment_index.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_phase_graph_artifact_control.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_phase_graph_obedience.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_phase_vocabulary_migration.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_pooled_client_strips_construction_cache_key.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_prompt_cache_export_import.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_prompt_cache_fingerprint_stability.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_prompt_cache_modules.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_prompt_cache_posture_inheritance.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_prompt_cache_thinking_and_prompt_only.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_prompt_overlay.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_provider_endpoint_profile_resolution.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_provider_pin_routing_isolation.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_publish_event.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_queryable_run_store.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_r12_workspace_sandbox.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_read_idle_threading.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_readoption_experiment.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_real_integration.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_realize_election.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_recall_levels_policy.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_remote_client_cancel.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_remote_llm_client.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_remote_speculation_defaults.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_rendering_agent_trace_report.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_rendering_json_stringify.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_replay_conformance.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_replay_conformance_package.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_replay_cursor_token.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_replay_delta_cost.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_replay_invariants.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_replay_review_findings.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_replay_tool_policy.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_report_branding.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_resident_media_generation.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_resume_concurrent_same_wait.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_retry_idempotency.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_run_history_bundle.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_run_index_workspace_root.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_run_mutation_lock.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_run_origin.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_run_scoped_tool_policy.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_run_store_change_token.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_run_tool_scope_ceiling.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_runtime_browser_session_boundary.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_runtime_default_provider_model_refresh.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_runtime_effect_invocation_trace.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_runtime_health_and_bounded_vars.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_runtime_install_boundary.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_runtime_node_traces.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_runtime_start_seeds_tool_support.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_runtime_tick_step_gate.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_schedule_run.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_schedule_v1_corpus.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_schedule_v2_calendar.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_scheduler.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_send_email_refiner.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_send_email_self_default_policy.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_session_history.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_session_prompt_cache_attribution.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_session_prompt_cache_visibility.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_session_route_stamp.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_session_start_cost.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_session_tool_policy.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_shell_tool_exposure.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_snapshots.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_speculation_inheritance.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_speculation_reaches_provider_construction.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_sqlite_ledger_store.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_start_subworkflow_async_wait.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_steer_sidecar.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_storage_deletion.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_streamed_voice_namespace.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_structured_output_schema_enum.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_subworkflow.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_terminal_effect_completion.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_thinking_inheritance.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_tool_approval_executor.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_tool_approval_resume_executes.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_tool_approval_wait_key_identity.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_tool_calls_idempotency_keys.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_tool_catalog.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_tool_descriptor_registry.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_tool_executor_argument_sanitization.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_tool_executor_error_output_detection.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_tool_executor_filename_alias.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_tool_executor_read_file_aliases.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_tool_executor_timeout.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_tool_inventory_facade.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_tool_invoke_effect.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_tool_policy_and_mounts.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_tool_wait_allowlist_safety.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_topic_election_world_model.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_trace_context_propagation.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_trigger_cloudevents.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_trigger_connection_listening.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_trigger_connections.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_trigger_feed.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_trigger_registry.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_trigger_schedule_math.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_trigger_webhook.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_trusted_run_index.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_turn_grounding_byte_stability.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_turn_grounding_carriers_a3.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_vars_query_effect.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visit_ab_fixture.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visit_midturn_elections.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visit_midturn_resume.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visit_workflow.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visual_agent_skills_block_passthrough.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visual_entity_memory_nodes.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visual_flow_end_effect_only_persistence.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visual_llm_call_partial_override.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visual_loop_back_out_of_body.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visual_loop_limit_and_list_nodes.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visual_loop_limit_on_wire.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visual_memact_compose_node.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visual_reroute_lowering.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visual_set_vars_pins.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visual_unknown_node_type_refuses.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visual_wait_event_deadline_passthrough.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visualflow_add_message_builtin.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visualflow_agora_react_agent.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visualflow_call_tool_node.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visualflow_capability_routes_and_thinking.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visualflow_compiler_basic.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visualflow_continue_on_error.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visualflow_edit_json_schema_node.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visualflow_event_inbox_react_agent.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visualflow_file_nodes_workspace.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visualflow_function_library.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visualflow_get_element_node.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visualflow_get_random_element_node.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visualflow_get_var_node.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visualflow_has_tools_builtin.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visualflow_make_object_node.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visualflow_media_nodes.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visualflow_memory_effect_nodes.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visualflow_memory_source_pins.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visualflow_pin_expressions.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visualflow_prompt_only.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visualflow_random_nodes.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visualflow_schema_enum_switch.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visualflow_string_contains_replace.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_visualflow_tool_parameters_node.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_voice_library_facade.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_voice_openai_api_key_path.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_voice_stream_is_not_a_wait.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_w4_feelings_lens.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_wait_event_deadline.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_wait_event_prompt_metadata.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_wait_until_streak.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_wait_until_utc_normalization.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_workflow_bundle_registry.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_workspace_builtin_deny.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_workspace_context_allowed_workspaces.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_workspace_policy_absolute_reanchor.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_workspace_policy_allowlist_mode.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_workspace_prompt_context.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_workspace_read_only.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_workspace_writable_paths.py +0 -0
- {abstractruntime-0.14.0 → abstractruntime-0.15.0}/tests/test_write_chart.py +0 -0
|
@@ -7,6 +7,63 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.15.0] - 2026-10-28
|
|
11
|
+
|
|
12
|
+
Requires AbstractMemory 0.4.0 or newer (`abstractmemory.graph`). ADR 0011, backlog 0856.
|
|
13
|
+
|
|
14
|
+
### Upgrade notes (one-way)
|
|
15
|
+
|
|
16
|
+
- AbstractMemory 0.4.0 rewrites a SQLite home's JSON-text vectors as float32 BLOBs on first write; a 0.3.x reader then
|
|
17
|
+
finds no vectors (zero semantic hits, no error). Every process sharing a home or a plane moves to AbstractMemory 0.4.0
|
|
18
|
+
(and so AbstractRuntime 0.15.0) together. See the AbstractMemory 0.4.0 changelog.
|
|
19
|
+
- The JSON-file ledger writes a `ledger_<run_id>.idx` row index beside each ledger; older readers ignore it, and a
|
|
20
|
+
missing or stale index is rebuilt from the ledger.
|
|
21
|
+
|
|
22
|
+
### Added
|
|
23
|
+
|
|
24
|
+
- **Ledger row address** (on 0.14.0's per-run `seq`, ADR 0010): `LedgerStore.get_record(run_id, seq)` returns one
|
|
25
|
+
record ready to read (a terminal row's `$slim` markers resolved against its STARTED row, offloaded leaves
|
|
26
|
+
rehydrated); `find_started_record(run_id, step_id, before_seq=)`. SQLite reads by primary key; the JSON-file backend
|
|
27
|
+
keeps a per-run line-offset index and checks the seq persisted on the line, so a point read is a seek and one line
|
|
28
|
+
parse (0.05 ms at 10,000 rows instead of a 58 ms full parse), and a rewritten file is read by persisted seq, never
|
|
29
|
+
by position.
|
|
30
|
+
- **Step context**: an effect handler reads its own step with
|
|
31
|
+
`abstractruntime.core.step_context.current_step_context(run.run_id)`: `run_id`, `step_id`, `seq` of the attempt's
|
|
32
|
+
STARTED row, `node_id`, `attempt`, `effect_type`. Out of band like the progress callback; `None` outside a runtime
|
|
33
|
+
step; a nested runtime shadows it.
|
|
34
|
+
- **Memory facade** (`abstractruntime.integrations.abstractmemory.memory_facade`): `MemoryFacade` (`open_mind`, `stamp`,
|
|
35
|
+
`stamp_current_step`, `reconstruct_source`, `history`, `sources_of`, `derived_from_source`, `apply_revision`),
|
|
36
|
+
`is_real_run`, and the AbstractMemory names hosts use re-exported unchanged (`GATEWAY_NAMES`). Hosts no longer import
|
|
37
|
+
`abstractmemory`. `reconstruct_source` answers `ok`, `source_gone` or `unsupported`, never raises for a missing
|
|
38
|
+
source. See [AbstractMemory integration](docs/integrations/abstractmemory.md).
|
|
39
|
+
- **Provenance stamping**: `MEMORY_FORM`, `MEMORY_KG_ASSERT` and the `DIARY_WRITE` graph projection add a `sources`
|
|
40
|
+
list to the provenance they write: the `step` ref `(run_id, seq, step_id)` of the writing effect, an `artifact` ref
|
|
41
|
+
for the verbatim / `span_id`, a `diary_entry` ref for a projection. The legacy flat keys stay. A synthetic run id
|
|
42
|
+
(`chat-<session_id>`, `diary:<entity_id>`, ...) is never a `run`/`step` ref: the home-direct chat path carries
|
|
43
|
+
artifact or diary-entry refs only.
|
|
44
|
+
- **`MEMORY_REVISE`** (`EffectType.MEMORY_REVISE`, VisualFlow node `memory_revise`): one revision of a mind (assert /
|
|
45
|
+
close / narrow ops) applied atomically through `MemoryGraph.apply_revision` as a workflow step, its provenance
|
|
46
|
+
stamped with the step that applied it. Handler from `build_memory_kg_effect_handlers` (new optional `journal=`); a
|
|
47
|
+
store that is not a graph home answers a failed outcome naming AbstractMemory backlog 0057; an ungrounded revision
|
|
48
|
+
fails with `ProvenanceRequired`.
|
|
49
|
+
|
|
50
|
+
- **Source integrity** (architect pass): every ref the runtime stamps carries a `digest` (step: sha256 of the STARTED
|
|
51
|
+
record as written, also on the step context; artifact: the sha256 of its bytes; diary entry: the chain
|
|
52
|
+
`record_hash`), and `reconstruct_source` verifies it: new statuses `mismatch` (the bytes changed since the memory
|
|
53
|
+
named them) and `partial` (a `$slim` marker or an `{"$artifact": id}` leaf whose artifact is gone or uncheckable;
|
|
54
|
+
never `ok` with a hole). A step ref resolves only to its STARTED row (a rewritten JSON-file ledger answers
|
|
55
|
+
`source_gone`, never another row).
|
|
56
|
+
- **Owner partitions**: `MEMORY_REVISE` and `MEMORY_KG_ASSERT` write only the run's own owners (its run, its session,
|
|
57
|
+
the global owner); `MEMORY_REVISE` refuses `recorded_at` (record time is the store's); a replayed revision reports
|
|
58
|
+
the memory's sources, not the retry's step.
|
|
59
|
+
- **Persisted JSON-file row index** (`ledger_<run_id>.idx` beside the ledger): a fresh process reads a 100,000-row
|
|
60
|
+
ledger's row in 39 ms instead of 320 ms.
|
|
61
|
+
|
|
62
|
+
### Changed
|
|
63
|
+
|
|
64
|
+
- `AbstractMemory>=0.4.0` (was `>=0.3.2`).
|
|
65
|
+
- SQLite `find_started_record` reads newest-first with `LIMIT 1` (0.01 ms at 10,000 rows instead of 3.5 ms).
|
|
66
|
+
|
|
10
67
|
## [0.14.0] - 2026-10-27
|
|
11
68
|
|
|
12
69
|
Two features: the replay view with a durable per-run ledger cursor, and the session tool policy.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: AbstractRuntime
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.15.0
|
|
4
4
|
Summary: AbstractRuntime: a durable graph runner designed to pair with AbstractCore.
|
|
5
5
|
Project-URL: AbstractCore (website), https://www.abstractcore.ai/
|
|
6
6
|
Project-URL: AbstractRuntime (GitHub), https://github.com/lpalbou/abstractruntime
|
|
@@ -21,7 +21,7 @@ Classifier: Programming Language :: Python :: 3.12
|
|
|
21
21
|
Classifier: Programming Language :: Python :: 3.13
|
|
22
22
|
Requires-Python: >=3.10
|
|
23
23
|
Requires-Dist: abstractcore>=2.30.0
|
|
24
|
-
Requires-Dist: abstractmemory>=0.
|
|
24
|
+
Requires-Dist: abstractmemory>=0.4.0
|
|
25
25
|
Requires-Dist: abstractsemantics>=0.0.5
|
|
26
26
|
Requires-Dist: anyio<5.0.0,>=4.12.1
|
|
27
27
|
Requires-Dist: httpx<1.0.0,>=0.28.1
|
|
@@ -55,10 +55,25 @@ Description-Content-Type: text/markdown
|
|
|
55
55
|
|
|
56
56
|
It is designed for long-running workflows that must survive restarts and explicitly model blocking (human input, timers, external events, subworkflows) without keeping Python stacks alive.
|
|
57
57
|
|
|
58
|
-
**Version:** 0.
|
|
58
|
+
**Version:** 0.15.0 • **Python:** 3.10+
|
|
59
59
|
|
|
60
60
|
**Status:** pre-1.0 (API may evolve). For production use, pin versions and follow `CHANGELOG.md`.
|
|
61
61
|
|
|
62
|
+
## What's new in 0.15.0
|
|
63
|
+
|
|
64
|
+
- **Memory facade** (`abstractruntime.integrations.abstractmemory.memory_facade.MemoryFacade`): the one
|
|
65
|
+
host surface for AbstractMemory 0.4.0's memory graph (open a mind, stamp provenance, reconstruct a
|
|
66
|
+
source, history, revisions); hosts no longer import `abstractmemory`. ADR 0011. See
|
|
67
|
+
[docs/integrations/abstractmemory.md](docs/integrations/abstractmemory.md).
|
|
68
|
+
- **`MEMORY_REVISE`** effect and `memory_revise` VisualFlow node: one atomic revision of a mind
|
|
69
|
+
(assert / close / narrow) as a workflow step, stamped with the step that applied it.
|
|
70
|
+
- **Ledger provenance**: `LedgerStore.get_record(run_id, seq)` point reads, a step context for
|
|
71
|
+
effect handlers, and a digested `step` / `artifact` / `diary_entry` source ref on every memory
|
|
72
|
+
write the runtime performs (`reconstruct_source` answers `ok`, `partial`, `mismatch`,
|
|
73
|
+
`source_gone` or `unsupported`).
|
|
74
|
+
- Upgrade note: requires AbstractMemory 0.4.0, whose vector re-encoding is one-way; move every
|
|
75
|
+
process sharing a memory home together.
|
|
76
|
+
|
|
62
77
|
## What's new in 0.14.0
|
|
63
78
|
|
|
64
79
|
- **Replay view** (`abstractruntime.replay`): one deterministic reducer turns a run tree's ledger
|
|
@@ -4,10 +4,25 @@
|
|
|
4
4
|
|
|
5
5
|
It is designed for long-running workflows that must survive restarts and explicitly model blocking (human input, timers, external events, subworkflows) without keeping Python stacks alive.
|
|
6
6
|
|
|
7
|
-
**Version:** 0.
|
|
7
|
+
**Version:** 0.15.0 • **Python:** 3.10+
|
|
8
8
|
|
|
9
9
|
**Status:** pre-1.0 (API may evolve). For production use, pin versions and follow `CHANGELOG.md`.
|
|
10
10
|
|
|
11
|
+
## What's new in 0.15.0
|
|
12
|
+
|
|
13
|
+
- **Memory facade** (`abstractruntime.integrations.abstractmemory.memory_facade.MemoryFacade`): the one
|
|
14
|
+
host surface for AbstractMemory 0.4.0's memory graph (open a mind, stamp provenance, reconstruct a
|
|
15
|
+
source, history, revisions); hosts no longer import `abstractmemory`. ADR 0011. See
|
|
16
|
+
[docs/integrations/abstractmemory.md](docs/integrations/abstractmemory.md).
|
|
17
|
+
- **`MEMORY_REVISE`** effect and `memory_revise` VisualFlow node: one atomic revision of a mind
|
|
18
|
+
(assert / close / narrow) as a workflow step, stamped with the step that applied it.
|
|
19
|
+
- **Ledger provenance**: `LedgerStore.get_record(run_id, seq)` point reads, a step context for
|
|
20
|
+
effect handlers, and a digested `step` / `artifact` / `diary_entry` source ref on every memory
|
|
21
|
+
write the runtime performs (`reconstruct_source` answers `ok`, `partial`, `mismatch`,
|
|
22
|
+
`source_gone` or `unsupported`).
|
|
23
|
+
- Upgrade note: requires AbstractMemory 0.4.0, whose vector re-encoding is one-way; move every
|
|
24
|
+
process sharing a memory home together.
|
|
25
|
+
|
|
11
26
|
## What's new in 0.14.0
|
|
12
27
|
|
|
13
28
|
- **Replay view** (`abstractruntime.replay`): one deterministic reducer turns a run tree's ledger
|
|
@@ -27,6 +27,7 @@ In this repo, the AbstractCore wiring lives under `src/abstractruntime/integrati
|
|
|
27
27
|
- `manual_testing.md` — manual smoke tests and how to run the test suite
|
|
28
28
|
- `artifacts.md` — Runtime artifact identity, descriptors, provenance, catalog search, and access stats
|
|
29
29
|
- `integrations/abstractcore.md` — wiring `LLM_CALL` / `TOOL_CALLS`, the `config_facade` models/engines/host-jobs passthroughs for hosts, the `structured_facade` response_format check for hosts, cached sessions with per-session prompt-cache listing/clearing, host memory snapshots, model-residency listings, locks and model switching, live token streaming, workspace-scoped tools, durable bloc prompt-cache control, media inputs, generated media outputs, video progress events, and tool approval waits via AbstractCore
|
|
30
|
+
- `integrations/abstractmemory.md` — the AbstractMemory memory facade (ADR 0011): open a mind, stamp provenance from the step context, reconstruct a source from the ledger (`get_record`), history and revisions, and the `MEMORY_REVISE` effect / `memory_revise` node
|
|
30
31
|
- `tools-comms.md` — enabling the optional comms toolset (email/WhatsApp/Telegram)
|
|
31
32
|
- `email.md` — email for each user: run-scoped account binding and the host resolver, sending without asking (self and pre-authorised recipients), the durable event inbox and mail feeder, the `email.received@1` trigger on the primary or any other mailbox of the user, mail verbs for flows (changes and sends only on a Read and write mailbox: `email_mailbox_read_only`, `email_mailbox_cannot_send`), and the send-email action
|
|
32
33
|
- `tool-approval.md` — tool risk tiers, the run-policy rank ceiling, the session tool policy (a conversation's standing approve/deny, applied before any approval wait), and per-call refiners (the `send_email` recipient rule: self and pre-authorised recipients)
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# ADR 0011: The memory facade is the complete host surface for AbstractMemory
|
|
2
|
+
|
|
3
|
+
Status: Accepted.
|
|
4
|
+
Date: 2026-10-27
|
|
5
|
+
|
|
6
|
+
## Context
|
|
7
|
+
|
|
8
|
+
AbstractMemory ADR 0003 (one semantic temporal graph, every memory tied to the ledger, every change a revision)
|
|
9
|
+
rules that every memory a mind holds names the ledger sources it came from, and that the verbatim of any source can
|
|
10
|
+
be reconstructed. AbstractMemory returns references; it never reads a ledger. The ledger, the artifacts, the diary
|
|
11
|
+
chain and the event inbox belong to this package, so two jobs land here:
|
|
12
|
+
|
|
13
|
+
- **Stamping.** The runtime performs memory writes for hosts (`MEMORY_FORM`, `MEMORY_KG_ASSERT`, the `DIARY_WRITE`
|
|
14
|
+
projection). The audit of 2026-10-27 (`abstractframework/untracked/memory-transition/audit/abstractruntime_entity.md`)
|
|
15
|
+
found that none of them wrote a ledger row address: they wrote `run_id`/`turn_id` (`writer_run_id` on the KG lane),
|
|
16
|
+
and on the home-direct entity path the `run_id` is a synthetic `chat-<session_id>` that no store can load. The
|
|
17
|
+
handlers could not do better: an effect handler received `(run, effect, default_next_node)` and nothing told it
|
|
18
|
+
which ledger row its own step had.
|
|
19
|
+
- **Reconstruction.** The only addressable ledger unit is `(run_id, seq)` (`step_id` is shared by a STARTED row and
|
|
20
|
+
its terminal row). `LedgerStore` had no read by address, `list()` did not return `seq`, terminal rows hold `$slim`
|
|
21
|
+
markers instead of payload bytes the STARTED row already holds, and oversized leaves may be offloaded to the
|
|
22
|
+
artifact store. Runs, ledgers, artifacts and inbox payloads are deletable.
|
|
23
|
+
|
|
24
|
+
And one boundary: ADR 0008 decision 2 already names AbstractMemory as a package a host must not import, yet no
|
|
25
|
+
AbstractMemory facade existed, so AbstractGateway imports `abstractmemory` directly (34 lines across 8 files in the
|
|
26
|
+
audit). The hole is the same as the one ADR 0008 closed for AbstractCore: a facade that lags what hosts need, with
|
|
27
|
+
no rule saying whose job it is to close the gap.
|
|
28
|
+
|
|
29
|
+
## Decision
|
|
30
|
+
|
|
31
|
+
1. **One host surface.** `abstractruntime.integrations.abstractmemory.memory_facade` (`MemoryFacade`) and the existing
|
|
32
|
+
effect-handler builders of `abstractruntime.integrations.abstractmemory` (`build_memory_kg_effect_handlers`,
|
|
33
|
+
`build_memory_seam_effect_handlers`, `build_entity_brain_effect_handlers`) are the ONLY surface through which a
|
|
34
|
+
host reaches AbstractMemory. The facade opens a mind (`MemoryFacade.open_mind(path)`: the SQLite triple store,
|
|
35
|
+
journal and `abstractmemory.graph.MemoryGraph` of one home), exposes the graph reads (`history`, `sources_of`,
|
|
36
|
+
`derived_from_source`), stamps provenance (`stamp`) and reconstructs sources (`reconstruct_source`). It is
|
|
37
|
+
complete by contract: a name or capability a host needs and cannot reach through it is a runtime defect, fixed by
|
|
38
|
+
adding it here and cutting a patch release. A host never imports `abstractmemory` to work around a gap (ADR 0008
|
|
39
|
+
decision 2 applies unchanged).
|
|
40
|
+
2. **The ledger row address is `(run_id, seq)`.** `LedgerStore.get_record(run_id, seq)` returns one record with its
|
|
41
|
+
`$slim` markers resolved against the STARTED row of the same `step_id` and, under `OffloadingLedgerStore`, its
|
|
42
|
+
offloaded `{"$artifact": id}` leaves rehydrated; `list(run_id)` records carry `"seq"`. `seq` is the per-run
|
|
43
|
+
record number of ADR 0010 (runtime 0.14.0): SQLite's key, persisted on each JSON-file line (lines written before
|
|
44
|
+
it read as their position), excluded from the hash chain. `append()` returns the seq of the row it wrote.
|
|
45
|
+
3. **The runtime stamps every memory write it performs.** The runtime publishes the current step to the handler it is
|
|
46
|
+
executing (`abstractruntime.core.step_context`: `run_id`, `seq` of the step's STARTED row, `step_id`, `node_id`,
|
|
47
|
+
`attempt`, `effect_type`). The memory writers stamp through `MemoryFacade.stamp`: a `step` ref `(run_id, seq,
|
|
48
|
+
step_id)` for the writing effect, an `artifact` ref for each verbatim artifact (`payload_ref`, `span_id`), a
|
|
49
|
+
`diary_entry` ref for a diary projection. The new `sources` list is additive; the legacy flat keys (`run_id`,
|
|
50
|
+
`turn_id`, `writer_run_id`, ...) stay so existing readers keep working.
|
|
51
|
+
4. **A synthetic run id is never a source.** A run id that no store can load (`chat-<sid>`, `diary:<eid>` used as a
|
|
52
|
+
run, `global_memory`) is never stamped as a `run` or `step` ref; a `seq` is never guessed. When the runtime cannot
|
|
53
|
+
name a ledger source, the stamp carries what is real (an artifact, a diary entry) or nothing new, and the graph
|
|
54
|
+
write path (`MemoryGraph.apply_revision`, `ProvenanceRequired`) refuses an ungrounded write. That refusal is the
|
|
55
|
+
intended outcome; fabricating a ref to pass it is a defect.
|
|
56
|
+
5. **Reconstruction never raises for a missing source.** `MemoryFacade.reconstruct_source(ref)` answers
|
|
57
|
+
`{"status": "ok", "kind", "content", "metadata"}`, `{"status": "source_gone", "reason"}` when the run, ledger row,
|
|
58
|
+
artifact, diary entry or event no longer exists, or `{"status": "unsupported", "reason"}` for a kind the host did
|
|
59
|
+
not give the facade a store for (or one with no indexed path, `message` today).
|
|
60
|
+
6. **The facade is additive within a minor line**, like ADR 0008 decision 4: a name, once exported, is not removed
|
|
61
|
+
without a deprecation note and a major or minor bump.
|
|
62
|
+
|
|
63
|
+
## Consequences
|
|
64
|
+
|
|
65
|
+
### Positive
|
|
66
|
+
- Every memory the runtime forms in a real run can be traced to the exact ledger row (and artifact) it came from,
|
|
67
|
+
and that row reads back verbatim with one call.
|
|
68
|
+
- A host's import-boundary test for AbstractMemory becomes a true gate, as it is for AbstractCore.
|
|
69
|
+
- Deleted sources are a typed answer, so a reader can say "the source of this memory is gone" instead of failing.
|
|
70
|
+
|
|
71
|
+
### Negative
|
|
72
|
+
- The facade needs AbstractMemory's graph package (`abstractmemory.graph`, AbstractMemory 0.4.0) for `open_mind`,
|
|
73
|
+
`stamp` and the graph reads; the memory writers stamp through it, so the runtime's AbstractMemory floor moves to
|
|
74
|
+
0.4.0 with the release that carries this ADR. `get_record` and the reconstruction of steps and artifacts need no
|
|
75
|
+
AbstractMemory at all.
|
|
76
|
+
- Memory written on the home-direct entity path (synthetic `chat-<sid>` runs) carries artifact refs only until that
|
|
77
|
+
path runs as real runs; derived writes outside any effect (world models, tending, the night passes) carry no
|
|
78
|
+
ledger source until backlog 0857 lands.
|
|
79
|
+
|
|
80
|
+
### Neutral
|
|
81
|
+
- `seq` is ADR 0010's per-run record number (persisted on JSON-file lines, excluded from hashes); the diary chain and
|
|
82
|
+
the record digests a memory stamps exclude it.
|
|
83
|
+
- The step context is out of band (a `ContextVar`, like the progress callback): effect payloads stay JSON and a
|
|
84
|
+
handler called directly, outside a runtime step, sees no step.
|
|
85
|
+
|
|
86
|
+
### Open decisions (operator)
|
|
87
|
+
- **Durability of a JSON-file row address: decided, option (a).** Of the two options (a) persist `seq` inside each
|
|
88
|
+
JSON-file record at append, (b) SQLite plane ledgers, runtime 0.14.0 shipped (a) with ADR 0010 (the per-run `seq`
|
|
89
|
+
is the durable cursor, persisted on each JSONL line under a file lock, excluded from the hash chain; lines written
|
|
90
|
+
before it read as their position). The row address therefore survives a rewrite: `get_record` and the JSON-file
|
|
91
|
+
row index find a record by its persisted `seq` (never by line position), and a step ref whose row was dropped
|
|
92
|
+
answers `source_gone`.
|
|
93
|
+
- **Memory ownership.** `owner_id` is a partition string derived from the run (`run`: the run id, `session`:
|
|
94
|
+
`session_memory_<sid>`, `global`: the plane's global owner). The runtime refuses a payload `owner_id` the run does
|
|
95
|
+
not derive, but a session id is still caller-chosen upstream. The full fix (owner = the principal, scope = the
|
|
96
|
+
kind of memory) is an operator decision (AbstractMemory ADR 0003 decisions 2/13 as amended).
|
|
97
|
+
|
|
98
|
+
## Enforcement
|
|
99
|
+
- Code review: a runtime memory write site that does not stamp through `MemoryFacade.stamp`, or that builds a
|
|
100
|
+
`run`/`step` ref from a run id it cannot load or a seq it did not get from the step context, is rejected.
|
|
101
|
+
- A host need that the facade does not cover becomes a runtime backlog item or PR before the host ships; the host's
|
|
102
|
+
changelog names the runtime version that closes it.
|
|
103
|
+
- The kernel import boundary (`tests/test_runtime_install_boundary.py`) stays green: AbstractMemory is imported
|
|
104
|
+
lazily, inside functions, everywhere in this package, the facade included; the facade imports no AbstractCore.
|
|
105
|
+
- AbstractGateway burns its direct `abstractmemory` imports down onto this facade (its boundary test, never an
|
|
106
|
+
exemption for a name the facade could carry).
|
|
107
|
+
|
|
108
|
+
## Validation
|
|
109
|
+
- `tests/test_ledger_get_record.py`: `get_record` on the SQLite and JSON-file backends (and under
|
|
110
|
+
`OffloadingLedgerStore`) returns the terminal row of a slimmed step with its payload rebuilt from the STARTED row;
|
|
111
|
+
`list()` carries `seq`; the diary hash chain still verifies.
|
|
112
|
+
- `tests/test_memory_facade.py`: `reconstruct_source` for a step whose terminal row was slimmed, an artifact, a
|
|
113
|
+
deleted artifact (`source_gone`), a run, a diary entry, an event, a message (`unsupported`); `stamp` adds a step
|
|
114
|
+
ref for a real run and none for a synthetic one; facade re-exports keep identity.
|
|
115
|
+
- `tests/test_memory_step_provenance.py`: an episode formed by `MEMORY_FORM` in a real run carries a `step` ref whose
|
|
116
|
+
`(run_id, seq)` resolves through `get_record` to that `MEMORY_FORM` step; a diary projection carries a
|
|
117
|
+
`diary_entry` ref; the synthetic chat path carries artifact refs only; `MEMORY_KG_ASSERT` carries the step ref.
|
|
118
|
+
|
|
119
|
+
## Backlog links
|
|
120
|
+
- Implementation: [0856](../backlog/completed/0856_memory_facade_and_ledger_provenance.md) (memory facade, ledger row
|
|
121
|
+
address, step context, stamping).
|
|
122
|
+
- Follow-up: [0857](../backlog/planned/0857_entity_direct_memory_writes_provenance.md) (entity writes outside any
|
|
123
|
+
effect: world models, tending, the night passes).
|
|
124
|
+
- AbstractMemory backlog 0056 (`abstractmemory.graph`: `SourceRef`, `Provenance`, `MemoryGraph`).
|
|
125
|
+
|
|
126
|
+
## Related
|
|
127
|
+
- ADR 0003 (tamper-evident hash chain: `seq` is excluded from the record hash), ADR 0008 (integration facades are the
|
|
128
|
+
complete host surface; this ADR is its AbstractMemory counterpart).
|
|
129
|
+
- AbstractMemory ADR 0002 (AbstractMemory owns the graph), ADR 0003 (one graph, ledger provenance, revisions).
|
|
130
|
+
- Root ADR 0007 (active context vs stored memory), ADR 0011 (`span_id` = `artifact_id`).
|
|
131
|
+
- AbstractGateway ADR 0001 (lower-level access through runtime facades).
|
|
@@ -22,6 +22,7 @@ When you ask "why is it designed this way?", the answer is in an ADR. ADRs are:
|
|
|
22
22
|
| 0007 | [Runtime Relays Core-Owned Model Residency Truth](0007_runtime_relays_core_owned_model_residency_truth.md) | Accepted | 2026-05-21 | Runtime reports loaded state only from AbstractCore residency truth |
|
|
23
23
|
| 0008 | [Integration Facades Are the Complete Host Surface](0008_integration_facades_are_the_complete_host_surface.md) | Accepted | 2026-10-27 | Every AbstractCore name or capability a host needs is surfaced by the runtime (facade re-export, typed refusal, backlog); a gap is a runtime patch, never a host import of a lower-level package |
|
|
24
24
|
| 0010 | [One Replay of the Ledger, Many Views](0010_one_replay_many_views.md) | Accepted | 2026-10-27 | `abstractruntime.replay` is the only reconstruction of run state from the ledger; hosts serve its view, clients render it; the per-run ledger `seq` is the durable cursor |
|
|
25
|
+
| 0011 | [The Memory Facade Is the Complete Host Surface for AbstractMemory](0011_memory_facade_is_the_complete_host_surface_for_abstractmemory.md) | Accepted | 2026-10-27 | Hosts reach AbstractMemory only through `memory_facade` and the effect-handler builders; the runtime stamps ledger provenance (step `(run_id, seq)`, artifact, diary entry) on every memory write it performs, never from a synthetic run id; reconstructing a deleted source answers `source_gone`, never raises |
|
|
25
26
|
|
|
26
27
|
## Relationship to Backlog
|
|
27
28
|
|
|
@@ -38,6 +39,7 @@ ADRs explain *why*. Backlog items explain *what* and *how*.
|
|
|
38
39
|
| 0007 | `backlog/completed/0035_model_residency_provider_truth_for_local_http_clients.md`, `backlog/proposed/0036_local_media_residency_bridge_to_core_residency.md` |
|
|
39
40
|
| 0008 | AbstractGateway backlog 1044 (mailbox access) and `tests/test_gateway_import_boundary.py`; runtime 0.13.1 `email_facade.resolve_srv_default` |
|
|
40
41
|
| 0010 | `backlog/planned/0854_replay_view.md`; AbstractGateway backlog 0943 (view routes), 0082 (durable cursor); framework root 0993 |
|
|
42
|
+
| 0011 | `backlog/completed/0856_memory_facade_and_ledger_provenance.md`, `backlog/planned/0857_entity_direct_memory_writes_provenance.md`; AbstractMemory backlog 0056 |
|
|
41
43
|
|
|
42
44
|
## Adding New ADRs
|
|
43
45
|
|
|
@@ -435,7 +435,28 @@ Docs: `integrations/abstractcore.md`.
|
|
|
435
435
|
|
|
436
436
|
Implementation: `src/abstractruntime/integrations/abstractmemory/effect_handlers.py`.
|
|
437
437
|
|
|
438
|
-
This provides handlers for `MEMORY_KG_*` effects (opt-in wiring layer)
|
|
438
|
+
This provides handlers for `MEMORY_KG_*` effects and `MEMORY_REVISE` (opt-in wiring layer):
|
|
439
|
+
`build_memory_kg_effect_handlers(store=, run_store=, now_iso=, journal=None)`. `MEMORY_REVISE` applies one revision of
|
|
440
|
+
a mind (assert / close / narrow ops) through `abstractmemory.graph.MemoryGraph`, stamped with the step that applied it;
|
|
441
|
+
VisualFlow node type `memory_revise`. Payload and result: [MEMORY_REVISE](integrations/abstractmemory.md#memory_revise-memory-reconsideration-as-a-workflow-step).
|
|
442
|
+
|
|
443
|
+
### AbstractMemory facade (host surface)
|
|
444
|
+
|
|
445
|
+
`abstractruntime.integrations.abstractmemory.memory_facade` is the only way a host reaches AbstractMemory (ADR 0011;
|
|
446
|
+
AbstractMemory 0.4.0+):
|
|
447
|
+
|
|
448
|
+
- `MemoryFacade.open_mind(path, *, embedder=None, **stores)`; `MemoryFacade(graph=, ledger_store=, run_store=,
|
|
449
|
+
artifact_store=, diary_store=, event_inbox=, runtime_id=)`; `.graph`, `.store`, `.journal`
|
|
450
|
+
- `stamp(provenance, *, run_id, seq=None, step_id=None, artifact_ids=(), runtime_id=None) -> dict` and
|
|
451
|
+
`stamp_current_step(provenance, *, run_id, artifact_ids=())`: add `step` / `run` / `artifact` SourceRefs, never for a
|
|
452
|
+
synthetic run id (`is_real_run`), never a guessed seq
|
|
453
|
+
- `reconstruct_source(ref) -> {"status": "ok" | "source_gone" | "unsupported", ...}`; never raises for a missing source
|
|
454
|
+
- `history(memory_id)`, `sources_of(memory_id)`, `derived_from_source(ref)`, `apply_revision(revision)`
|
|
455
|
+
- `GATEWAY_NAMES`: AbstractMemory names re-exported unchanged (`memory_facade.X is abstractmemory.X`), resolved lazily
|
|
456
|
+
|
|
457
|
+
Ledger row address: `LedgerStore.get_record(run_id, seq)` (slim markers resolved, offloaded leaves rehydrated),
|
|
458
|
+
`list()` records carry `"seq"`, `append()` returns it. Step context: `abstractruntime.core.step_context.current_step_context(run_id)`
|
|
459
|
+
inside an effect handler. Details: [integrations/abstractmemory.md](integrations/abstractmemory.md).
|
|
439
460
|
|
|
440
461
|
## Utilities (host UX)
|
|
441
462
|
|
|
@@ -449,6 +470,7 @@ This provides handlers for `MEMORY_KG_*` effects (opt-in wiring layer).
|
|
|
449
470
|
- `architecture.md` — component map + durability invariants
|
|
450
471
|
- `faq.md` — common questions and gotchas
|
|
451
472
|
- `integrations/abstractcore.md` — `LLM_CALL` / `TOOL_CALLS` wiring
|
|
473
|
+
- `integrations/abstractmemory.md` — memory facade, provenance stamping, `MEMORY_REVISE`
|
|
452
474
|
|
|
453
475
|
### Host ASGI serving
|
|
454
476
|
|
|
@@ -12,9 +12,9 @@ If you are new to the project, start with `../README.md` and `../architecture.md
|
|
|
12
12
|
|
|
13
13
|
## Counts
|
|
14
14
|
|
|
15
|
-
- Planned:
|
|
15
|
+
- Planned: 32
|
|
16
16
|
- Proposed: 14
|
|
17
|
-
- Completed:
|
|
17
|
+
- Completed: 39
|
|
18
18
|
- Deprecated: 13
|
|
19
19
|
- Recurrent: 0
|
|
20
20
|
|
|
@@ -93,6 +93,7 @@ mtime). The anticipated ADR ("an automation is its controller root run") is not
|
|
|
93
93
|
|
|
94
94
|
| ID | Item |
|
|
95
95
|
|----|------|
|
|
96
|
+
| 0856 | [Memory facade and ledger provenance](completed/0856_memory_facade_and_ledger_provenance.md): completed 2026-10-27, released in abstractruntime 0.15.0 (2026-10-28, PR #6 merge `88a584b`; floor AbstractMemory>=0.4.0); ADR 0011: `MemoryFacade` (open a mind, stamp, reconstruct a source), `LedgerStore.get_record(run_id, seq)` (JSON-file line-offset index), the step context, a `step` ref on every memory write the runtime performs, `MEMORY_REVISE` / node `memory_revise`. Follow-up 0857. |
|
|
96
97
|
| 0851 | [Per-account voice stores](completed/0851_per_account_voice_stores.md): completed 2026-10-27 (0.13.0); the runtime's voice catalog and voice library use its `voice_store_dir` / `voice_library_dirs`; real-weights E2E 9/9. |
|
|
97
98
|
| 0852 | [Capability refusals are not retried](completed/0852_capability_refusals_are_not_retried.md): completed 2026-10-27 (0.13.0); one engine call for a refused request. |
|
|
98
99
|
| 0847 | [Automations v1: controller, contracts, occurrences, triggers](completed/0847_automations_v1_controller_contracts_occurrences_triggers.md): completed 2026-09-27, moved from planned; UNRELEASED; `79d9bf6`…`d02578a`, 2957 passed / 26 skipped; reviews GO after fixes; E2E 9/9. |
|
|
@@ -147,6 +148,7 @@ mtime). The anticipated ADR ("an automation is its controller root run") is not
|
|
|
147
148
|
| 0848 | `planned/0848_automations_v2_external_event_inbox_and_run_triggers.md` (P2, after 0847's release; contracts pass 2026-09-27) |
|
|
148
149
|
| 0853 | `planned/0853_session_tool_policy_before_the_approval_wait.md` (P1; abstractruntime 0.14.0: a conversation's approve/deny stored per session and applied before any approval wait, with an `abstract.tool_policy_decision` ledger record; gateway routes and client wiring remain) |
|
|
149
150
|
| 0854 | `planned/0854_replay_view.md` (P0; abstractruntime 0.14.0 carries the reducer, the durable per-run `seq` cursor and the conformance cases; gateway routes and client migration remain; ADR 0010) |
|
|
151
|
+
| 0857 | `planned/0857_entity_direct_memory_writes_provenance.md` (P2; entity memory written outside any effect: world models, tending, night passes; follows 0856) |
|
|
150
152
|
| 0044 | `planned/runtime_systemic_reliability/0044_meta_analysis_record.md` (track source record) |
|
|
151
153
|
| 0045 | `planned/runtime_systemic_reliability/0045_crash_replay_harness_and_ordering_invariant.md` |
|
|
152
154
|
| 0046 | `planned/runtime_systemic_reliability/0046_per_run_driver_exclusion.md` |
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# 0855 — Prefix-stability contract of consecutive LLM calls (only trailing system riders may differ)
|
|
2
|
+
|
|
3
|
+
**Status**: completed on branch `fix/prefix-cache-reuse` (2026-10-27), UNRELEASED · **Priority**: P1 ·
|
|
4
|
+
**Created**: 2026-10-27
|
|
5
|
+
**Cross-package**: AbstractCore 0858 (native MLX snapshot before trailing riders: the provider half, must ship in a
|
|
6
|
+
Core release); root [1060](../../../../docs/backlog/recurrent/1060_gateway_security_resilience_and_latency_standing_duty.md)
|
|
7
|
+
(latency budget) and [1056](../../../../docs/backlog/proposed/1056_programmable_ai_systems_workflows_as_the_central_primitive.md).
|
|
8
|
+
|
|
9
|
+
## Why
|
|
10
|
+
Operator report 2026-10-27: a gateway agent run on a local MLX hybrid model re-prefilled the whole prompt at every
|
|
11
|
+
step (10 of 10 calls cold, 24,552 tokens at step 10). Audit of the run's ledger: the runtime's requests ARE
|
|
12
|
+
append-only — system prompt and tool list byte-identical across 11 calls, every message of call N present
|
|
13
|
+
unchanged in call N+1, the grounding envelope stamped once into the durable user turn — except one thing: the
|
|
14
|
+
session attachment index, a `system` rider re-injected at the TAIL on every call (`effect_handlers.py`, backlog
|
|
15
|
+
0212). That rider is the intended design; the cold calls came from the provider's snapshot including it (Core
|
|
16
|
+
0858). Nothing pinned the runtime's half of the contract, so a later change (a timestamp in the system prompt, the
|
|
17
|
+
index moved between turns, a reordered tool list) would silently re-create the same symptom on every backend.
|
|
18
|
+
|
|
19
|
+
## What shipped
|
|
20
|
+
- `tests/test_llm_call_prefix_stability_contract.py`, through the real `Runtime` (ledger grounding pass) and
|
|
21
|
+
`make_llm_call_handler` (attachment injection), with a session attachment and a clock that moves on every read:
|
|
22
|
+
across 4 consecutive tool-loop calls `system_prompt`, `tools` and generation params are identical; call N minus its
|
|
23
|
+
trailing system riders is a prefix of call N+1; no `system` message sits mid-history; a moving timestamp never
|
|
24
|
+
reaches the prefix. Red on regression (verified by mutation): a timestamp in the system prompt → 2 failed; the
|
|
25
|
+
index placed after the first user turn → 1 failed.
|
|
26
|
+
- The injection site documents the rider contract and names the Core seam.
|
|
27
|
+
|
|
28
|
+
## Limits (from the adversarial review)
|
|
29
|
+
- The test stops at the LLM-client seam (stub client): what `llm_client` does afterwards (grounding normalization,
|
|
30
|
+
synthetic/volatile key stripping) is not covered, and the transcript is built append-only by the test itself; the
|
|
31
|
+
agent adapter owns that shape. Follow-up: drive the real local client over a stub provider.
|
|
32
|
+
|
|
33
|
+
## Not changed (deliberately)
|
|
34
|
+
The index stays a trailing rider. Moving it into the history (after the turn's user message) would make the tool
|
|
35
|
+
loop restorable with today's Core but makes every cross-turn first call cold once Core 0858 ships; stamping it
|
|
36
|
+
durably would accumulate copies per turn.
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
# 0856 — Memory facade and ledger provenance: the host surface for AbstractMemory, the ledger row address, and a step ref on every memory write
|
|
2
|
+
|
|
3
|
+
**Status**: completed 2026-10-27, released in abstractruntime 0.15.0 (2026-10-28, PR #6 merge `88a584b`; floor AbstractMemory>=0.4.0) · **Priority**: P1 · **Created**: 2026-10-27
|
|
4
|
+
**Cross-package**: AbstractMemory ADR 0003 and backlog 0056 (`abstractmemory.graph`: `SourceRef`, `Provenance`,
|
|
5
|
+
`MemoryGraph`; AbstractMemory 0.4.0), AbstractGateway memory routes (`/api/gateway/memory/*` over this facade) and its
|
|
6
|
+
import-boundary burn-down, AbstractNote thin-client slice (step and artifact refs on note revisions). ADR:
|
|
7
|
+
[0011](../../adr/0011_memory_facade_is_the_complete_host_surface_for_abstractmemory.md).
|
|
8
|
+
|
|
9
|
+
## Why
|
|
10
|
+
Operator goal (2026-10-27, AbstractMemory ADR 0003): every derived memory is tied to the ledger's messages, events
|
|
11
|
+
and artifacts, so the verbatim source of any understanding, or of any change of understanding, can be reconstructed.
|
|
12
|
+
AbstractMemory stores references; resolving them is the runtime's job, because the runtime owns the ledger, the
|
|
13
|
+
artifacts, the diary chain and the event inbox. Hosts must reach AbstractMemory through the runtime (ADR 0008
|
|
14
|
+
decision 2), and no AbstractMemory facade existed.
|
|
15
|
+
|
|
16
|
+
## Current code reality (2026-10-27, `main` 93c45b4)
|
|
17
|
+
- `storage/base.py` `LedgerStore`: `append`, `list(run_id)`, `find_completed_result`; no read by address. SQLite
|
|
18
|
+
(`storage/sqlite.py`) has a `seq` primary key that `list()` does not return; JSONL has positions only.
|
|
19
|
+
- A step is a STARTED row and a terminal row sharing one `step_id` (`core/runtime.py`, `_execute_effect_with_retry`);
|
|
20
|
+
the terminal row is slimmed (`storage/ledger_slim.py`: `$slim` markers resolved against the STARTED payload);
|
|
21
|
+
oversized leaves are offloaded (`storage/offloading.py`, rehydrated only by `find_completed_result`).
|
|
22
|
+
- Effect handlers receive `(run, effect, default_next_node)`; nothing tells them their own ledger row. The publish
|
|
23
|
+
handler gets `step_id` as an extra argument.
|
|
24
|
+
- Memory provenance written today (audit 2026-10-27, `untracked/memory-transition/audit/abstractruntime_entity.md`
|
|
25
|
+
§2): `MEMORY_FORM` `run_id`/`turn_id` + the verbatim artifact as `payload_ref` (`seam_handlers._handle_form`),
|
|
26
|
+
`MEMORY_KG_ASSERT` `writer_run_id`/`writer_workflow_id`/`span_id` (`effect_handlers._handle_assert`), diary
|
|
27
|
+
projections `{source, entry_id}` + `origin` (`identity_support.project_diary_entry`). No ledger row address; on the
|
|
28
|
+
home-direct entity path the `run_id` is the synthetic `chat-<session_id>`.
|
|
29
|
+
- AbstractGateway imports `abstractmemory` directly in 34 lines across 8 files.
|
|
30
|
+
|
|
31
|
+
## Scope
|
|
32
|
+
In:
|
|
33
|
+
- `LedgerStore.get_record(run_id, seq)` (base default over `list()`, SQLite by primary key, JSONL by position,
|
|
34
|
+
`OffloadingLedgerStore` rehydrating, the decorators delegating); `$slim` markers resolved against the STARTED row of
|
|
35
|
+
the same `step_id`; `list()` records carry `"seq"` (ADR 0010's per-run number since 0.14.0, excluded from the record hash); `append()`
|
|
36
|
+
returns the seq it wrote when the backend knows it.
|
|
37
|
+
- `abstractruntime.core.step_context`: the runtime publishes the current step `(run_id, seq, step_id, node_id,
|
|
38
|
+
attempt, effect_type)` to the handler it executes (a `ContextVar`, out of band like the progress callback).
|
|
39
|
+
- `integrations/abstractmemory/memory_facade.py`: `MemoryFacade` (`open_mind`, `graph`/`store`/`journal`, `stamp`,
|
|
40
|
+
`reconstruct_source`, `history`/`sources_of`/`derived_from_source`), `is_real_run`.
|
|
41
|
+
- Stamping in `MEMORY_FORM`, `MEMORY_KG_ASSERT` and the `DIARY_WRITE` projection.
|
|
42
|
+
- The workflow-native primitive (operator, 2026-10-27: "workflows are the framework's central native primitive; memory
|
|
43
|
+
capture and reconsideration should be expressible as workflow steps/effects with ledger provenance"):
|
|
44
|
+
`EffectType.MEMORY_REVISE` (host handler in `build_memory_kg_effect_handlers` over `MemoryGraph.apply_revision`)
|
|
45
|
+
and the VisualFlow node `memory_revise`.
|
|
46
|
+
- Performance of the row address on the JSON-file backend (the gateway's default).
|
|
47
|
+
- ADR 0011, docs (`api.md`, `integrations/abstractmemory.md`), CHANGELOG.
|
|
48
|
+
|
|
49
|
+
Out:
|
|
50
|
+
- Writes outside any effect (world models, tending, the night passes): [0857](../planned/0857_entity_direct_memory_writes_provenance.md).
|
|
51
|
+
- Moving the memory writers onto `MemoryGraph.apply_revision` (AbstractMemory's convergence track); the gateway
|
|
52
|
+
routes and the gateway's import burn-down (AbstractGateway).
|
|
53
|
+
- A hash chain on conversation ledgers; real runs behind the home-direct entity driver.
|
|
54
|
+
|
|
55
|
+
## Validation
|
|
56
|
+
- Both backends (and the offloading decorator): `get_record` of a slimmed terminal row returns the STARTED payload
|
|
57
|
+
bytes; a mutant that returns the slimmed row unresolved fails; `list()` carries `seq`; the diary chain verifies.
|
|
58
|
+
- `reconstruct_source` on real temporary stores (`SqliteRunStore`, `SqliteLedgerStore`, `FileArtifactStore`,
|
|
59
|
+
`DiaryStore`, `JsonFileEventInbox`): ok / `source_gone` after deletion / `unsupported`.
|
|
60
|
+
- A real `Runtime` run: the episode formed by `MEMORY_FORM` carries a `step` ref that resolves through `get_record` to
|
|
61
|
+
that step; the KG assertion carries one; a diary projection carries a `diary_entry` ref; the synthetic chat path
|
|
62
|
+
carries artifact refs only. Each test fails with the stamping line removed.
|
|
63
|
+
|
|
64
|
+
## Report (2026-10-27)
|
|
65
|
+
|
|
66
|
+
Commits on `feat/memory-graph-facade` (after `76b1319` WIP): `de96ede` memory facade, `7b0d031` step context
|
|
67
|
+
installed, `dd9e924` stamping, `2574881` MEMORY_REVISE + node, `09db6f5` row-address performance, `76e9988` docs and
|
|
68
|
+
version, `9eea551` diary reads in `GATEWAY_NAMES`; this report.
|
|
69
|
+
|
|
70
|
+
What landed:
|
|
71
|
+
- `integrations/abstractmemory/memory_facade.py`: `MemoryFacade` (`open_mind`, `graph`/`store`/`journal`, `stamp`,
|
|
72
|
+
`stamp_current_step`, `apply_revision`, `history`/`sources_of`/`derived_from_source`, `reconstruct_source`),
|
|
73
|
+
`is_real_run`, `GATEWAY_NAMES` (43 names: the gateway's direct imports, including the diary reads `open_questions` /
|
|
74
|
+
`open_problems` / `open_ideas`, + the 8 graph names; every one exists in AbstractMemory, none left out), resolved by module `__getattr__` so the module never imports AbstractMemory at
|
|
75
|
+
import time.
|
|
76
|
+
- `core/runtime.py` `_execute_effect_with_retry` installs `effect_step_context(StepContext(...))` around the handler,
|
|
77
|
+
with the seq `append()` returned for the attempt's STARTED row.
|
|
78
|
+
- Stamping: `seam_handlers._handle_form`, `effect_handlers._handle_assert`, `identity_support.project_diary_entry`.
|
|
79
|
+
A caller `payload_ref` is an artifact ref only when the artifact store holds it (a payload_ref may name an
|
|
80
|
+
identity-core `.yaml` record). A private diary projection names its entry only (no origin by design).
|
|
81
|
+
- `MEMORY_REVISE` / `memory_revise`: contract in `docs/integrations/abstractmemory.md`. Caller `run`/`step` refs are
|
|
82
|
+
refused (runtime-owned); unknown payload keys are refused; the default `revision_id` hashes (run, node, scope,
|
|
83
|
+
owner, cause, ops) so a retried attempt is a no-op.
|
|
84
|
+
|
|
85
|
+
Performance (10,000 rows, ~10 MB JSON-file ledger, ~1 KB rows, Apple Silicon, warm cache; method:
|
|
86
|
+
fill one run's ledger with 5,000 STARTED/COMPLETED pairs through `append`, then the median of 20 calls each):
|
|
87
|
+
|
|
88
|
+
| | JSONL before | JSONL after | SQLite before | SQLite after |
|
|
89
|
+
|---|---|---|---|---|
|
|
90
|
+
| `get_record(seq)` | 58 ms | 0.05 ms | 0.02 ms | 0.01 ms |
|
|
91
|
+
| `find_started_record(step, before_seq=terminal)` (the slim-resolve path) | 58-72 ms (full parse) | 0.08 ms | 3.5 ms | 0.01 ms |
|
|
92
|
+
| `find_started_record(step)` unbounded, row in the middle | 72 ms | 12 ms | 11 ms | 3.4 ms |
|
|
93
|
+
| `find_started_record` worst case (first row) / miss | 72 ms | 24 ms / 7 ms | 11 ms | 10 ms |
|
|
94
|
+
| first read in a cold process (index build) | 58 ms | 48 ms | 0.3 ms | 0.3 ms |
|
|
95
|
+
|
|
96
|
+
JSONL: a per-run line-offset index (`_JsonlRowIndex`, 8 bytes per record, 128 runs LRU), written through by
|
|
97
|
+
`append`, extended by reading only the bytes another writer appended (keyed by inode + indexed size), rebuilt for a
|
|
98
|
+
recreated file; a torn trailing line falls back to the `list()` reading. `append` uses the index (not a full
|
|
99
|
+
`list()`) to count after a foreign write. SQLite: `find_started_record` reads newest-first with `LIMIT 1` (Python's
|
|
100
|
+
cursor prefetch made the unlimited query scan the rest of the run).
|
|
101
|
+
|
|
102
|
+
Tests: `test_memory_facade.py` (10), `test_step_context.py` (4), `test_memory_step_provenance.py` (7),
|
|
103
|
+
`test_memory_revise.py` (7), `test_jsonl_row_index.py` (6); each docstring lists the mutants checked by hand.
|
|
104
|
+
Full suite (`PYTHONPATH=src:<AbstractMemory graph worktree>/src`): `main` 3763 passed / 46 skipped / 0 failed; this
|
|
105
|
+
branch 3810 passed / 46 skipped / 0 failed (+47: the get_record, facade, step-context, provenance, MEMORY_REVISE and
|
|
106
|
+
row-index tests). `tests/test_packaging_extras.py` pins the new `AbstractMemory>=0.4.0` floor.
|
|
107
|
+
|
|
108
|
+
Seams and notes:
|
|
109
|
+
- `abstractmemory.graph.Provenance.from_dict` turned a STRING `derived_from` into a tuple of characters
|
|
110
|
+
(`tuple("m1")`); reported, fixed on the AbstractMemory branch (`c2f035f`), not worked around here.
|
|
111
|
+
- Review N1 (AbstractNote review): a tool approved by a human runs inside `Runtime.resume`, outside
|
|
112
|
+
`_execute_effect_with_retry`, so it saw no step context and its note carried no step ref. Fixed: the approval
|
|
113
|
+
resume publishes the waiting TOOL_CALLS step (`_waiting_step_context`: the WAITING row's `step_id`, the seq of ITS
|
|
114
|
+
STARTED row via `find_started_record`, `seq=None` when that row cannot be found, never guessed). Audit of the other
|
|
115
|
+
paths: WAIT_EVENT / WAIT_UNTIL / ASK_USER / subworkflow resumes only write the payload into vars (no handler or
|
|
116
|
+
tool runs; the next effect goes through `_execute_effect_with_retry`), terminal hooks are not effect handlers, the
|
|
117
|
+
publish / schedule handlers are effect handlers, and the tool executor's worker threads copy the context
|
|
118
|
+
(`contextvars.copy_context`). Test: `test_step_context.py::test_a_tool_run_by_an_approval_resume_sees_the_waiting_steps_started_row`
|
|
119
|
+
(SQLite and JSONL); the reviewer's AbstractNote proof script now records `ledger_seq` / `ledger_step_id` resolving to
|
|
120
|
+
the `note_capture` TOOL_CALLS STARTED row.
|
|
121
|
+
- `is_real_run` reuses AbstractMemory's `is_synthetic_run_id` / `SYNTHETIC_RUN_ID_PREFIXES` (9e2c231), compared
|
|
122
|
+
case-insensitively, plus the configured global memory owner; a test pins that the two packages agree.
|
|
123
|
+
- `llms-full.txt` was not regenerated (coredoc pass at release).
|
|
124
|
+
|
|
125
|
+
### Review fixes (2026-10-27: gateway review R5/R6, runtime review 3a)
|
|
126
|
+
- R1 `1779fa9`: MEMORY_REVISE normalizes caller ref kinds through `SourceRef` before refusing `run`/`step` ("STEP").
|
|
127
|
+
- R2 `7bd49ab`: a caller ref's `run_id` must be the executing run or absent.
|
|
128
|
+
- R3 `860eac7`: named artifacts must exist in the builder's new `artifact_store`; without one, a revision naming
|
|
129
|
+
artifacts is refused.
|
|
130
|
+
- R4 `e184633`: the default `revision_id` also hashes the caller's sources, derived_from, artifact_ids, occurred_at.
|
|
131
|
+
- R5 `e84be06`, `12b61c7`: `runtime_id` on the facade (`open_mind`, the KG / seam builders); a ref naming another
|
|
132
|
+
runtime (or any runtime, on a facade without one) is `unsupported`; lifted refs carry the facade's runtime_id.
|
|
133
|
+
- R6 `e84be06`: a `run` source's ledger is bounded (`limit` default 200, max 1000, `ledger_left_out`, `truncated`).
|
|
134
|
+
- R7 + R13 `af2ba20`: `stamp` screens caller refs (run/step dropped, synthetic run ids stripped, invalid refs
|
|
135
|
+
rejected, a flat run_id other than the stamped run never lifted; `rejected_sources` records each; never raises);
|
|
136
|
+
`is_real_run` reuses AbstractMemory's `is_synthetic_run_id`, case-insensitively.
|
|
137
|
+
- R8 `69fcccc`: parity test: every stamped dict reads back through `Provenance.from_legacy` (AbstractMemory 4c821b2).
|
|
138
|
+
- R9 `630b2ef`: the JSONL append ends a torn last line first.
|
|
139
|
+
- R10 `11630a9`: `coerce_ledger_seq` never truncates (3.9 is refused); seq is 1-based (a step ref's seq >= 1).
|
|
140
|
+
- R11 `a38324b`: a duplicate KG assertion's unrecorded sources are reported (`skipped_duplicate_rows[].lost_sources`).
|
|
141
|
+
- R14 `6f44bf1`: `metadata.unresolved_markers` on a step whose STARTED row is gone.
|
|
142
|
+
|
|
143
|
+
Notes (not fixed here):
|
|
144
|
+
- R12: the step context is a `ContextVar`. A handler that starts a plain `threading.Thread` gives that thread no
|
|
145
|
+
context (the thread sees None and stamps no step ref); the tool executor copies the context into its workers
|
|
146
|
+
(`contextvars.copy_context`), and a handler that spawns its own threads must do the same.
|
|
147
|
+
- R15: rows written by `MEMORY_KG_ASSERT` (and the seam writers) go through `store.add`, not through the graph, so
|
|
148
|
+
`MemoryGraph` does not know them until a revision adopts them (an `import`/`migration` revision); a `close` or
|
|
149
|
+
`narrow` revision on such a row needs that adoption first. Moving the writers onto `apply_revision` is the
|
|
150
|
+
convergence track (Out, above).
|
|
151
|
+
- Follow-up (R11): record a second source on an existing memory (a revision adopting the row with the new refs)
|
|
152
|
+
instead of reporting it as lost.
|
|
153
|
+
|
|
154
|
+
### Architect pass (2026-10-27)
|
|
155
|
+
Open operator decisions, written in ADR 0011 (Open decisions), not chosen here:
|
|
156
|
+
- JSON-file `seq` durability: DECIDED as option (a) by runtime 0.14.0 (ADR 0010, the persisted per-run `seq`); the
|
|
157
|
+
merge of 0.14.0 into this branch makes `get_record` and the row index read by persisted `seq` (a rewritten file
|
|
158
|
+
never answers another row).
|
|
159
|
+
- Owner = principal, scope = kind (B1's full fix); the runtime now refuses an `owner_id` the run does not derive.
|
|
160
|
+
|
|
161
|
+
C3 (persisted JSON-file row index, `ledger_<run_id>.idx`): 100,000-row run (87.5 MB), the architect's
|
|
162
|
+
`c_jsonl_ledger.py`, this machine: first `get_record` in a fresh process 320 ms -> 39 ms (the persisted index plus at
|
|
163
|
+
most 1/8 of the ledger's tail parsed); after 129 other runs evicted it from the 128-run cache 305 ms -> 42 ms; warm
|
|
164
|
+
point read 0.03 ms (unchanged); 100k appends 5.0-5.2 s -> 6.0 s (the index rewrites, a small multiple of its final
|
|
165
|
+
800 KB in total). The index is validated against the ledger (inode, indexed size inside the file and ending on a line
|
|
166
|
+
break, row count) and rebuilt otherwise; `delete` removes it.
|
|
167
|
+
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# 0857 — Entity memory written outside any effect carries no ledger source: world models, tending, the night passes
|
|
2
|
+
|
|
3
|
+
**Status**: planned · **Priority**: P2 · **Created**: 2026-10-27
|
|
4
|
+
**Cross-package**: AbstractMemory ADR 0003 (every memory is sourced or derived; `MemoryGraph.apply_revision` refuses an
|
|
5
|
+
ungrounded write) and its convergence track (moving writers onto revisions). ADR:
|
|
6
|
+
[0011](../../adr/0011_memory_facade_is_the_complete_host_surface_for_abstractmemory.md) (Consequences, Negative).
|
|
7
|
+
Follows [0856](../completed/0856_memory_facade_and_ledger_provenance.md).
|
|
8
|
+
|
|
9
|
+
## Why
|
|
10
|
+
0856 stamps a ledger source on every memory write the runtime performs INSIDE an effect (`MEMORY_FORM`,
|
|
11
|
+
`MEMORY_KG_ASSERT`, the `DIARY_WRITE` projection, `MEMORY_REVISE`). Entity homes also write derived memory by calling
|
|
12
|
+
AbstractMemory engines directly, outside any runtime step, so no step context exists and nothing names a source:
|
|
13
|
+
|
|
14
|
+
- `identity/chat.py` `world_model_update` (two sites) and `author_world_model`;
|
|
15
|
+
- `apply_tend_elections` (`identity/chat.py`, `integrations/abstractmemory/brain_handlers.py` `MEMORY_TEND`);
|
|
16
|
+
- the night passes `sleep_pass` / `dream_pass` (`identity/life.py` `_consolidate`, `brain_handlers.py`
|
|
17
|
+
`MEMORY_CONSOLIDATE`).
|
|
18
|
+
|
|
19
|
+
These memories are DERIVED: under ADR 0003 they must name the memories they were derived from (`derived_from`) or a
|
|
20
|
+
ledger source. Today they carry `actor` / `channel` / `author` only, so a reader cannot trace them to any verbatim,
|
|
21
|
+
and once the writers move onto `MemoryGraph.apply_revision` they would be refused (`ProvenanceRequired`).
|
|
22
|
+
|
|
23
|
+
## Scope
|
|
24
|
+
In:
|
|
25
|
+
- Run the derived writes that have an enclosing effect (`MEMORY_TEND`, `MEMORY_CONSOLIDATE`) with that effect's step
|
|
26
|
+
context and stamp its `step` ref through `MemoryFacade.stamp_current_step`.
|
|
27
|
+
- For the direct calls on the home-direct chat path and the life loop: either move them behind effects (a real run per
|
|
28
|
+
night pass / tend election, so a step ref exists), or pass `derived_from` = the memory ids the engine read, through
|
|
29
|
+
an AbstractMemory API that accepts it. Never a synthetic `chat-<sid>` run ref.
|
|
30
|
+
- Tests on a real home: a world-model update / tend election / night pass record names its sources or the memories it
|
|
31
|
+
was derived from, and `MemoryFacade.sources_of(..., transitive=True)` reaches a ledger source.
|
|
32
|
+
|
|
33
|
+
Out:
|
|
34
|
+
- Real runs behind the home-direct entity driver as a whole (its own item); the gateway's routes.
|
|
35
|
+
|
|
36
|
+
## Validation
|
|
37
|
+
- Each derived writer above leaves provenance that `MemoryFacade.sources_of` resolves to at least one ledger source
|
|
38
|
+
(directly or through `derived_from`); a test fails when the stamping line is removed.
|