AbstractRuntime 0.13.0__tar.gz → 0.14.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.0 → abstractruntime-0.14.0}/CHANGELOG.md +77 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/PKG-INFO +14 -2
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/README.md +13 -1
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/README.md +2 -1
- abstractruntime-0.14.0/docs/adr/0008_integration_facades_are_the_complete_host_surface.md +80 -0
- abstractruntime-0.14.0/docs/adr/0010_one_replay_many_views.md +104 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/adr/README.md +4 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/api.md +25 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/README.md +3 -1
- abstractruntime-0.14.0/docs/backlog/planned/0853_session_tool_policy_before_the_approval_wait.md +59 -0
- abstractruntime-0.14.0/docs/backlog/planned/0854_replay_view.md +576 -0
- abstractruntime-0.14.0/docs/replay.md +113 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/tool-approval.md +58 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/llms-full.txt +222 -2
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/llms.txt +3 -2
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/pyproject.toml +1 -1
- abstractruntime-0.14.0/release-notes.md +67 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/scripts/generate_llms_full.py +1 -0
- abstractruntime-0.14.0/scripts/regen_replay_conformance.py +73 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/core/runtime.py +66 -4
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +187 -7
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/integrations/abstractcore/email_facade.py +5 -2
- abstractruntime-0.14.0/src/abstractruntime/replay/__init__.py +30 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/__init__.py +51 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/a2_delegated_approval_completed/expected_view.json +842 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/a2_delegated_approval_completed/manifest.json +38 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/a2_delegated_approval_completed/records.json +2962 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/a2_delegated_approval_completed/runs.json +294 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/a_delegated_child_approval/expected_view.json +537 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/a_delegated_child_approval/manifest.json +34 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/a_delegated_child_approval/records.json +1052 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/a_delegated_child_approval/runs.json +149 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/b_timer_without_resume/expected_view.json +151 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/b_timer_without_resume/manifest.json +22 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/b_timer_without_resume/records.json +186 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/b_timer_without_resume/runs.json +26 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/c_parallel_tool_batch/expected_view.json +451 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/c_parallel_tool_batch/manifest.json +38 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/c_parallel_tool_batch/records.json +1171 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/c_parallel_tool_batch/runs.json +170 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/d_cancellation/expected_view.json +252 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/d_cancellation/manifest.json +32 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/d_cancellation/records.json +672 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/d_cancellation/runs.json +63 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/e2_structured_repeated_node/expected_view.json +521 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/e2_structured_repeated_node/manifest.json +28 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/e2_structured_repeated_node/records.json +1512 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/e2_structured_repeated_node/runs.json +162 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/e_structured_output_agents/expected_view.json +320 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/e_structured_output_agents/manifest.json +38 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/e_structured_output_agents/records.json +955 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/e_structured_output_agents/runs.json +132 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/f_windowed_slim/expected_view.json +293 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/f_windowed_slim/manifest.json +28 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/f_windowed_slim/records.json +194 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/f_windowed_slim/runs.json +131 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/g_ask_user/expected_view.json +248 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/g_ask_user/manifest.json +20 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/g_ask_user/records.json +428 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/g_ask_user/runs.json +134 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/h_denied_approval/expected_view.json +297 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/h_denied_approval/manifest.json +26 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/h_denied_approval/records.json +886 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/h_denied_approval/runs.json +155 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/i_wait_kinds/expected_view.json +498 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/i_wait_kinds/manifest.json +7 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/i_wait_kinds/records.json +487 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/i_wait_kinds/runs.json +124 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/j_event_answered_then_pause/expected_view.json +199 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/j_event_answered_then_pause/manifest.json +7 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/j_event_answered_then_pause/records.json +211 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/j_event_answered_then_pause/runs.json +31 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/k_nested_delegation/expected_view.json +267 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/k_nested_delegation/manifest.json +7 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/k_nested_delegation/records.json +404 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/k_nested_delegation/runs.json +72 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/l_answer_then_completion/expected_view.json +174 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/l_answer_then_completion/manifest.json +7 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/l_answer_then_completion/records.json +141 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/l_answer_then_completion/runs.json +22 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/m_session_tool_policy/expected_view.json +444 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/m_session_tool_policy/manifest.json +7 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/m_session_tool_policy/records.json +672 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/conformance/m_session_tool_policy/runs.json +34 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/delta.py +136 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/executions.py +125 -0
- abstractruntime-0.14.0/src/abstractruntime/replay/view.py +1332 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/storage/__init__.py +10 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/storage/base.py +27 -2
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/storage/in_memory.py +6 -2
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/storage/json_files.py +206 -7
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/storage/ledger_chain.py +9 -5
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/storage/observable.py +9 -3
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/storage/offloading.py +6 -2
- abstractruntime-0.14.0/src/abstractruntime/storage/session_tool_policy.py +443 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/storage/sqlite.py +49 -6
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_durable_write_discipline.py +2 -1
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_email_review_fixes.py +4 -1
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_jsonl_ledger_recovery.py +6 -2
- abstractruntime-0.14.0/tests/test_jsonl_ledger_seq_cross_process.py +88 -0
- abstractruntime-0.14.0/tests/test_ledger_cursor_invariants.py +318 -0
- abstractruntime-0.14.0/tests/test_replay_conformance.py +373 -0
- abstractruntime-0.14.0/tests/test_replay_conformance_package.py +25 -0
- abstractruntime-0.14.0/tests/test_replay_cursor_token.py +41 -0
- abstractruntime-0.14.0/tests/test_replay_delta_cost.py +48 -0
- abstractruntime-0.14.0/tests/test_replay_invariants.py +210 -0
- abstractruntime-0.14.0/tests/test_replay_review_findings.py +96 -0
- abstractruntime-0.14.0/tests/test_replay_tool_policy.py +88 -0
- abstractruntime-0.14.0/tests/test_session_tool_policy.py +376 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_trigger_webhook.py +4 -2
- abstractruntime-0.13.0/release-notes.md +0 -25
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/.github/workflows/ci.yml +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/.github/workflows/release.yml +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/.gitignore +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/ACKNOWLEDGMENTS.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/CODE_OF_CONDUCT.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/CONTRIBUTING.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/LICENSE +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/ROADMAP.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/SECURITY.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/adr/0004_runtime_owns_run_scoped_media_execution_truth.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/adr/0005_runtime_owns_abstractcore_host_discovery_queries.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/adr/0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/adr/0007_runtime_relays_core_owned_model_residency_truth.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/architecture.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/artifacts.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/automations.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/completed/001_runtime_kernel.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/completed/0030_runtime_host_facades_for_comms_telegram_and_tool_specs.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/completed/0032_runtime_durable_outbound_comms_truth.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/completed/0033_runtime_host_local_prompt_cache_export_import_surface.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/completed/0035_model_residency_provider_truth_for_local_http_clients.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/completed/0037_visualflow_generate_music_node_compiler_parity.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/completed/0039_runtime_music_structure_prompt_bool_contract.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/completed/003_wait_primitives.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/completed/0040_task_agnostic_local_residency_listing.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/completed/0041_runtime_hardware_extras_avoid_nonpermissive_document_stacks.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/completed/0042_core_vision_upscale_and_parameter_surface.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/completed/0043_runtime_vision_adapter_and_batch_surface.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/completed/004_scheduler_driver.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/completed/009_artifact_store.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/completed/010_examples_and_composition.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/completed/011_subworkflow_support.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/completed/019_runtime_host_facade_for_core_operator_surfaces.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/completed/020_runtime_gateway_install_boundary.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/completed/021_runtime_gateway_env_namespace_cleanup.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/completed/022_model_residency_control_plane.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/completed/023_truthful_local_media_residency_boundaries.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/completed/024_runtime_owned_run_scoped_media_execution.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/completed/028_runtime_bloc_kv_lifecycle_and_pruning.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/completed/029_runtime_music_generation_and_discovery_via_abstractcore.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/completed/0846_mlx_instance_scheduling_and_execution_controls.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/completed/0847_automations_v1_controller_contracts_occurrences_triggers.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/completed/0851_per_account_voice_stores.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/completed/0852_capability_refusals_are_not_retried.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/deprecated/0034_agent_runtime_convenience_constructor.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/deprecated/004_tests.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/deprecated/005_docs_updates.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/deprecated/README.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/planned/0070_standalone_wui_browser_session_security_contract.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/planned/0233_real_run_cancellation.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/planned/025_runtime_retention_and_purge_contract.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/planned/026_context_checkpoint_self_compression.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/planned/027_quote_provenance_discipline.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/planned/028_selective_artifact_rehydration.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/planned/0845_session_prompt_cache_resume_and_purge_contract.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/planned/0848_automations_v2_external_event_inbox_and_run_triggers.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/planned/runtime_portability/0065_portable_process_and_lock_layer.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/planned/runtime_portability/0066_portable_io_and_media_reader.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/planned/runtime_portability/README.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/planned/runtime_systemic_reliability/0044_meta_analysis_record.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/planned/runtime_systemic_reliability/0045_crash_replay_harness_and_ordering_invariant.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/planned/runtime_systemic_reliability/0046_per_run_driver_exclusion.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/planned/runtime_systemic_reliability/0047_indexed_idempotency_lookup.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/planned/runtime_systemic_reliability/0048_durable_io_unification.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/planned/runtime_systemic_reliability/0049_llm_client_mechanical_split.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/planned/runtime_systemic_reliability/0050_control_sidecar_all_writers.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/planned/runtime_systemic_reliability/0051_runtime_owned_durable_event_mailbox.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/planned/runtime_systemic_reliability/0052_sync_store_event_loop_tripwire.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/planned/runtime_systemic_reliability/0053_bounded_run_vars_growth.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/planned/runtime_systemic_reliability/0054_runtime_health_counters.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/planned/runtime_systemic_reliability/0055_jsonl_store_honesty.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/planned/runtime_systemic_reliability/0064_prompt_cache_fingerprint_stability.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/planned/runtime_systemic_reliability/0067_durable_write_discipline.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/planned/runtime_systemic_reliability/0068_hot_path_store_reads.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/planned/runtime_systemic_reliability/README.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/proposed/0031_runtime_tool_spec_adapters_for_gateway_and_mcp.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/proposed/0036_local_media_residency_bridge_to_core_residency.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/proposed/0038_core_server_pool_residency_affinity.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/proposed/0069_document_renderer_professional_figures.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/proposed/0849_conversation_search_tool_usage_outputs_and_thinking.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/proposed/0850_growing_automation_history_out_of_the_controller_ledger.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/proposed/runtime_systemic_reliability/0056_schema_version_and_quarantine_loading.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/proposed/runtime_systemic_reliability/0057_trust_boundary_stamp_registry.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/proposed/runtime_systemic_reliability/0058_terminal_run_archival_helper.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/proposed/runtime_systemic_reliability/0059_memory_span_handler_extraction.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/proposed/runtime_systemic_reliability/0060_visualflow_compiler_decomposition.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/proposed/runtime_systemic_reliability/0061_root_api_deprecation_machinery.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/proposed/runtime_systemic_reliability/0062_dependency_honesty_extras.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/proposed/runtime_systemic_reliability/0063_b3_envelope_lane_unification.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/backlog/proposed/runtime_systemic_reliability/README.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/email.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/entity-runtime.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/evidence.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/faq.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/getting-started.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/integrations/abstractcore.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/limits.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/manual_testing.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/mcp-worker.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/proposal.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/provenance.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/snapshots.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/tools-comms.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/troubleshooting.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/docs/workflow-bundles.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/examples/01_hello_world.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/examples/02_ask_user.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/examples/03_wait_until.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/examples/04_multi_step.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/examples/05_persistence.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/examples/06_llm_integration.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/examples/07_react_agent.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/examples/README.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/mkdocs.yml +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/pytest.ini +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/scripts/backfill_diary_edges.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/__init__.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/automation_queries.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/automations/__init__.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/automations/adapters.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/automations/attention.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/automations/bundle.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/automations/bundles/automation-controller/flows/controller.json +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/automations/bundles/automation-controller/manifest.json +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/automations/commands.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/automations/consumers.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/automations/controller.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/automations/ledger.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/automations/models.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/automations/samples.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/automations/service.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/automations/wakes.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/conversation_search.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/core/__init__.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/core/config.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/core/effect_cancellation.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/core/event_keys.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/core/health.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/core/live_deltas.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/core/models.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/core/policy.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/core/progress_channel.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/core/publish.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/core/run_attribution.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/core/run_identity.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/core/run_lifecycle.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/core/run_origin.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/core/spec.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/core/tool_scope.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/core/vars.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/documents/__init__.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/documents/charts.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/documents/docx.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/documents/pdf.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/email/__init__.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/email/actions.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/email/automations.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/email/binding.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/email/feeder.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/email/frame.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/email/inbox.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/evidence/__init__.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/evidence/recorder.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/history_bundle.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/identity/__init__.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/identity/act_only.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/identity/chat.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/identity/communities.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/identity/diary.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/identity/digest.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/identity/entity_runtime.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/identity/fingerprint.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/identity/lease.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/identity/life.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/identity/memory_reader.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/identity/night_voice.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/identity/phase_graph.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/identity/phase_spec.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/identity/prelude.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/identity/prompt_overlay.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/identity/reflection.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/identity/spec/entity_phases.vendored.json +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/identity/substrate.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/identity/tool_effects.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/identity/tool_policy.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/identity/tools.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/identity/visit_workflow.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/integrations/__init__.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/integrations/abstractcore/__init__.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/integrations/abstractcore/agora_tools.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/integrations/abstractcore/command_sandbox_host.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/integrations/abstractcore/comms_facade.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/integrations/abstractcore/config_facade.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/integrations/abstractcore/data_registry_facade.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/integrations/abstractcore/discovery_facade.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/integrations/abstractcore/discovery_queries.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/integrations/abstractcore/factory.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/integrations/abstractcore/host_facade.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/integrations/abstractcore/llm_client.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/integrations/abstractcore/local_helper_tools.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/integrations/abstractcore/mcp_facade.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/integrations/abstractcore/media_subprocess.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/integrations/abstractcore/output_specs.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/integrations/abstractcore/run_facade.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/integrations/abstractcore/server_facade.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/integrations/abstractcore/structured_facade.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/integrations/abstractcore/telegram_facade.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/integrations/abstractcore/tool_effects.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/integrations/abstractcore/tool_inventory_facade.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/integrations/abstractcore/voice_facade.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/integrations/abstractcore/voice_library.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/integrations/abstractmemory/brain_handlers.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/integrations/abstractmemory/identity_support.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/integrations/abstractmemory/seam_handlers.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/mail_verbs.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/memory/__init__.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/memory/active_context.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/memory/active_memory.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/memory/compaction.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/memory/kg_packets.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/memory/memact_composer.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/memory/recall_levels.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/memory/token_budget.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/rendering/__init__.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/rendering/json_stringify.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/scheduler/__init__.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/scheduler/convenience.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/scheduler/multi_store.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/scheduler/registry.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/scheduler/scheduler.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/session_history.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/session_turns.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/storage/artifacts.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/storage/change_ring.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/storage/commands.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/storage/lease.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/storage/ledger_slim.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/storage/serialize.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/storage/snapshots.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/storage/steer_sidecar.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/triggers/__init__.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/triggers/cloudevents.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/triggers/connection_events.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/triggers/connections.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/triggers/email_received.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/triggers/event_frame.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/triggers/feed.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/triggers/manual.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/triggers/protocol.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/triggers/registry.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/triggers/schedule.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/triggers/webhook.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/turn_grounding.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/utils/__init__.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/utils/atomic_files.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/utils/file_filters.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/utils/workspace_paths.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/visualflow_compiler/compiler.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/visualflow_compiler/visual/execution_metrics.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/visualflow_compiler/visual/executor.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/visualflow_compiler/visual/function_library.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/visualflow_compiler/visual/loop_back_check.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/visualflow_compiler/visual/loop_limit_lowering.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/visualflow_compiler/visual/pin_expressions.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/visualflow_compiler/visual/reroute_lowering.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/workflow_bundle/models.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/workflow_bundle/packer.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/workflow_bundle/reader.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/src/abstractruntime/workflow_bundle/registry.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/README.md +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/automation_harness.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/conftest.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/email_wp2_support.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/fixtures/feeds/atom.xml +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/fixtures/feeds/rdf-not-a-feed.xml +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/fixtures/feeds/rss1-malformed.xml +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/fixtures/feeds/rss1.xml +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/fixtures/feeds/rss2.xml +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/fixtures/schedule_v1_corpus.json +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/live_email/conftest.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/live_email/live_email_support.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/live_email/test_email_live_runtime.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/media_endpoint_profile_probe.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_abstractcore_comms_facade.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_abstractcore_discovery_facade.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_abstractcore_host_facade.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_abstractcore_run_facade.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_abstractcore_server_facade.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_abstractcore_structured_facade.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_abstractcore_telegram_facade.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_active_consumers_index.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_active_context_policy.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_active_index.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_active_memory.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_agora_agent_alias_identity.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_agora_tools_http.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_analyze_media_addressing_and_walling.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_answer_user_effect.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_artifact_session_candidates.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_artifacts.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_automation_calendar_schedule.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_automation_commands.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_automation_controller.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_automation_controller_recovery.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_automation_definition.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_automation_discussion_isolation.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_automation_email_results.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_automation_growing_context.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_automation_index.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_automation_list_reads.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_automation_named_policy_compiler.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_automation_next_fire.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_automation_occurrence_input_resolver.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_automation_occurrence_recovery.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_automation_replay_read_only.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_automation_retry.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_automation_session_turns.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_automation_status.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_automation_tool_approval.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_browser_probe_target_walling.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_budget_law_no_unrequested_caps.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_capability_default_reasoning.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_chat_summarizer_integration.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_code_node_imports.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_code_node_restricted_python.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_command_sandbox_host_facade.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_command_store.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_compaction_helpers.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_compaction_summarizer_route.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_config_facade_models_engines.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_config_facade_voice_input_hint.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_control_adapter_while.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_controller_bundle_packaged.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_conversation_search.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_crash_ordering_inversions.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_create_if_absent.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_data_registry_facade.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_default_model_warmup_switch.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_default_tools_camera_gating.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_default_tools_comms_gating.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_default_tools_include_skim_files.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_default_tools_include_skim_folders.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_default_tools_include_skim_web.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_default_tools_search_files_executor.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_diary_capture.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_diary_write_rescue.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_directory_lease.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_disabled_toolsets_seam.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_discovery_survives_unbuildable_default.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_discovery_tts_unavailable_reason.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_discovery_voice_openai_api_key.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_discussion_session_anchor.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_document_markdown_tables.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_document_renderers_hr_quote.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_durable_toolsets.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_effect_cancellation.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_effect_issuance_idempotency.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_effect_payload_stays_json_serializable.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_election_consequence_teaching.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_email_binding_and_refiner.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_email_feeder_batched.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_email_feeder_flags.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_email_gate_fixes.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_email_inbox_and_trigger.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_email_received_mailbox_id.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_email_regate_fixes.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_email_self_trigger_loop.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_email_stream_consumers.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_email_toolset_and_walls.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_emergence_experiment.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_emit_event_uses_wait_index.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_emit_event_without_workflow_registry.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_endpoint_profile_media_end_to_end.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_endpoint_profile_media_in_process.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_endpoint_profile_media_specs_keep_provider.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_endpoint_profile_route_context.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_entity_awake_memory_fixes.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_entity_brain_effects.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_entity_chat_driver.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_entity_chat_tools_reflection.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_entity_diary.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_entity_execute_tool.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_entity_fetch_url_tool.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_entity_history_window.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_entity_life_loop.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_entity_memory_richness.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_entity_phase_graph_conformance.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_entity_react_visit_window.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_entity_recent_memories.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_entity_runtime.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_entity_search_memory.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_entity_sleep_bound_and_yield_attribution.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_entity_substrate_resolution.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_entity_visit_honesty.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_entity_workspace_cap.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_entity_workspace_tools.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_event_index_cross_process.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_event_wait_index.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_every_path_bearing_tool_is_walled.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_evidence_recorder.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_evidence_recorder_post_policy_envelope.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_execute_command_output_offload.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_execution_capability_discovery.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_explicit_eject_other_clients.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_factory_default_retry_policy.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_format_repair_nudge.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_fresh_install_no_provider.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_gateway_facades_c4899.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_git_read_only_refiner.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_hf_process_residency_merge.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_history_window_multimodal.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_hot_path_store_reads.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_indexed_idempotency_lookup.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_integration_abstractcore.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_integrations_abstractcore.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_json_file_run_store_children_index.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_json_run_cache_bound.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_json_store_scan_memo.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_kg_learn_and_recall_contract.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_ledger_chain.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_ledger_record_slimming.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_ledger_subscription.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_live_token_deltas.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_llm_call_media_artifact_refs.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_llm_call_payload_shape_refusal.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_llm_call_requires_prompt.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_llm_call_response_schema_normalization.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_llm_call_structured_output_fallback.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_llm_call_text_phase_progress.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_llm_call_truncation_retry_contract.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_llm_call_use_context_appends_turn.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_llm_client_grounding_tail.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_llm_client_media_artifacts.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_llm_client_system_context.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_llm_client_tool_call_parsing.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_llm_retry_classification.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_llm_streaming_on_token.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_local_helper_tool_exposure.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_local_residency_host_sweep.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_mail_verbs.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_mailbox_index.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_max_iterations_ceiling.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_mcp_remote_tool_executor.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_mcp_runs_untrusted_and_facade.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_mcp_worker_logging.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_mcp_worker_security.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_mcp_worker_stdio.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_media_artifact_resolution.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_media_capability_default_routing.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_media_host_endpoint_resolver.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_media_only_requests_skip_text_client.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_media_subprocess.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_memact_composer_from_kg_result.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_memory_appraise_handler.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_memory_communities.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_memory_kg_packets.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_memory_kg_predicate_aliasing.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_memory_kg_query_packetization_restart.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_memory_note_effect.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_memory_query_effect.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_memory_query_rich_filters.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_memory_seam_handlers.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_memory_seam_sqlite_durability.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_memory_tag_effect.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_mlx_generation_serialization.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_mlx_process_residency_merge.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_model_eject_cancel.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_model_residency_clean_switch.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_model_residency_control_plane.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_model_residency_lock_and_context_estimate.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_multi_store_scheduler.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_multimodal_abstractcore_integration.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_native_mlx_application_wiring.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_native_mlx_execution_controls_live.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_native_tool_channel.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_night_voice.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_no_default_provider_refusal_ux.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_occurrence_named_inputs.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_occurrence_samples.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_offload_answer_chain_c4978.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_offloaded_node_traces_report_unknown_not_zero.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_offloading.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_packaging_extras.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_parallel_readonly_tool_execution.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_pause_resume.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_pdf_unicode_rendering.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_personal_cycle.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_phantom_attachment_index.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_phase_graph_artifact_control.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_phase_graph_obedience.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_phase_vocabulary_migration.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_pooled_client_strips_construction_cache_key.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_prompt_cache_export_import.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_prompt_cache_fingerprint_stability.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_prompt_cache_modules.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_prompt_cache_posture_inheritance.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_prompt_cache_thinking_and_prompt_only.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_prompt_overlay.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_provider_endpoint_profile_resolution.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_provider_pin_routing_isolation.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_publish_event.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_queryable_run_store.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_r12_workspace_sandbox.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_read_idle_threading.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_readoption_experiment.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_real_integration.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_realize_election.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_recall_levels_policy.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_remote_client_cancel.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_remote_llm_client.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_remote_speculation_defaults.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_rendering_agent_trace_report.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_rendering_json_stringify.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_report_branding.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_resident_media_generation.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_resume_concurrent_same_wait.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_retry_idempotency.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_run_history_bundle.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_run_index_workspace_root.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_run_mutation_lock.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_run_origin.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_run_scoped_tool_policy.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_run_store_change_token.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_run_tool_scope_ceiling.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_runtime_browser_session_boundary.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_runtime_default_provider_model_refresh.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_runtime_effect_invocation_trace.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_runtime_health_and_bounded_vars.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_runtime_install_boundary.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_runtime_node_traces.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_runtime_start_seeds_tool_support.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_runtime_tick_step_gate.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_schedule_run.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_schedule_v1_corpus.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_schedule_v2_calendar.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_scheduler.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_send_email_refiner.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_send_email_self_default_policy.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_session_history.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_session_prompt_cache_attribution.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_session_prompt_cache_visibility.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_session_route_stamp.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_session_start_cost.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_shell_tool_exposure.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_snapshots.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_speculation_inheritance.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_speculation_reaches_provider_construction.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_sqlite_ledger_store.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_start_subworkflow_async_wait.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_steer_sidecar.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_storage_deletion.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_streamed_voice_namespace.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_structured_output_schema_enum.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_subworkflow.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_terminal_effect_completion.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_thinking_inheritance.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_tool_approval_executor.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_tool_approval_resume_executes.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_tool_approval_wait_key_identity.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_tool_calls_idempotency_keys.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_tool_catalog.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_tool_descriptor_registry.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_tool_executor_argument_sanitization.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_tool_executor_error_output_detection.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_tool_executor_filename_alias.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_tool_executor_read_file_aliases.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_tool_executor_timeout.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_tool_inventory_facade.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_tool_invoke_effect.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_tool_policy_and_mounts.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_tool_wait_allowlist_safety.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_topic_election_world_model.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_trace_context_propagation.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_trigger_cloudevents.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_trigger_connection_listening.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_trigger_connections.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_trigger_feed.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_trigger_registry.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_trigger_schedule_math.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_trusted_run_index.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_turn_grounding_byte_stability.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_turn_grounding_carriers_a3.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_vars_query_effect.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visit_ab_fixture.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visit_midturn_elections.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visit_midturn_resume.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visit_workflow.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visual_agent_skills_block_passthrough.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visual_entity_memory_nodes.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visual_flow_end_effect_only_persistence.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visual_llm_call_partial_override.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visual_loop_back_out_of_body.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visual_loop_limit_and_list_nodes.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visual_loop_limit_on_wire.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visual_memact_compose_node.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visual_reroute_lowering.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visual_set_vars_pins.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visual_unknown_node_type_refuses.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visual_wait_event_deadline_passthrough.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visualflow_add_message_builtin.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visualflow_agora_react_agent.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visualflow_call_tool_node.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visualflow_capability_routes_and_thinking.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visualflow_compiler_basic.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visualflow_continue_on_error.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visualflow_edit_json_schema_node.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visualflow_event_inbox_react_agent.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visualflow_file_nodes_workspace.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visualflow_function_library.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visualflow_get_element_node.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visualflow_get_random_element_node.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visualflow_get_var_node.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visualflow_has_tools_builtin.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visualflow_make_object_node.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visualflow_media_nodes.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visualflow_memory_effect_nodes.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visualflow_memory_source_pins.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visualflow_pin_expressions.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visualflow_prompt_only.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visualflow_random_nodes.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visualflow_schema_enum_switch.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visualflow_string_contains_replace.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_visualflow_tool_parameters_node.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_voice_library_facade.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_voice_openai_api_key_path.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_voice_stream_is_not_a_wait.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_w4_feelings_lens.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_wait_event_deadline.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_wait_event_prompt_metadata.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_wait_until_streak.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_wait_until_utc_normalization.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_workflow_bundle_registry.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_workspace_builtin_deny.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_workspace_context_allowed_workspaces.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_workspace_policy_absolute_reanchor.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_workspace_policy_allowlist_mode.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_workspace_prompt_context.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_workspace_read_only.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_workspace_writable_paths.py +0 -0
- {abstractruntime-0.13.0 → abstractruntime-0.14.0}/tests/test_write_chart.py +0 -0
|
@@ -7,6 +7,83 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.14.0] - 2026-10-27
|
|
11
|
+
|
|
12
|
+
Two features: the replay view with a durable per-run ledger cursor, and the session tool policy.
|
|
13
|
+
Upgrade note (one way): hash-chained JSONL ledgers written by 0.14.0 carry `seq` on each line, and
|
|
14
|
+
an older `verify_ledger_chain` reports those lines as tampered. Upgrade writers and verifiers together.
|
|
15
|
+
|
|
16
|
+
### Added
|
|
17
|
+
|
|
18
|
+
- **Replay view** (`abstractruntime.replay`, ADR 0010, backlog 0854; framework root 0993). One
|
|
19
|
+
pure, deterministic reducer turns a run tree's ledger records and snapshots into the view every
|
|
20
|
+
client renders (`replay_view_v1`).
|
|
21
|
+
- What the view holds:
|
|
22
|
+
- the run tree through delegation waits, with the workflow each run executes (bundle,
|
|
23
|
+
version, flow, the root's entrypoint);
|
|
24
|
+
- the status;
|
|
25
|
+
- the person-facing interaction: a delegated child's approval, a question, or a prompted
|
|
26
|
+
event, with the resume command to send;
|
|
27
|
+
- verbatim messages with their provenance (run, steps, seqs, artifacts);
|
|
28
|
+
- one activity per node execution (AbstractFlow's `executionIdFor` rules), with tool calls
|
|
29
|
+
matched to results;
|
|
30
|
+
- artifacts and usage.
|
|
31
|
+
- `$slim` pointers are resolved, and a windowed history is named in `warnings`.
|
|
32
|
+
- A wait is over when a resume OR a later step of the same run exists.
|
|
33
|
+
- `ReplayView.apply` folds newer records and returns a delta. `apply_delta` and `diff_views`
|
|
34
|
+
are the client side. `replay(all)` equals the fold of any chunking.
|
|
35
|
+
- Wait kinds agree with `automations.attention`. The person-facing kinds are tool_approval,
|
|
36
|
+
ask_user, and an event that carries a prompt. The non-person-facing kinds are delegation,
|
|
37
|
+
timer, job, pause, automation_wake and signal. The interaction carries `answer_payload`.
|
|
38
|
+
- A session tool policy's `abstract.tool_policy_decision` record is an activity
|
|
39
|
+
(`tool_policy`: allowed or denied by the conversation's policy, its revision and who set it),
|
|
40
|
+
never an interaction. The tool rows it names carry `decided_by: "session_policy"`.
|
|
41
|
+
- Every delta carries typed `changes` (status, interaction opened or closed, run, message,
|
|
42
|
+
activity, artifact, each with its run and seq), for push dispatch.
|
|
43
|
+
- Cursor tokens name each run by a collision-free prefix that is safe in a header.
|
|
44
|
+
`resolve_cursor_token` maps a token back.
|
|
45
|
+
- The conformance cases ship with the package (`abstractruntime.replay.conformance`), so a host
|
|
46
|
+
or a client port can run them. Guide: `docs/replay.md`.
|
|
47
|
+
- **Durable ledger cursor** (gateway backlog 0082). A JSONL append after a torn last line (a
|
|
48
|
+
crash mid-write) now starts a new line; before, the fragment and the whole new record were
|
|
49
|
+
dropped together:
|
|
50
|
+
- Every ledger store numbers a run's records (`seq`). `JsonlLedgerStore` persists the number
|
|
51
|
+
on each line, allocated under an advisory file lock, so two processes never take the same
|
|
52
|
+
seq. Lines written before the field existed read as their position.
|
|
53
|
+
- `LedgerStore.list_after(run_id=, after=, limit=)` works on every store: an indexed read on
|
|
54
|
+
SQLite, a byte-offset seek on JSONL. `append()` returns the seq.
|
|
55
|
+
- `ObservableLedgerStore` passes `seq` to subscribers.
|
|
56
|
+
- `SqliteLedgerStore.import_records` copies a ledger in and keeps its `seq` values (migration).
|
|
57
|
+
|
|
58
|
+
- **Session tool policy**: a conversation's standing "approve / deny without asking", applied before any approval
|
|
59
|
+
wait. `abstractruntime.storage.session_tool_policy` (`SqliteSessionToolPolicyStore`,
|
|
60
|
+
`InMemorySessionToolPolicyStore`, `session_policy_names`), `Runtime(session_tool_policy_store=...)` /
|
|
61
|
+
`Runtime.set_session_tool_policy_store()`. The TOOL_CALLS handler reads the run's session row once per batch: an
|
|
62
|
+
approved call runs with no wait, a denied call is refused with no wait, and each decision writes an
|
|
63
|
+
`abstract.tool_policy_decision` ledger record (who set the policy, when, which selector matched). It applies to
|
|
64
|
+
every run of the session (the run tree's root session: delegated children, resumes, restarts); approvals never
|
|
65
|
+
reach untrusted-input runs or automation occurrences (a deny does, and also wins over an approval that was shown
|
|
66
|
+
before it); never beyond the run's `allowed_tools`. Before this, "approve all" lived in each
|
|
67
|
+
client, which answered the wait after it arrived: the gate flashed in every app and in the ledger. See
|
|
68
|
+
[tool-approval.md](docs/tool-approval.md#session-tool-policy-a-conversations-standing-word).
|
|
69
|
+
|
|
70
|
+
### Changed
|
|
71
|
+
|
|
72
|
+
- Hash-chained ledgers: `seq` is persisted on each JSONL line and excluded from the hash by this
|
|
73
|
+
version's `compute_record_hash`. A verifier from an older version includes it, so it reports
|
|
74
|
+
every line written by this version as tampered. Upgrade every process that verifies a chain
|
|
75
|
+
(`verify_ledger_chain`) together with the writers.
|
|
76
|
+
- `LedgerStore.list()` records carry `seq`. A consumer that compared records to `asdict(record)`
|
|
77
|
+
sees one more key. The hash chain excludes `seq` (it is the store's position, assigned after
|
|
78
|
+
the hash).
|
|
79
|
+
|
|
80
|
+
## [0.13.1] - 2026-10-27
|
|
81
|
+
|
|
82
|
+
### Added
|
|
83
|
+
|
|
84
|
+
- `email_facade.resolve_srv_default` (AbstractCore's mailbox SRV lookup) is re-exported, so a host's mail code imports
|
|
85
|
+
it from the runtime facade like every other mail name.
|
|
86
|
+
|
|
10
87
|
## [0.13.0] - 2026-10-27
|
|
11
88
|
|
|
12
89
|
Requires AbstractCore 2.30.0 or newer. Personal voice stores need AbstractVoice 0.19.0.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: AbstractRuntime
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.14.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
|
|
@@ -55,10 +55,22 @@ 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.14.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.14.0
|
|
63
|
+
|
|
64
|
+
- **Replay view** (`abstractruntime.replay`): one deterministic reducer turns a run tree's ledger
|
|
65
|
+
into the view every client renders (status, the interaction to answer, messages, activities,
|
|
66
|
+
artifacts), with incremental deltas. Every ledger store now numbers records with a durable
|
|
67
|
+
per-run `seq` cursor (`list_after`). See [docs/replay.md](docs/replay.md).
|
|
68
|
+
- **Session tool policy**: a conversation's standing approve/deny is applied before any approval
|
|
69
|
+
wait, with an `abstract.tool_policy_decision` audit record. See
|
|
70
|
+
[docs/tool-approval.md](docs/tool-approval.md#session-tool-policy-a-conversations-standing-word).
|
|
71
|
+
- Upgrade note: hash-chained JSONL ledgers written by 0.14.0 fail an older `verify_ledger_chain`;
|
|
72
|
+
upgrade writers and verifiers together.
|
|
73
|
+
|
|
62
74
|
## AbstractFramework ecosystem
|
|
63
75
|
|
|
64
76
|
AbstractRuntime is one component of the wider [AbstractFramework](https://github.com/lpalbou/AbstractFramework) ecosystem:
|
|
@@ -4,10 +4,22 @@
|
|
|
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.14.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.14.0
|
|
12
|
+
|
|
13
|
+
- **Replay view** (`abstractruntime.replay`): one deterministic reducer turns a run tree's ledger
|
|
14
|
+
into the view every client renders (status, the interaction to answer, messages, activities,
|
|
15
|
+
artifacts), with incremental deltas. Every ledger store now numbers records with a durable
|
|
16
|
+
per-run `seq` cursor (`list_after`). See [docs/replay.md](docs/replay.md).
|
|
17
|
+
- **Session tool policy**: a conversation's standing approve/deny is applied before any approval
|
|
18
|
+
wait, with an `abstract.tool_policy_decision` audit record. See
|
|
19
|
+
[docs/tool-approval.md](docs/tool-approval.md#session-tool-policy-a-conversations-standing-word).
|
|
20
|
+
- Upgrade note: hash-chained JSONL ledgers written by 0.14.0 fail an older `verify_ledger_chain`;
|
|
21
|
+
upgrade writers and verifiers together.
|
|
22
|
+
|
|
11
23
|
## AbstractFramework ecosystem
|
|
12
24
|
|
|
13
25
|
AbstractRuntime is one component of the wider [AbstractFramework](https://github.com/lpalbou/AbstractFramework) ecosystem:
|
|
@@ -29,7 +29,7 @@ In this repo, the AbstractCore wiring lives under `src/abstractruntime/integrati
|
|
|
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
30
|
- `tools-comms.md` — enabling the optional comms toolset (email/WhatsApp/Telegram)
|
|
31
31
|
- `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)
|
|
32
|
+
- `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
33
|
- `api.md#workflowbundles-flow-and-visualflow-distribution` — VisualFlow compiler APIs, media nodes, and document nodes (`read_pdf` / `write_pdf` / `write_docx`)
|
|
34
34
|
- `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
35
|
- `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 +41,7 @@ In this repo, the AbstractCore wiring lives under `src/abstractruntime/integrati
|
|
|
41
41
|
- `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
42
|
- `evidence.md` — artifact-backed evidence capture for external-boundary tools
|
|
43
43
|
- `mcp-worker.md` — MCP worker CLI (`abstractruntime-mcp-worker`)
|
|
44
|
+
- `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
45
|
- `snapshots.md` — snapshot/bookmark model and stores
|
|
45
46
|
- `provenance.md` — tamper-evident hash-chained ledger
|
|
46
47
|
- `limits.md` — runtime-aware `_limits` namespace and APIs
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# ADR 0008: Runtime integration facades are the complete host surface for AbstractCore
|
|
2
|
+
|
|
3
|
+
Status: Accepted.
|
|
4
|
+
Date: 2026-10-27
|
|
5
|
+
|
|
6
|
+
## Context
|
|
7
|
+
|
|
8
|
+
Hosts (AbstractGateway first) depend on AbstractRuntime, and AbstractRuntime owns the
|
|
9
|
+
AbstractCore integration (ADR 0001, 0004-0007). The gateway enforces its side with a test that
|
|
10
|
+
fails on any direct `abstractcore` import. That rule only holds if every AbstractCore name a host
|
|
11
|
+
legitimately needs is reachable through a runtime facade. On 2026-10-27 the gateway's mailbox
|
|
12
|
+
code needed AbstractCore's SRV lookup (`resolve_srv_default`), the email facade did not re-export
|
|
13
|
+
it, and the host imported AbstractCore directly: the boundary test went red and stayed red
|
|
14
|
+
across a release line. The hole was not the import; it was a facade that lagged behind what the
|
|
15
|
+
host needed, with no rule saying whose job it was to close the gap.
|
|
16
|
+
|
|
17
|
+
## Decision
|
|
18
|
+
|
|
19
|
+
1. The modules under `abstractruntime.integrations.abstractcore` whose name ends in `_facade`
|
|
20
|
+
(discovery, host, config, run, email, structured, voice, telegram, comms, mcp, tool inventory,
|
|
21
|
+
server, data registry) are the ONLY surface through which a host reaches AbstractCore. They
|
|
22
|
+
are complete by contract: a name a host needs and cannot import from a facade is a runtime
|
|
23
|
+
defect, fixed by adding the re-export or method in the runtime and cutting a patch release.
|
|
24
|
+
2. A host never works around a missing name by importing `abstractcore` directly, vendoring the
|
|
25
|
+
code, or guessing a replacement. It raises the gap to the runtime (backlog item or PR) and
|
|
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.
|
|
33
|
+
3. A re-export is unchanged in identity (`facade.name is abstractcore.module.name`) and listed in
|
|
34
|
+
the facade's `__all__`; the facade documents which AbstractCore version introduced the name.
|
|
35
|
+
4. The facades are additive within a minor line: a name, once exported, is not removed without
|
|
36
|
+
a deprecation note and a major or minor bump.
|
|
37
|
+
|
|
38
|
+
## Consequences
|
|
39
|
+
|
|
40
|
+
### Positive
|
|
41
|
+
- The host's boundary test is a true gate: green means every AbstractCore access is a runtime
|
|
42
|
+
facade, so a Core change breaks at most one package.
|
|
43
|
+
- Version floors stay layered: a host pins the runtime, the runtime pins Core.
|
|
44
|
+
|
|
45
|
+
### Negative
|
|
46
|
+
- A host feature that needs one new Core name waits for a runtime patch release (about 20
|
|
47
|
+
minutes with the release workflow), and the host's runtime floor moves with it.
|
|
48
|
+
- The runtime carries thin re-exports it does not use itself.
|
|
49
|
+
|
|
50
|
+
### Neutral
|
|
51
|
+
- Patch releases of the runtime for facade additions are normal, not exceptional.
|
|
52
|
+
|
|
53
|
+
## Enforcement
|
|
54
|
+
- Code review: a runtime PR that adds a host-facing Core name adds it to the facade's `__all__`
|
|
55
|
+
(and to a names list such as `email_facade.GATEWAY_NAMES` where one exists) with a one-line
|
|
56
|
+
comment naming the Core version and the host need.
|
|
57
|
+
- Hosts cite this ADR in their own boundary rule (AbstractGateway ADR 0001) and never add an
|
|
58
|
+
exemption to their import-boundary test for a name a facade could carry.
|
|
59
|
+
- A facade gap found during host work becomes a runtime backlog item or PR before the host
|
|
60
|
+
ships; the host's changelog names the runtime version that closes it.
|
|
61
|
+
|
|
62
|
+
## Validation
|
|
63
|
+
- `tests/test_email_review_fixes.py`: the email facade's export set equals Core's plus the
|
|
64
|
+
runtime's additions, every `GATEWAY_NAMES` entry imports, and re-exports keep identity.
|
|
65
|
+
- AbstractGateway `tests/test_gateway_import_boundary.py` stays green against the released
|
|
66
|
+
runtime floor the gateway pins.
|
|
67
|
+
- Release check: the runtime's docs list each facade's host-facing names
|
|
68
|
+
(`docs/integrations/abstractcore.md`, `docs/api.md`).
|
|
69
|
+
|
|
70
|
+
## Backlog links
|
|
71
|
+
- Originating: AbstractGateway backlog 1044 (mailbox Read and write access) needed
|
|
72
|
+
`resolve_srv_default`; closed by runtime 0.13.1 (`email_facade.resolve_srv_default`).
|
|
73
|
+
- Adoption: AbstractGateway `tests/test_gateway_import_boundary.py` (backlog 0059).
|
|
74
|
+
|
|
75
|
+
## Related
|
|
76
|
+
- ADR 0001 (layered coupling), 0004 (media execution), 0005 (discovery queries), 0006 (bloc
|
|
77
|
+
prompt cache): the per-area facades this ADR generalises.
|
|
78
|
+
- `src/abstractruntime/integrations/abstractcore/email_facade.py`, `voice_facade.py`,
|
|
79
|
+
`discovery_facade.py`.
|
|
80
|
+
- AbstractGateway ADR 0001: AbstractCore access goes through AbstractRuntime facades.
|
|
@@ -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).
|
|
@@ -20,6 +20,8 @@ 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 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 |
|
|
23
25
|
|
|
24
26
|
## Relationship to Backlog
|
|
25
27
|
|
|
@@ -34,6 +36,8 @@ ADRs explain *why*. Backlog items explain *what* and *how*.
|
|
|
34
36
|
| 0005 | `backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md` |
|
|
35
37
|
| 0006 | `backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md` |
|
|
36
38
|
| 0007 | `backlog/completed/0035_model_residency_provider_truth_for_local_http_clients.md`, `backlog/proposed/0036_local_media_residency_bridge_to_core_residency.md` |
|
|
39
|
+
| 0008 | AbstractGateway backlog 1044 (mailbox access) and `tests/test_gateway_import_boundary.py`; runtime 0.13.1 `email_facade.resolve_srv_default` |
|
|
40
|
+
| 0010 | `backlog/planned/0854_replay_view.md`; AbstractGateway backlog 0943 (view routes), 0082 (durable cursor); framework root 0993 |
|
|
37
41
|
|
|
38
42
|
## Adding New ADRs
|
|
39
43
|
|
|
@@ -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)
|
|
@@ -12,7 +12,7 @@ If you are new to the project, start with `../README.md` and `../architecture.md
|
|
|
12
12
|
|
|
13
13
|
## Counts
|
|
14
14
|
|
|
15
|
-
- Planned:
|
|
15
|
+
- Planned: 31
|
|
16
16
|
- Proposed: 14
|
|
17
17
|
- Completed: 37
|
|
18
18
|
- Deprecated: 13
|
|
@@ -145,6 +145,8 @@ mtime). The anticipated ADR ("an automation is its controller root run") is not
|
|
|
145
145
|
| 028* | `planned/028_selective_artifact_rehydration.md` |
|
|
146
146
|
| 0070 | `planned/0070_standalone_wui_browser_session_security_contract.md` |
|
|
147
147
|
| 0848 | `planned/0848_automations_v2_external_event_inbox_and_run_triggers.md` (P2, after 0847's release; contracts pass 2026-09-27) |
|
|
148
|
+
| 0853 | `planned/0853_session_tool_policy_before_the_approval_wait.md` (P1; abstractruntime 0.14.0: a conversation's approve/deny stored per session and applied before any approval wait, with an `abstract.tool_policy_decision` ledger record; gateway routes and client wiring remain) |
|
|
149
|
+
| 0854 | `planned/0854_replay_view.md` (P0; abstractruntime 0.14.0 carries the reducer, the durable per-run `seq` cursor and the conformance cases; gateway routes and client migration remain; ADR 0010) |
|
|
148
150
|
| 0044 | `planned/runtime_systemic_reliability/0044_meta_analysis_record.md` (track source record) |
|
|
149
151
|
| 0045 | `planned/runtime_systemic_reliability/0045_crash_replay_harness_and_ordering_invariant.md` |
|
|
150
152
|
| 0046 | `planned/runtime_systemic_reliability/0046_per_run_driver_exclusion.md` |
|
abstractruntime-0.14.0/docs/backlog/planned/0853_session_tool_policy_before_the_approval_wait.md
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# 0853-abstractruntime: [FEATURE] Session tool policy: a conversation's approve/deny applied before the approval wait
|
|
2
|
+
|
|
3
|
+
> Created: 2026-10-27
|
|
4
|
+
> Status: Planned (released in abstractruntime 0.14.0, 2026-10-27, PR #7 merge `ecfbb28`; remaining: the gateway floor and the follow-ups below)
|
|
5
|
+
> Type: feature
|
|
6
|
+
> Priority: P1
|
|
7
|
+
> Labels: tool-approval, ledger, replay, sessions
|
|
8
|
+
> Root: framework 1061 (cross-repo); related framework 0993 (one ledger replay, many views)
|
|
9
|
+
|
|
10
|
+
## Summary
|
|
11
|
+
|
|
12
|
+
"Approve all" / "approve this kind" becomes a durable, server-side session policy that the
|
|
13
|
+
TOOL_CALLS handler consults before deciding whether a batch waits. Covered calls run with no wait
|
|
14
|
+
and no interaction; denied calls are refused with no wait. Each decision is an
|
|
15
|
+
`abstract.tool_policy_decision` ledger record.
|
|
16
|
+
|
|
17
|
+
## Why
|
|
18
|
+
|
|
19
|
+
Operator, 2026-10-27, verbatim: "when a user gives permission to either all tools of a kind (e.g.
|
|
20
|
+
fetch url) OR all tools (all available/authorized for the user and authorized by the gateway), I
|
|
21
|
+
still see very quickly the gate approval showing up in apps and disappearing. Before sending the
|
|
22
|
+
gate approval, check whether the tool is already approved for the current session, and if so, do
|
|
23
|
+
not send the gate approval at all."
|
|
24
|
+
|
|
25
|
+
Before: the runtime knew only the start-time `_runtime.tool_policy`
|
|
26
|
+
(`effect_handlers.py` `_execute_with_run_policy_unscoped`), so it emitted `approval_required` for
|
|
27
|
+
every gated call; clients answered it after it arrived (panel-chat `autoApproveCurrentWait`,
|
|
28
|
+
desktop `should_auto_approve_tool_batch`, iPhone `applyConversationTrust`). The gate showed in
|
|
29
|
+
every client and in the replayable ledger.
|
|
30
|
+
|
|
31
|
+
## What ships (branch `feat/session-tool-policy`)
|
|
32
|
+
|
|
33
|
+
- `src/abstractruntime/storage/session_tool_policy.py`: `SessionToolPolicyStore` protocol,
|
|
34
|
+
`InMemorySessionToolPolicyStore`, `SqliteSessionToolPolicyStore` (revision, `if_revision`
|
|
35
|
+
conflicts, append-only history), `session_policy_names`.
|
|
36
|
+
- `Runtime(session_tool_policy_store=...)`, `Runtime.set_session_tool_policy_store()`; the tick
|
|
37
|
+
attaches it to the run (`_runtime_session_tool_policy_store`).
|
|
38
|
+
- `effect_handlers.py`: `_session_tool_policy_for_run` (scope rules), deny in the pre-pass,
|
|
39
|
+
approve inside `_execute_with_run_policy` (both the run-policy and the static branch),
|
|
40
|
+
`_append_tool_policy_record` (no record, no auto-approval).
|
|
41
|
+
- Docs: `docs/tool-approval.md#session-tool-policy-a-conversations-standing-word`.
|
|
42
|
+
- Tests: `tests/test_session_tool_policy.py` (no wait + audit record, delegated child, mid-run
|
|
43
|
+
change with the one-off path intact, deny, mixed batch still waits, start-time require list
|
|
44
|
+
overridden, out-of-scope runs keep asking, reset, restart via sqlite, no record means no
|
|
45
|
+
auto-approval, store revisions/history). Mutation-checked.
|
|
46
|
+
|
|
47
|
+
## Remaining
|
|
48
|
+
|
|
49
|
+
- The gateway's `ABSTRACTRUNTIME_FLOOR` raised to 0.14.0 (released 2026-10-27).
|
|
50
|
+
- Covering tools enabled after an `all` grant (today they ask until the person grants again).
|
|
51
|
+
- Answering waits that already exist when a policy is written (today the client answers the shown
|
|
52
|
+
one).
|
|
53
|
+
|
|
54
|
+
## Acceptance criteria
|
|
55
|
+
|
|
56
|
+
- [x] No `approval_required` wait for a session-approved call, in the root run or a delegated
|
|
57
|
+
child; an audit record instead.
|
|
58
|
+
- [x] Deny refuses with no wait; out-of-scope runs unchanged.
|
|
59
|
+
- [ ] Released, and the gateway floor raised.
|