AbstractRuntime 0.13.1__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.13.1 → abstractruntime-0.15.0}/CHANGELOG.md +127 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/PKG-INFO +30 -3
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/README.md +28 -1
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/README.md +3 -1
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/adr/0008_integration_facades_are_the_complete_host_surface.md +6 -0
- abstractruntime-0.15.0/docs/adr/0010_one_replay_many_views.md +104 -0
- abstractruntime-0.15.0/docs/adr/0011_memory_facade_is_the_complete_host_surface_for_abstractmemory.md +131 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/adr/README.md +5 -1
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/api.md +48 -1
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/README.md +6 -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/0853_session_tool_policy_before_the_approval_wait.md +59 -0
- abstractruntime-0.15.0/docs/backlog/planned/0854_replay_view.md +576 -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.15.0/docs/replay.md +113 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/tool-approval.md +58 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/llms-full.txt +464 -4
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/llms.txt +4 -2
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/pyproject.toml +5 -2
- abstractruntime-0.15.0/release-notes.md +54 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/scripts/generate_llms_full.py +2 -0
- abstractruntime-0.15.0/scripts/regen_replay_conformance.py +73 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/core/models.py +4 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/core/runtime.py +148 -8
- abstractruntime-0.15.0/src/abstractruntime/core/step_context.py +107 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/identity/diary.py +9 -2
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +196 -8
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractmemory/__init__.py +3 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +256 -4
- {abstractruntime-0.13.1 → 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.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractmemory/seam_handlers.py +16 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/__init__.py +30 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/__init__.py +51 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/a2_delegated_approval_completed/expected_view.json +842 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/a2_delegated_approval_completed/manifest.json +38 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/a2_delegated_approval_completed/records.json +2962 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/a2_delegated_approval_completed/runs.json +294 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/a_delegated_child_approval/expected_view.json +537 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/a_delegated_child_approval/manifest.json +34 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/a_delegated_child_approval/records.json +1052 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/a_delegated_child_approval/runs.json +149 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/b_timer_without_resume/expected_view.json +151 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/b_timer_without_resume/manifest.json +22 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/b_timer_without_resume/records.json +186 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/b_timer_without_resume/runs.json +26 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/c_parallel_tool_batch/expected_view.json +451 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/c_parallel_tool_batch/manifest.json +38 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/c_parallel_tool_batch/records.json +1171 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/c_parallel_tool_batch/runs.json +170 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/d_cancellation/expected_view.json +252 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/d_cancellation/manifest.json +32 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/d_cancellation/records.json +672 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/d_cancellation/runs.json +63 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/e2_structured_repeated_node/expected_view.json +521 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/e2_structured_repeated_node/manifest.json +28 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/e2_structured_repeated_node/records.json +1512 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/e2_structured_repeated_node/runs.json +162 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/e_structured_output_agents/expected_view.json +320 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/e_structured_output_agents/manifest.json +38 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/e_structured_output_agents/records.json +955 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/e_structured_output_agents/runs.json +132 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/f_windowed_slim/expected_view.json +293 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/f_windowed_slim/manifest.json +28 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/f_windowed_slim/records.json +194 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/f_windowed_slim/runs.json +131 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/g_ask_user/expected_view.json +248 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/g_ask_user/manifest.json +20 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/g_ask_user/records.json +428 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/g_ask_user/runs.json +134 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/h_denied_approval/expected_view.json +297 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/h_denied_approval/manifest.json +26 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/h_denied_approval/records.json +886 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/h_denied_approval/runs.json +155 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/i_wait_kinds/expected_view.json +498 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/i_wait_kinds/manifest.json +7 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/i_wait_kinds/records.json +487 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/i_wait_kinds/runs.json +124 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/j_event_answered_then_pause/expected_view.json +199 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/j_event_answered_then_pause/manifest.json +7 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/j_event_answered_then_pause/records.json +211 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/j_event_answered_then_pause/runs.json +31 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/k_nested_delegation/expected_view.json +267 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/k_nested_delegation/manifest.json +7 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/k_nested_delegation/records.json +404 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/k_nested_delegation/runs.json +72 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/l_answer_then_completion/expected_view.json +174 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/l_answer_then_completion/manifest.json +7 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/l_answer_then_completion/records.json +141 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/l_answer_then_completion/runs.json +22 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/m_session_tool_policy/expected_view.json +444 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/m_session_tool_policy/manifest.json +7 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/m_session_tool_policy/records.json +672 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/conformance/m_session_tool_policy/runs.json +34 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/delta.py +136 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/executions.py +125 -0
- abstractruntime-0.15.0/src/abstractruntime/replay/view.py +1332 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/storage/__init__.py +10 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/storage/base.py +133 -3
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/storage/in_memory.py +6 -2
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/storage/json_files.py +497 -8
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/storage/ledger_chain.py +20 -5
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/storage/ledger_slim.py +53 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/storage/observable.py +17 -3
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/storage/offloading.py +27 -2
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/storage/serialize.py +18 -1
- abstractruntime-0.15.0/src/abstractruntime/storage/session_tool_policy.py +443 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/storage/sqlite.py +118 -17
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +54 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/compiler.py +24 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/visual/executor.py +12 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_durable_write_discipline.py +2 -1
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_jsonl_ledger_recovery.py +6 -2
- abstractruntime-0.15.0/tests/test_jsonl_ledger_seq_cross_process.py +88 -0
- abstractruntime-0.15.0/tests/test_jsonl_row_index.py +228 -0
- abstractruntime-0.15.0/tests/test_ledger_cursor_invariants.py +318 -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.13.1 → abstractruntime-0.15.0}/tests/test_packaging_extras.py +1 -1
- abstractruntime-0.15.0/tests/test_replay_conformance.py +373 -0
- abstractruntime-0.15.0/tests/test_replay_conformance_package.py +25 -0
- abstractruntime-0.15.0/tests/test_replay_cursor_token.py +41 -0
- abstractruntime-0.15.0/tests/test_replay_delta_cost.py +48 -0
- abstractruntime-0.15.0/tests/test_replay_invariants.py +210 -0
- abstractruntime-0.15.0/tests/test_replay_review_findings.py +96 -0
- abstractruntime-0.15.0/tests/test_replay_tool_policy.py +88 -0
- abstractruntime-0.15.0/tests/test_session_tool_policy.py +376 -0
- abstractruntime-0.15.0/tests/test_step_context.py +229 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_trigger_webhook.py +4 -2
- abstractruntime-0.13.1/release-notes.md +0 -4
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/.github/workflows/ci.yml +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/.github/workflows/release.yml +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/.gitignore +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/ACKNOWLEDGMENTS.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/CODE_OF_CONDUCT.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/CONTRIBUTING.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/LICENSE +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/ROADMAP.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/SECURITY.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/adr/0004_runtime_owns_run_scoped_media_execution_truth.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/adr/0005_runtime_owns_abstractcore_host_discovery_queries.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/adr/0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/adr/0007_runtime_relays_core_owned_model_residency_truth.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/architecture.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/artifacts.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/automations.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/001_runtime_kernel.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/0030_runtime_host_facades_for_comms_telegram_and_tool_specs.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/0032_runtime_durable_outbound_comms_truth.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/0033_runtime_host_local_prompt_cache_export_import_surface.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/0035_model_residency_provider_truth_for_local_http_clients.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/0037_visualflow_generate_music_node_compiler_parity.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/0039_runtime_music_structure_prompt_bool_contract.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/003_wait_primitives.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/0040_task_agnostic_local_residency_listing.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/0041_runtime_hardware_extras_avoid_nonpermissive_document_stacks.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/0042_core_vision_upscale_and_parameter_surface.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/0043_runtime_vision_adapter_and_batch_surface.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/004_scheduler_driver.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/009_artifact_store.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/010_examples_and_composition.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/011_subworkflow_support.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/019_runtime_host_facade_for_core_operator_surfaces.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/020_runtime_gateway_install_boundary.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/021_runtime_gateway_env_namespace_cleanup.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/022_model_residency_control_plane.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/023_truthful_local_media_residency_boundaries.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/024_runtime_owned_run_scoped_media_execution.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/028_runtime_bloc_kv_lifecycle_and_pruning.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/029_runtime_music_generation_and_discovery_via_abstractcore.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/0846_mlx_instance_scheduling_and_execution_controls.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/0847_automations_v1_controller_contracts_occurrences_triggers.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/0851_per_account_voice_stores.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/0852_capability_refusals_are_not_retried.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/deprecated/0034_agent_runtime_convenience_constructor.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/deprecated/004_tests.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/deprecated/005_docs_updates.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/deprecated/README.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/0070_standalone_wui_browser_session_security_contract.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/0233_real_run_cancellation.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/025_runtime_retention_and_purge_contract.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/026_context_checkpoint_self_compression.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/027_quote_provenance_discipline.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/028_selective_artifact_rehydration.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/0845_session_prompt_cache_resume_and_purge_contract.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/0848_automations_v2_external_event_inbox_and_run_triggers.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_portability/0065_portable_process_and_lock_layer.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_portability/0066_portable_io_and_media_reader.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_portability/README.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/0044_meta_analysis_record.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/0045_crash_replay_harness_and_ordering_invariant.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/0046_per_run_driver_exclusion.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/0047_indexed_idempotency_lookup.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/0048_durable_io_unification.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/0049_llm_client_mechanical_split.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/0050_control_sidecar_all_writers.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/0051_runtime_owned_durable_event_mailbox.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/0052_sync_store_event_loop_tripwire.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/0053_bounded_run_vars_growth.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/0054_runtime_health_counters.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/0055_jsonl_store_honesty.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/0064_prompt_cache_fingerprint_stability.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/0067_durable_write_discipline.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/0068_hot_path_store_reads.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/README.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/proposed/0031_runtime_tool_spec_adapters_for_gateway_and_mcp.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/proposed/0036_local_media_residency_bridge_to_core_residency.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/proposed/0038_core_server_pool_residency_affinity.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/proposed/0069_document_renderer_professional_figures.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/proposed/0849_conversation_search_tool_usage_outputs_and_thinking.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/proposed/0850_growing_automation_history_out_of_the_controller_ledger.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/proposed/runtime_systemic_reliability/0056_schema_version_and_quarantine_loading.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/proposed/runtime_systemic_reliability/0057_trust_boundary_stamp_registry.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/proposed/runtime_systemic_reliability/0058_terminal_run_archival_helper.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/proposed/runtime_systemic_reliability/0059_memory_span_handler_extraction.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/proposed/runtime_systemic_reliability/0060_visualflow_compiler_decomposition.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/proposed/runtime_systemic_reliability/0061_root_api_deprecation_machinery.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/proposed/runtime_systemic_reliability/0062_dependency_honesty_extras.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/proposed/runtime_systemic_reliability/0063_b3_envelope_lane_unification.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/proposed/runtime_systemic_reliability/README.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/email.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/entity-runtime.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/evidence.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/faq.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/getting-started.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/integrations/abstractcore.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/limits.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/manual_testing.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/mcp-worker.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/proposal.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/provenance.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/snapshots.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/tools-comms.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/troubleshooting.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/workflow-bundles.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/examples/01_hello_world.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/examples/02_ask_user.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/examples/03_wait_until.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/examples/04_multi_step.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/examples/05_persistence.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/examples/06_llm_integration.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/examples/07_react_agent.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/examples/README.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/mkdocs.yml +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/pytest.ini +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/scripts/backfill_diary_edges.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/__init__.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/automation_queries.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/automations/__init__.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/automations/adapters.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/automations/attention.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/automations/bundle.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/automations/bundles/automation-controller/flows/controller.json +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/automations/bundles/automation-controller/manifest.json +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/automations/commands.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/automations/consumers.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/automations/controller.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/automations/ledger.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/automations/models.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/automations/samples.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/automations/service.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/automations/wakes.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/conversation_search.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/core/__init__.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/core/config.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/core/effect_cancellation.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/core/event_keys.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/core/health.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/core/live_deltas.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/core/policy.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/core/progress_channel.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/core/publish.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/core/run_attribution.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/core/run_identity.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/core/run_lifecycle.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/core/run_origin.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/core/spec.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/core/tool_scope.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/core/vars.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/documents/__init__.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/documents/charts.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/documents/docx.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/documents/pdf.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/email/__init__.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/email/actions.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/email/automations.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/email/binding.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/email/feeder.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/email/frame.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/email/inbox.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/evidence/__init__.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/evidence/recorder.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/history_bundle.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/identity/__init__.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/identity/act_only.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/identity/chat.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/identity/communities.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/identity/digest.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/identity/entity_runtime.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/identity/fingerprint.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/identity/lease.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/identity/life.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/identity/memory_reader.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/identity/night_voice.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/identity/phase_graph.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/identity/phase_spec.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/identity/prelude.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/identity/prompt_overlay.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/identity/reflection.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/identity/spec/entity_phases.vendored.json +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/identity/substrate.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/identity/tool_effects.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/identity/tool_policy.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/identity/tools.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/identity/visit_workflow.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/__init__.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/__init__.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/agora_tools.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/command_sandbox_host.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/comms_facade.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/config_facade.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/data_registry_facade.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/discovery_facade.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/discovery_queries.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/email_facade.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/factory.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/host_facade.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/llm_client.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/local_helper_tools.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/mcp_facade.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/media_subprocess.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/output_specs.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/run_facade.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/server_facade.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/structured_facade.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/telegram_facade.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/tool_effects.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/tool_inventory_facade.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/voice_facade.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/voice_library.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractmemory/brain_handlers.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/mail_verbs.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/memory/__init__.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/memory/active_context.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/memory/active_memory.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/memory/compaction.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/memory/kg_packets.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/memory/memact_composer.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/memory/recall_levels.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/memory/token_budget.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/rendering/__init__.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/rendering/json_stringify.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/scheduler/__init__.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/scheduler/convenience.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/scheduler/multi_store.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/scheduler/registry.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/scheduler/scheduler.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/session_history.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/session_turns.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/storage/artifacts.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/storage/change_ring.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/storage/commands.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/storage/lease.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/storage/snapshots.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/storage/steer_sidecar.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/triggers/__init__.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/triggers/cloudevents.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/triggers/connection_events.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/triggers/connections.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/triggers/email_received.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/triggers/event_frame.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/triggers/feed.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/triggers/manual.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/triggers/protocol.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/triggers/registry.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/triggers/schedule.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/triggers/webhook.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/turn_grounding.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/utils/__init__.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/utils/atomic_files.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/utils/file_filters.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/utils/workspace_paths.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/visual/execution_metrics.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/visual/function_library.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/visual/loop_back_check.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/visual/loop_limit_lowering.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/visual/pin_expressions.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/visual/reroute_lowering.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/workflow_bundle/models.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/workflow_bundle/packer.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/workflow_bundle/reader.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/workflow_bundle/registry.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/README.md +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/automation_harness.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/conftest.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/email_wp2_support.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/fixtures/feeds/atom.xml +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/fixtures/feeds/rdf-not-a-feed.xml +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/fixtures/feeds/rss1-malformed.xml +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/fixtures/feeds/rss1.xml +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/fixtures/feeds/rss2.xml +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/fixtures/schedule_v1_corpus.json +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/live_email/conftest.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/live_email/live_email_support.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/live_email/test_email_live_runtime.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/media_endpoint_profile_probe.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_abstractcore_comms_facade.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_abstractcore_discovery_facade.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_abstractcore_host_facade.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_abstractcore_run_facade.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_abstractcore_server_facade.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_abstractcore_structured_facade.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_abstractcore_telegram_facade.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_active_consumers_index.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_active_context_policy.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_active_index.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_active_memory.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_agora_agent_alias_identity.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_agora_tools_http.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_analyze_media_addressing_and_walling.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_answer_user_effect.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_artifact_session_candidates.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_artifacts.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_automation_calendar_schedule.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_automation_commands.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_automation_controller.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_automation_controller_recovery.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_automation_definition.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_automation_discussion_isolation.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_automation_email_results.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_automation_growing_context.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_automation_index.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_automation_list_reads.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_automation_named_policy_compiler.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_automation_next_fire.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_automation_occurrence_input_resolver.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_automation_occurrence_recovery.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_automation_replay_read_only.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_automation_retry.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_automation_session_turns.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_automation_status.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_automation_tool_approval.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_browser_probe_target_walling.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_budget_law_no_unrequested_caps.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_capability_default_reasoning.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_chat_summarizer_integration.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_code_node_imports.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_code_node_restricted_python.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_command_sandbox_host_facade.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_command_store.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_compaction_helpers.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_compaction_summarizer_route.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_config_facade_models_engines.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_config_facade_voice_input_hint.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_control_adapter_while.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_controller_bundle_packaged.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_conversation_search.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_crash_ordering_inversions.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_create_if_absent.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_data_registry_facade.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_default_model_warmup_switch.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_default_tools_camera_gating.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_default_tools_comms_gating.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_default_tools_include_skim_files.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_default_tools_include_skim_folders.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_default_tools_include_skim_web.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_default_tools_search_files_executor.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_diary_capture.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_diary_write_rescue.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_directory_lease.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_disabled_toolsets_seam.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_discovery_survives_unbuildable_default.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_discovery_tts_unavailable_reason.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_discovery_voice_openai_api_key.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_discussion_session_anchor.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_document_markdown_tables.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_document_renderers_hr_quote.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_durable_toolsets.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_effect_cancellation.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_effect_issuance_idempotency.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_effect_payload_stays_json_serializable.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_election_consequence_teaching.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_email_binding_and_refiner.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_email_feeder_batched.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_email_feeder_flags.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_email_gate_fixes.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_email_inbox_and_trigger.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_email_received_mailbox_id.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_email_regate_fixes.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_email_review_fixes.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_email_self_trigger_loop.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_email_stream_consumers.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_email_toolset_and_walls.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_emergence_experiment.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_emit_event_uses_wait_index.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_emit_event_without_workflow_registry.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_endpoint_profile_media_end_to_end.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_endpoint_profile_media_in_process.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_endpoint_profile_media_specs_keep_provider.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_endpoint_profile_route_context.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_entity_awake_memory_fixes.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_entity_brain_effects.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_entity_chat_driver.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_entity_chat_tools_reflection.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_entity_diary.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_entity_execute_tool.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_entity_fetch_url_tool.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_entity_history_window.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_entity_life_loop.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_entity_memory_richness.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_entity_phase_graph_conformance.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_entity_react_visit_window.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_entity_recent_memories.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_entity_runtime.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_entity_search_memory.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_entity_sleep_bound_and_yield_attribution.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_entity_substrate_resolution.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_entity_visit_honesty.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_entity_workspace_cap.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_entity_workspace_tools.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_event_index_cross_process.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_event_wait_index.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_every_path_bearing_tool_is_walled.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_evidence_recorder.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_evidence_recorder_post_policy_envelope.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_execute_command_output_offload.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_execution_capability_discovery.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_explicit_eject_other_clients.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_factory_default_retry_policy.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_format_repair_nudge.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_fresh_install_no_provider.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_gateway_facades_c4899.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_git_read_only_refiner.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_hf_process_residency_merge.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_history_window_multimodal.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_hot_path_store_reads.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_indexed_idempotency_lookup.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_integration_abstractcore.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_integrations_abstractcore.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_json_file_run_store_children_index.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_json_run_cache_bound.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_json_store_scan_memo.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_kg_learn_and_recall_contract.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_ledger_chain.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_ledger_record_slimming.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_ledger_subscription.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_live_token_deltas.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_llm_call_media_artifact_refs.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_llm_call_payload_shape_refusal.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_llm_call_requires_prompt.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_llm_call_response_schema_normalization.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_llm_call_structured_output_fallback.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_llm_call_text_phase_progress.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_llm_call_truncation_retry_contract.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_llm_call_use_context_appends_turn.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_llm_client_grounding_tail.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_llm_client_media_artifacts.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_llm_client_system_context.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_llm_client_tool_call_parsing.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_llm_retry_classification.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_llm_streaming_on_token.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_local_helper_tool_exposure.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_local_residency_host_sweep.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_mail_verbs.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_mailbox_index.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_max_iterations_ceiling.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_mcp_remote_tool_executor.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_mcp_runs_untrusted_and_facade.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_mcp_worker_logging.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_mcp_worker_security.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_mcp_worker_stdio.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_media_artifact_resolution.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_media_capability_default_routing.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_media_host_endpoint_resolver.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_media_only_requests_skip_text_client.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_media_subprocess.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_memact_composer_from_kg_result.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_memory_appraise_handler.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_memory_communities.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_memory_kg_packets.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_memory_kg_predicate_aliasing.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_memory_kg_query_packetization_restart.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_memory_note_effect.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_memory_query_effect.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_memory_query_rich_filters.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_memory_seam_handlers.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_memory_seam_sqlite_durability.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_memory_tag_effect.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_mlx_generation_serialization.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_mlx_process_residency_merge.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_model_eject_cancel.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_model_residency_clean_switch.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_model_residency_control_plane.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_model_residency_lock_and_context_estimate.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_multi_store_scheduler.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_multimodal_abstractcore_integration.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_native_mlx_application_wiring.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_native_mlx_execution_controls_live.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_native_tool_channel.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_night_voice.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_no_default_provider_refusal_ux.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_occurrence_named_inputs.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_occurrence_samples.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_offload_answer_chain_c4978.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_offloaded_node_traces_report_unknown_not_zero.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_offloading.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_parallel_readonly_tool_execution.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_pause_resume.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_pdf_unicode_rendering.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_personal_cycle.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_phantom_attachment_index.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_phase_graph_artifact_control.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_phase_graph_obedience.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_phase_vocabulary_migration.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_pooled_client_strips_construction_cache_key.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_prompt_cache_export_import.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_prompt_cache_fingerprint_stability.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_prompt_cache_modules.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_prompt_cache_posture_inheritance.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_prompt_cache_thinking_and_prompt_only.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_prompt_overlay.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_provider_endpoint_profile_resolution.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_provider_pin_routing_isolation.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_publish_event.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_queryable_run_store.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_r12_workspace_sandbox.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_read_idle_threading.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_readoption_experiment.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_real_integration.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_realize_election.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_recall_levels_policy.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_remote_client_cancel.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_remote_llm_client.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_remote_speculation_defaults.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_rendering_agent_trace_report.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_rendering_json_stringify.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_report_branding.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_resident_media_generation.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_resume_concurrent_same_wait.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_retry_idempotency.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_run_history_bundle.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_run_index_workspace_root.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_run_mutation_lock.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_run_origin.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_run_scoped_tool_policy.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_run_store_change_token.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_run_tool_scope_ceiling.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_runtime_browser_session_boundary.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_runtime_default_provider_model_refresh.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_runtime_effect_invocation_trace.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_runtime_health_and_bounded_vars.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_runtime_install_boundary.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_runtime_node_traces.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_runtime_start_seeds_tool_support.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_runtime_tick_step_gate.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_schedule_run.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_schedule_v1_corpus.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_schedule_v2_calendar.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_scheduler.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_send_email_refiner.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_send_email_self_default_policy.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_session_history.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_session_prompt_cache_attribution.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_session_prompt_cache_visibility.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_session_route_stamp.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_session_start_cost.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_shell_tool_exposure.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_snapshots.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_speculation_inheritance.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_speculation_reaches_provider_construction.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_sqlite_ledger_store.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_start_subworkflow_async_wait.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_steer_sidecar.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_storage_deletion.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_streamed_voice_namespace.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_structured_output_schema_enum.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_subworkflow.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_terminal_effect_completion.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_thinking_inheritance.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_tool_approval_executor.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_tool_approval_resume_executes.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_tool_approval_wait_key_identity.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_tool_calls_idempotency_keys.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_tool_catalog.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_tool_descriptor_registry.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_tool_executor_argument_sanitization.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_tool_executor_error_output_detection.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_tool_executor_filename_alias.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_tool_executor_read_file_aliases.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_tool_executor_timeout.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_tool_inventory_facade.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_tool_invoke_effect.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_tool_policy_and_mounts.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_tool_wait_allowlist_safety.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_topic_election_world_model.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_trace_context_propagation.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_trigger_cloudevents.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_trigger_connection_listening.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_trigger_connections.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_trigger_feed.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_trigger_registry.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_trigger_schedule_math.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_trusted_run_index.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_turn_grounding_byte_stability.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_turn_grounding_carriers_a3.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_vars_query_effect.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visit_ab_fixture.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visit_midturn_elections.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visit_midturn_resume.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visit_workflow.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visual_agent_skills_block_passthrough.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visual_entity_memory_nodes.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visual_flow_end_effect_only_persistence.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visual_llm_call_partial_override.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visual_loop_back_out_of_body.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visual_loop_limit_and_list_nodes.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visual_loop_limit_on_wire.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visual_memact_compose_node.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visual_reroute_lowering.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visual_set_vars_pins.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visual_unknown_node_type_refuses.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visual_wait_event_deadline_passthrough.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_add_message_builtin.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_agora_react_agent.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_call_tool_node.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_capability_routes_and_thinking.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_compiler_basic.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_continue_on_error.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_edit_json_schema_node.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_event_inbox_react_agent.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_file_nodes_workspace.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_function_library.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_get_element_node.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_get_random_element_node.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_get_var_node.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_has_tools_builtin.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_make_object_node.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_media_nodes.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_memory_effect_nodes.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_memory_source_pins.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_pin_expressions.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_prompt_only.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_random_nodes.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_schema_enum_switch.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_string_contains_replace.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_tool_parameters_node.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_voice_library_facade.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_voice_openai_api_key_path.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_voice_stream_is_not_a_wait.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_w4_feelings_lens.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_wait_event_deadline.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_wait_event_prompt_metadata.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_wait_until_streak.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_wait_until_utc_normalization.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_workflow_bundle_registry.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_workspace_builtin_deny.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_workspace_context_allowed_workspaces.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_workspace_policy_absolute_reanchor.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_workspace_policy_allowlist_mode.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_workspace_prompt_context.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_workspace_read_only.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_workspace_writable_paths.py +0 -0
- {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_write_chart.py +0 -0
|
@@ -7,6 +7,133 @@ 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
|
+
|
|
67
|
+
## [0.14.0] - 2026-10-27
|
|
68
|
+
|
|
69
|
+
Two features: the replay view with a durable per-run ledger cursor, and the session tool policy.
|
|
70
|
+
Upgrade note (one way): hash-chained JSONL ledgers written by 0.14.0 carry `seq` on each line, and
|
|
71
|
+
an older `verify_ledger_chain` reports those lines as tampered. Upgrade writers and verifiers together.
|
|
72
|
+
|
|
73
|
+
### Added
|
|
74
|
+
|
|
75
|
+
- **Replay view** (`abstractruntime.replay`, ADR 0010, backlog 0854; framework root 0993). One
|
|
76
|
+
pure, deterministic reducer turns a run tree's ledger records and snapshots into the view every
|
|
77
|
+
client renders (`replay_view_v1`).
|
|
78
|
+
- What the view holds:
|
|
79
|
+
- the run tree through delegation waits, with the workflow each run executes (bundle,
|
|
80
|
+
version, flow, the root's entrypoint);
|
|
81
|
+
- the status;
|
|
82
|
+
- the person-facing interaction: a delegated child's approval, a question, or a prompted
|
|
83
|
+
event, with the resume command to send;
|
|
84
|
+
- verbatim messages with their provenance (run, steps, seqs, artifacts);
|
|
85
|
+
- one activity per node execution (AbstractFlow's `executionIdFor` rules), with tool calls
|
|
86
|
+
matched to results;
|
|
87
|
+
- artifacts and usage.
|
|
88
|
+
- `$slim` pointers are resolved, and a windowed history is named in `warnings`.
|
|
89
|
+
- A wait is over when a resume OR a later step of the same run exists.
|
|
90
|
+
- `ReplayView.apply` folds newer records and returns a delta. `apply_delta` and `diff_views`
|
|
91
|
+
are the client side. `replay(all)` equals the fold of any chunking.
|
|
92
|
+
- Wait kinds agree with `automations.attention`. The person-facing kinds are tool_approval,
|
|
93
|
+
ask_user, and an event that carries a prompt. The non-person-facing kinds are delegation,
|
|
94
|
+
timer, job, pause, automation_wake and signal. The interaction carries `answer_payload`.
|
|
95
|
+
- A session tool policy's `abstract.tool_policy_decision` record is an activity
|
|
96
|
+
(`tool_policy`: allowed or denied by the conversation's policy, its revision and who set it),
|
|
97
|
+
never an interaction. The tool rows it names carry `decided_by: "session_policy"`.
|
|
98
|
+
- Every delta carries typed `changes` (status, interaction opened or closed, run, message,
|
|
99
|
+
activity, artifact, each with its run and seq), for push dispatch.
|
|
100
|
+
- Cursor tokens name each run by a collision-free prefix that is safe in a header.
|
|
101
|
+
`resolve_cursor_token` maps a token back.
|
|
102
|
+
- The conformance cases ship with the package (`abstractruntime.replay.conformance`), so a host
|
|
103
|
+
or a client port can run them. Guide: `docs/replay.md`.
|
|
104
|
+
- **Durable ledger cursor** (gateway backlog 0082). A JSONL append after a torn last line (a
|
|
105
|
+
crash mid-write) now starts a new line; before, the fragment and the whole new record were
|
|
106
|
+
dropped together:
|
|
107
|
+
- Every ledger store numbers a run's records (`seq`). `JsonlLedgerStore` persists the number
|
|
108
|
+
on each line, allocated under an advisory file lock, so two processes never take the same
|
|
109
|
+
seq. Lines written before the field existed read as their position.
|
|
110
|
+
- `LedgerStore.list_after(run_id=, after=, limit=)` works on every store: an indexed read on
|
|
111
|
+
SQLite, a byte-offset seek on JSONL. `append()` returns the seq.
|
|
112
|
+
- `ObservableLedgerStore` passes `seq` to subscribers.
|
|
113
|
+
- `SqliteLedgerStore.import_records` copies a ledger in and keeps its `seq` values (migration).
|
|
114
|
+
|
|
115
|
+
- **Session tool policy**: a conversation's standing "approve / deny without asking", applied before any approval
|
|
116
|
+
wait. `abstractruntime.storage.session_tool_policy` (`SqliteSessionToolPolicyStore`,
|
|
117
|
+
`InMemorySessionToolPolicyStore`, `session_policy_names`), `Runtime(session_tool_policy_store=...)` /
|
|
118
|
+
`Runtime.set_session_tool_policy_store()`. The TOOL_CALLS handler reads the run's session row once per batch: an
|
|
119
|
+
approved call runs with no wait, a denied call is refused with no wait, and each decision writes an
|
|
120
|
+
`abstract.tool_policy_decision` ledger record (who set the policy, when, which selector matched). It applies to
|
|
121
|
+
every run of the session (the run tree's root session: delegated children, resumes, restarts); approvals never
|
|
122
|
+
reach untrusted-input runs or automation occurrences (a deny does, and also wins over an approval that was shown
|
|
123
|
+
before it); never beyond the run's `allowed_tools`. Before this, "approve all" lived in each
|
|
124
|
+
client, which answered the wait after it arrived: the gate flashed in every app and in the ledger. See
|
|
125
|
+
[tool-approval.md](docs/tool-approval.md#session-tool-policy-a-conversations-standing-word).
|
|
126
|
+
|
|
127
|
+
### Changed
|
|
128
|
+
|
|
129
|
+
- Hash-chained ledgers: `seq` is persisted on each JSONL line and excluded from the hash by this
|
|
130
|
+
version's `compute_record_hash`. A verifier from an older version includes it, so it reports
|
|
131
|
+
every line written by this version as tampered. Upgrade every process that verifies a chain
|
|
132
|
+
(`verify_ledger_chain`) together with the writers.
|
|
133
|
+
- `LedgerStore.list()` records carry `seq`. A consumer that compared records to `asdict(record)`
|
|
134
|
+
sees one more key. The hash chain excludes `seq` (it is the store's position, assigned after
|
|
135
|
+
the hash).
|
|
136
|
+
|
|
10
137
|
## [0.13.1] - 2026-10-27
|
|
11
138
|
|
|
12
139
|
### Added
|
|
@@ -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,37 @@ 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
|
+
|
|
77
|
+
## What's new in 0.14.0
|
|
78
|
+
|
|
79
|
+
- **Replay view** (`abstractruntime.replay`): one deterministic reducer turns a run tree's ledger
|
|
80
|
+
into the view every client renders (status, the interaction to answer, messages, activities,
|
|
81
|
+
artifacts), with incremental deltas. Every ledger store now numbers records with a durable
|
|
82
|
+
per-run `seq` cursor (`list_after`). See [docs/replay.md](docs/replay.md).
|
|
83
|
+
- **Session tool policy**: a conversation's standing approve/deny is applied before any approval
|
|
84
|
+
wait, with an `abstract.tool_policy_decision` audit record. See
|
|
85
|
+
[docs/tool-approval.md](docs/tool-approval.md#session-tool-policy-a-conversations-standing-word).
|
|
86
|
+
- Upgrade note: hash-chained JSONL ledgers written by 0.14.0 fail an older `verify_ledger_chain`;
|
|
87
|
+
upgrade writers and verifiers together.
|
|
88
|
+
|
|
62
89
|
## AbstractFramework ecosystem
|
|
63
90
|
|
|
64
91
|
AbstractRuntime is one component of the wider [AbstractFramework](https://github.com/lpalbou/AbstractFramework) ecosystem:
|
|
@@ -4,10 +4,37 @@
|
|
|
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
|
+
|
|
26
|
+
## What's new in 0.14.0
|
|
27
|
+
|
|
28
|
+
- **Replay view** (`abstractruntime.replay`): one deterministic reducer turns a run tree's ledger
|
|
29
|
+
into the view every client renders (status, the interaction to answer, messages, activities,
|
|
30
|
+
artifacts), with incremental deltas. Every ledger store now numbers records with a durable
|
|
31
|
+
per-run `seq` cursor (`list_after`). See [docs/replay.md](docs/replay.md).
|
|
32
|
+
- **Session tool policy**: a conversation's standing approve/deny is applied before any approval
|
|
33
|
+
wait, with an `abstract.tool_policy_decision` audit record. See
|
|
34
|
+
[docs/tool-approval.md](docs/tool-approval.md#session-tool-policy-a-conversations-standing-word).
|
|
35
|
+
- Upgrade note: hash-chained JSONL ledgers written by 0.14.0 fail an older `verify_ledger_chain`;
|
|
36
|
+
upgrade writers and verifiers together.
|
|
37
|
+
|
|
11
38
|
## AbstractFramework ecosystem
|
|
12
39
|
|
|
13
40
|
AbstractRuntime is one component of the wider [AbstractFramework](https://github.com/lpalbou/AbstractFramework) ecosystem:
|
|
@@ -27,9 +27,10 @@ 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
|
-
- `tool-approval.md` — tool risk tiers, the run-policy rank ceiling, and per-call refiners (the `send_email` recipient rule: self and pre-authorised recipients)
|
|
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)
|
|
33
34
|
- `api.md#workflowbundles-flow-and-visualflow-distribution` — VisualFlow compiler APIs, media nodes, and document nodes (`read_pdf` / `write_pdf` / `write_docx`)
|
|
34
35
|
- `api.md#sessions-and-history` — session history replay: one window, the most recent 50,000 tokens of whole turns (`HISTORY_REPLAY_MAX_TOKENS`), returned as a `ReplayedHistory` whose `.report` records what was replayed and dropped
|
|
35
36
|
- `api.md#conversation-search` — keyword search over a plane's conversations (`ConversationSearch`): questions, answers and the turn's artifacts, one SQLite FTS5 trigram index per plane, incremental `sync` with a time budget, exact then fuzzy matching
|
|
@@ -41,6 +42,7 @@ In this repo, the AbstractCore wiring lives under `src/abstractruntime/integrati
|
|
|
41
42
|
- `entity-runtime.md` — per-entity runtimes for summoned entities: homes, the one-writer lease, act-only diary privacy (`$act_only` refs), durable visit waits with deadlines
|
|
42
43
|
- `evidence.md` — artifact-backed evidence capture for external-boundary tools
|
|
43
44
|
- `mcp-worker.md` — MCP worker CLI (`abstractruntime-mcp-worker`)
|
|
45
|
+
- `replay.md` — the replay view: one reconstruction of a run tree (status, the interaction to answer, messages, one activity per execution, artifacts, usage, the workflow it executes) that every client renders; the durable cursor (`seq`, `list_after`); conformance fixtures
|
|
44
46
|
- `snapshots.md` — snapshot/bookmark model and stores
|
|
45
47
|
- `provenance.md` — tamper-evident hash-chained ledger
|
|
46
48
|
- `limits.md` — runtime-aware `_limits` namespace and APIs
|
|
@@ -24,6 +24,12 @@ host needed, with no rule saying whose job it was to close the gap.
|
|
|
24
24
|
2. A host never works around a missing name by importing `abstractcore` directly, vendoring the
|
|
25
25
|
code, or guessing a replacement. It raises the gap to the runtime (backlog item or PR) and
|
|
26
26
|
pins the runtime floor that carries the fix.
|
|
27
|
+
The same holds one level down and for whole capabilities, not only names: when a host finds
|
|
28
|
+
a FEATURE or CAPABILITY missing (a voice operation, a mail verb, a media task, a lookup), the
|
|
29
|
+
runtime, which does the integration, surfaces it through a facade, a typed refusal
|
|
30
|
+
(`CapabilityUnavailableError`, a 501 with the install hint) or a backlog item. A missing
|
|
31
|
+
capability is never a reason for a host to import a lower-level package (AbstractCore,
|
|
32
|
+
AbstractVoice, AbstractMemory, their dependencies) directly.
|
|
27
33
|
3. A re-export is unchanged in identity (`facade.name is abstractcore.module.name`) and listed in
|
|
28
34
|
the facade's `__all__`; the facade documents which AbstractCore version introduced the name.
|
|
29
35
|
4. The facades are additive within a minor line: a name, once exported, is not removed without
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# ADR 0010: One replay of the ledger, many views
|
|
2
|
+
|
|
3
|
+
Status: Accepted.
|
|
4
|
+
Date: 2026-10-27
|
|
5
|
+
|
|
6
|
+
## Context
|
|
7
|
+
|
|
8
|
+
The run ledger is the record of a run. Every client that shows a run needs the same few facts
|
|
9
|
+
about it: its status, the approval or question it is waiting on, the replies, the tool calls and
|
|
10
|
+
the steps. Until this decision, each client worked those facts out for itself from raw ledger
|
|
11
|
+
records, run snapshots and its own memory. Panel-chat, the AbstractCode terminal client, the
|
|
12
|
+
desktop Assistant, the iPhone and watch apps, the Observer, AbstractFlow and both gateway
|
|
13
|
+
consoles each had their own reconstruction. The inventory, with file:line anchors, is in
|
|
14
|
+
[backlog 0854](../backlog/planned/0854_replay_view.md). The reconstructions disagreed on the same
|
|
15
|
+
run:
|
|
16
|
+
|
|
17
|
+
- 2026-09-29: a delegated child's tool approval showed as "Approval needed" on one client and as
|
|
18
|
+
"Running a tool" on another. A delegation wait displaced the person-facing wait, and a `$slim`
|
|
19
|
+
dedup pointer was left unresolved.
|
|
20
|
+
- 2026-10-04: a `wait_until` timer with no resume record left 182 of 3,278 runs showing "Waiting
|
|
21
|
+
for you" after they had completed.
|
|
22
|
+
- 2026-10-11: one Agent node execution showed as two steps, because nothing in the records names
|
|
23
|
+
the execution.
|
|
24
|
+
|
|
25
|
+
The operator's ruling (framework root backlog 0993,
|
|
26
|
+
`abstractframework/docs/backlog/planned/0993_one_ledger_replay_many_views.md`): "there should be
|
|
27
|
+
only one unified way to replay the ledger, on top of which we could have different views", and
|
|
28
|
+
"logic should not be in the thin client". Each client decides what to show and how to forward
|
|
29
|
+
the requests of the users and entities it serves.
|
|
30
|
+
|
|
31
|
+
Durability had a gap of its own. The SQLite ledger had a per-run `seq` and the JSONL ledger had
|
|
32
|
+
none. The gateway's cursor was a list position, and the file-to-SQLite migration renumbered
|
|
33
|
+
records (gateway backlog 0082).
|
|
34
|
+
|
|
35
|
+
## Decision
|
|
36
|
+
|
|
37
|
+
1. **One reducer, in the runtime.** `abstractruntime.replay` is the only code that turns ledger
|
|
38
|
+
records into run state for display:
|
|
39
|
+
- `replay(records_by_run, runs_by_id)` folds a run tree's records and durable snapshots into a
|
|
40
|
+
`ReplayView`.
|
|
41
|
+
- `ReplayView.apply(records)` folds newer records into it and returns the delta.
|
|
42
|
+
- `replay(all)` is `apply` over every record, so it equals folding the same records in chunks.
|
|
43
|
+
|
|
44
|
+
The reducer is pure and deterministic: no I/O and no clock, and its input is records plus
|
|
45
|
+
snapshots. Its JSON is versioned (`replay_view_v1`). A change in meaning is a new version,
|
|
46
|
+
never a silent change.
|
|
47
|
+
2. **The reducer owns these rules.** Each rule below was a divergence between clients:
|
|
48
|
+
- The run tree comes from delegation waits (`subworkflow:<id>`), `start_subworkflow` results
|
|
49
|
+
and the snapshots' `parent_run_id`. When the two disagree, the ledger's link wins.
|
|
50
|
+
- A wait is over when its run records a `resume` for its key OR any later step of the same run
|
|
51
|
+
exists. Observability events are not steps.
|
|
52
|
+
- The person-facing interaction is the newest open approval, question or prompted event
|
|
53
|
+
anywhere in the tree. A delegation, a timer or a pause never is one.
|
|
54
|
+
- Status precedence: a terminal snapshot, then the ledger's terminal record, then an open wait,
|
|
55
|
+
then running.
|
|
56
|
+
- `$slim` pointers are resolved against the STARTED record. A pointer that cannot be resolved
|
|
57
|
+
is dropped and named in `warnings`.
|
|
58
|
+
- Executions follow AbstractFlow's `executionIdFor` rules.
|
|
59
|
+
- Each run names the workflow it executes (`bundle_id@version:flow_id`; the root's flow is its
|
|
60
|
+
entrypoint). Workflows are the framework's native unit.
|
|
61
|
+
3. **The durable cursor is the per-run ledger `seq`.**
|
|
62
|
+
- Every ledger store numbers records 1, 2, 3, … per run. JSONL persists the number on append,
|
|
63
|
+
allocated under an advisory file lock. A line written before the field existed is numbered
|
|
64
|
+
by its position.
|
|
65
|
+
- Every store answers `list_after(run_id, after, limit)`.
|
|
66
|
+
- `SqliteLedgerStore.import_records` keeps `seq` across a migration.
|
|
67
|
+
- A view's cursor is the seq of each run in its tree. Its token `<run id prefix>:<seq>.…` is
|
|
68
|
+
the view's ETag and the SSE event id.
|
|
69
|
+
4. **Hosts serve the view, and clients render it.**
|
|
70
|
+
- AbstractGateway serves `GET /runs/{id}/view` (ETag, 304, `?at=<token>`) and
|
|
71
|
+
`GET /runs/{id}/view/stream` (one `view`, then `delta` events, `Last-Event-ID`). There is
|
|
72
|
+
one cached view per run tree, folded once per appended record and fanned out to every
|
|
73
|
+
subscriber, with no timed re-parse.
|
|
74
|
+
- Clients act through the host's commands. The view's `interaction.command` is the resume to
|
|
75
|
+
send. Clients hold no run state that the server could replay.
|
|
76
|
+
- A client may keep a local view only as a cache of these deltas (`apply_delta`). It never
|
|
77
|
+
builds one from raw records.
|
|
78
|
+
|
|
79
|
+
## Enforcement
|
|
80
|
+
|
|
81
|
+
- A client or host change that derives status, waits, tool rows or messages from raw ledger
|
|
82
|
+
records, outside `abstractruntime.replay`, conflicts with this ADR. The fix is a reducer change
|
|
83
|
+
with a fixture, or a view field.
|
|
84
|
+
- A reducer change that alters an existing fixture's expected view needs one of two things: the
|
|
85
|
+
fixture's diff in the PR and its reason, or a new `replay_view_vN` when the meaning of a field
|
|
86
|
+
changes.
|
|
87
|
+
- A new ledger store implements `list_after`, and its records carry `seq`. A migration between
|
|
88
|
+
stores preserves `seq`.
|
|
89
|
+
|
|
90
|
+
## Validation
|
|
91
|
+
|
|
92
|
+
- `tests/test_replay_conformance.py`: the conformance cases shipped in
|
|
93
|
+
`abstractruntime.replay.conformance` (redacted real ledgers and synthetic cases), each with its
|
|
94
|
+
expected view and hand-written semantic checks.
|
|
95
|
+
- `tests/test_replay_invariants.py`: replay equals fold over any chunking and interleaving,
|
|
96
|
+
idempotence, delta round trips, and header-safe cursor tokens.
|
|
97
|
+
- `tests/test_ledger_cursor_invariants.py` and `tests/test_jsonl_ledger_seq_cross_process.py`:
|
|
98
|
+
the invariants of gateway backlog 0082 at store level (completeness, `list_after` equals a
|
|
99
|
+
replay from the same cursor, cursor stability across reopen and migration, recovery), and dense
|
|
100
|
+
seqs under concurrent processes.
|
|
101
|
+
- AbstractGateway `tests/test_gateway_replay_view.py`, `tests/test_migrate_preserves_ledger_seq.py`
|
|
102
|
+
and the principal isolation matrix: the routes through the real app.
|
|
103
|
+
- Every client that renders runs runs the conformance fixtures in its CI once it migrates
|
|
104
|
+
(backlog 0854).
|
|
@@ -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).
|
|
@@ -20,7 +20,9 @@ When you ask "why is it designed this way?", the answer is in an ADR. ADRs are:
|
|
|
20
20
|
| 0005 | [Runtime Owns AbstractCore Host Discovery Queries](0005_runtime_owns_abstractcore_host_discovery_queries.md) | Accepted | 2026-05-20 | Hosts should ask Runtime for Core discovery/catalog snapshots |
|
|
21
21
|
| 0006 | [Runtime Owns Durable AbstractCore Bloc Prompt-Cache Control](0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md) | Accepted | 2026-05-20 | Hosts should use Runtime for durable bloc/KV controls and binding-aware execution |
|
|
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
|
-
| 0008 | [Integration Facades Are the Complete Host Surface](0008_integration_facades_are_the_complete_host_surface.md) | Accepted | 2026-10-27 | Every AbstractCore name a host needs is
|
|
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
|
+
| 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 |
|
|
24
26
|
|
|
25
27
|
## Relationship to Backlog
|
|
26
28
|
|
|
@@ -36,6 +38,8 @@ ADRs explain *why*. Backlog items explain *what* and *how*.
|
|
|
36
38
|
| 0006 | `backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md` |
|
|
37
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` |
|
|
38
40
|
| 0008 | AbstractGateway backlog 1044 (mailbox access) and `tests/test_gateway_import_boundary.py`; runtime 0.13.1 `email_facade.resolve_srv_default` |
|
|
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 |
|
|
39
43
|
|
|
40
44
|
## Adding New ADRs
|
|
41
45
|
|
|
@@ -133,6 +133,12 @@ Run index and creation (all built-in run stores, including the offloading wrappe
|
|
|
133
133
|
- `JsonFileRunStore` event-wait and mailbox indexes (`list_event_waiters`, `list_event_waiters_by_prefix`, `list_mailbox_runs`) see what another process saved on the same folder (a split gateway: API process + runner process). Before each lookup the store reads its change signal (the creation log's size and the folder's mtime): when either moved, or at least every `EVENT_INDEX_REFRESH_S` (2 s), it stats each running or waiting run and re-reads the ones whose file changed since it last filed them. An idle store pays two stats per lookup; its own saves are never re-read. `event_index_stats()` returns `{refreshes, refiled, tracked}`.
|
|
134
134
|
- `JsonFileRunStore.change_token()` answers "did any run of this folder change?" with one stat: `(creation-log size, active-index counter)`. Every save, create and delete through the store moves the counter; another process's create, delete or became-active line moves the log size. Not seen: another process re-saving a run that stays active (one ticking process per folder); ending a run, or re-saving a finished one, writes `=<run_id>`. `changed_run_ids(token)` names the runs this store changed since `token`, or `None` when that is unknown (the log moved, or more than 8,192 changes ago). `ObservableLedgerStore.change_token()` / `changed_run_ids(token)` do the same for ledger appends (process-local). The gateway runner's scan gate and its mail notification check compare these tokens instead of reading the directory.
|
|
135
135
|
|
|
136
|
+
The durable cursor (ADR 0010):
|
|
137
|
+
- Every ledger store numbers a run's records 1, 2, 3, … and `list()` returns each record with its `seq`. `JsonlLedgerStore` writes it on each line, allocated under an advisory file lock that spans the head read and the write, so another process appending to the same run never takes the same number. A line written before the field existed is numbered by its position. `append()` returns the seq.
|
|
138
|
+
- `LedgerStore.list_after(*, run_id, after, limit=1000) -> (records, last_seq)`: the records after a seq. SQLite does an indexed read; JSONL seeks to the byte offset where the previous read ended; the default implementation filters `list()`. The decorators (observable, hash-chained, offloading) delegate it.
|
|
139
|
+
- `ObservableLedgerStore` hands subscribers the record with its `seq`.
|
|
140
|
+
- `SqliteLedgerStore.import_records(run_id, records)` copies a run's ledger in, keeping each `seq`. A migration from files to SQLite therefore keeps every cursor valid. It refuses a run that already has records.
|
|
141
|
+
|
|
136
142
|
Common decorators:
|
|
137
143
|
- `ObservableLedgerStore` for subscriptions (`src/abstractruntime/storage/observable.py`)
|
|
138
144
|
- `HashChainedLedgerStore` + `verify_ledger_chain(...)` for tamper-evidence (`src/abstractruntime/storage/ledger_chain.py`)
|
|
@@ -326,6 +332,25 @@ This produces a portable record of a run’s state + ledger + artifacts suitable
|
|
|
326
332
|
When available, it also includes `resolved_actions`: bounded capability/action summaries derived
|
|
327
333
|
from Core route resolution and persisted from `LLM_CALL` results.
|
|
328
334
|
|
|
335
|
+
## Replay view (one reconstruction of a run, every client)
|
|
336
|
+
|
|
337
|
+
Implementation: `src/abstractruntime/replay/` (ADR 0010). Guide: [replay.md](replay.md).
|
|
338
|
+
|
|
339
|
+
- `replay(records_by_run, runs_by_id=None, *, root_run_id=None) -> ReplayView`: folds a run
|
|
340
|
+
tree's ledger records (`{run_id: [records in ledger order]}`) and durable snapshots
|
|
341
|
+
(`RunState` or dicts) into a view. Pure and deterministic.
|
|
342
|
+
- `ReplayView.apply(records, *, runs_by_id=None) -> delta`: folds newer records and snapshots.
|
|
343
|
+
The same delta is kept as `view.last_delta`. `apply(view, records)` is the module-level form.
|
|
344
|
+
- `ReplayView.to_json()`: the view, `replay_view_v1` (status, `interaction`, `open_waits`,
|
|
345
|
+
`runs`, `messages`, `activities`, `artifacts`, `usage`, `workflow`, `cursor`, `warnings`).
|
|
346
|
+
Other reads: `cursor`, `run_ids`, `last_seq(run_id)`, `status()`, `run_statuses()` and
|
|
347
|
+
`is_terminal()`.
|
|
348
|
+
- `apply_delta(view_json, delta)`, `diff_views(old, new)` and `parse_cursor_token(token)`: the
|
|
349
|
+
client side of a delta, the delta between two views, and a cursor token as `{run id prefix:
|
|
350
|
+
seq}`.
|
|
351
|
+
- `wait_kind(wait)`, `workflow_ref(workflow_id)`, `PERSON_FACING_KINDS`,
|
|
352
|
+
`TERMINAL_STATUSES`, `REPLAY_VIEW_VERSION`.
|
|
353
|
+
|
|
329
354
|
## Runtime-owned integrations
|
|
330
355
|
|
|
331
356
|
### AbstractCore (LLM + tools)
|
|
@@ -410,7 +435,28 @@ Docs: `integrations/abstractcore.md`.
|
|
|
410
435
|
|
|
411
436
|
Implementation: `src/abstractruntime/integrations/abstractmemory/effect_handlers.py`.
|
|
412
437
|
|
|
413
|
-
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).
|
|
414
460
|
|
|
415
461
|
## Utilities (host UX)
|
|
416
462
|
|
|
@@ -424,6 +470,7 @@ This provides handlers for `MEMORY_KG_*` effects (opt-in wiring layer).
|
|
|
424
470
|
- `architecture.md` — component map + durability invariants
|
|
425
471
|
- `faq.md` — common questions and gotchas
|
|
426
472
|
- `integrations/abstractcore.md` — `LLM_CALL` / `TOOL_CALLS` wiring
|
|
473
|
+
- `integrations/abstractmemory.md` — memory facade, provenance stamping, `MEMORY_REVISE`
|
|
427
474
|
|
|
428
475
|
### Host ASGI serving
|
|
429
476
|
|