AbstractRuntime 0.5.0__tar.gz → 0.5.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/CHANGELOG.md +15 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/PKG-INFO +3 -3
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/README.md +2 -2
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/api.md +2 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/architecture.md +1 -1
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/README.md +15 -1
- abstractruntime-0.5.1/docs/backlog/planned/0847_automations_v1_controller_contracts_occurrences_triggers.md +497 -0
- abstractruntime-0.5.1/docs/backlog/planned/0848_automations_v2_external_event_inbox_and_run_triggers.md +123 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/llms-full.txt +5 -3
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/llms.txt +1 -1
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/pyproject.toml +1 -1
- abstractruntime-0.5.1/release-notes.md +12 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/__init__.py +2 -1
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/core/__init__.py +2 -1
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/core/runtime.py +76 -7
- abstractruntime-0.5.1/tests/test_resume_concurrent_same_wait.py +155 -0
- abstractruntime-0.5.0/release-notes.md +0 -106
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/.github/workflows/ci.yml +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/.github/workflows/release.yml +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/.gitignore +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/ACKNOWLEDGMENTS.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/CODE_OF_CONDUCT.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/CONTRIBUTING.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/LICENSE +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/ROADMAP.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/SECURITY.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/README.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/adr/0004_runtime_owns_run_scoped_media_execution_truth.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/adr/0005_runtime_owns_abstractcore_host_discovery_queries.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/adr/0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/adr/0007_runtime_relays_core_owned_model_residency_truth.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/adr/README.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/artifacts.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/001_runtime_kernel.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/0030_runtime_host_facades_for_comms_telegram_and_tool_specs.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/0032_runtime_durable_outbound_comms_truth.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/0033_runtime_host_local_prompt_cache_export_import_surface.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/0035_model_residency_provider_truth_for_local_http_clients.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/0037_visualflow_generate_music_node_compiler_parity.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/0039_runtime_music_structure_prompt_bool_contract.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/003_wait_primitives.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/0040_task_agnostic_local_residency_listing.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/0041_runtime_hardware_extras_avoid_nonpermissive_document_stacks.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/0042_core_vision_upscale_and_parameter_surface.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/0043_runtime_vision_adapter_and_batch_surface.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/004_scheduler_driver.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/009_artifact_store.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/010_examples_and_composition.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/011_subworkflow_support.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/019_runtime_host_facade_for_core_operator_surfaces.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/020_runtime_gateway_install_boundary.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/021_runtime_gateway_env_namespace_cleanup.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/022_model_residency_control_plane.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/023_truthful_local_media_residency_boundaries.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/024_runtime_owned_run_scoped_media_execution.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/028_runtime_bloc_kv_lifecycle_and_pruning.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/029_runtime_music_generation_and_discovery_via_abstractcore.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/0846_mlx_instance_scheduling_and_execution_controls.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/deprecated/0034_agent_runtime_convenience_constructor.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/deprecated/004_tests.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/deprecated/005_docs_updates.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/deprecated/README.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/0070_standalone_wui_browser_session_security_contract.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/0233_real_run_cancellation.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/025_runtime_retention_and_purge_contract.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/026_context_checkpoint_self_compression.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/027_quote_provenance_discipline.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/028_selective_artifact_rehydration.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/0845_session_prompt_cache_resume_and_purge_contract.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/runtime_portability/0065_portable_process_and_lock_layer.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/runtime_portability/0066_portable_io_and_media_reader.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/runtime_portability/README.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/runtime_systemic_reliability/0044_meta_analysis_record.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/runtime_systemic_reliability/0045_crash_replay_harness_and_ordering_invariant.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/runtime_systemic_reliability/0046_per_run_driver_exclusion.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/runtime_systemic_reliability/0047_indexed_idempotency_lookup.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/runtime_systemic_reliability/0048_durable_io_unification.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/runtime_systemic_reliability/0049_llm_client_mechanical_split.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/runtime_systemic_reliability/0050_control_sidecar_all_writers.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/runtime_systemic_reliability/0051_runtime_owned_durable_event_mailbox.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/runtime_systemic_reliability/0052_sync_store_event_loop_tripwire.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/runtime_systemic_reliability/0053_bounded_run_vars_growth.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/runtime_systemic_reliability/0054_runtime_health_counters.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/runtime_systemic_reliability/0055_jsonl_store_honesty.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/runtime_systemic_reliability/0064_prompt_cache_fingerprint_stability.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/runtime_systemic_reliability/0067_durable_write_discipline.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/runtime_systemic_reliability/0068_hot_path_store_reads.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/runtime_systemic_reliability/README.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/proposed/0031_runtime_tool_spec_adapters_for_gateway_and_mcp.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/proposed/0036_local_media_residency_bridge_to_core_residency.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/proposed/0038_core_server_pool_residency_affinity.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/proposed/0069_document_renderer_professional_figures.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/proposed/runtime_systemic_reliability/0056_schema_version_and_quarantine_loading.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/proposed/runtime_systemic_reliability/0057_trust_boundary_stamp_registry.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/proposed/runtime_systemic_reliability/0058_terminal_run_archival_helper.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/proposed/runtime_systemic_reliability/0059_memory_span_handler_extraction.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/proposed/runtime_systemic_reliability/0060_visualflow_compiler_decomposition.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/proposed/runtime_systemic_reliability/0061_root_api_deprecation_machinery.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/proposed/runtime_systemic_reliability/0062_dependency_honesty_extras.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/proposed/runtime_systemic_reliability/0063_b3_envelope_lane_unification.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/proposed/runtime_systemic_reliability/README.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/entity-runtime.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/evidence.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/faq.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/getting-started.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/integrations/abstractcore.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/limits.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/manual_testing.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/mcp-worker.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/proposal.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/provenance.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/snapshots.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/tool-approval.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/tools-comms.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/troubleshooting.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/workflow-bundles.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/emails.config.example.yaml +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/examples/01_hello_world.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/examples/02_ask_user.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/examples/03_wait_until.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/examples/04_multi_step.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/examples/05_persistence.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/examples/06_llm_integration.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/examples/07_react_agent.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/examples/README.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/mkdocs.yml +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/pytest.ini +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/scripts/backfill_diary_edges.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/scripts/generate_llms_full.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/core/config.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/core/effect_cancellation.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/core/event_keys.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/core/health.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/core/live_deltas.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/core/models.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/core/policy.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/core/progress_channel.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/core/run_lifecycle.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/core/spec.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/core/tool_scope.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/core/vars.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/documents/__init__.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/documents/charts.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/documents/docx.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/documents/pdf.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/evidence/__init__.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/evidence/recorder.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/history_bundle.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/identity/__init__.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/identity/act_only.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/identity/chat.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/identity/communities.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/identity/diary.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/identity/digest.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/identity/entity_runtime.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/identity/fingerprint.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/identity/lease.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/identity/life.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/identity/memory_reader.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/identity/night_voice.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/identity/phase_graph.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/identity/phase_spec.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/identity/prelude.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/identity/prompt_overlay.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/identity/reflection.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/identity/spec/entity_phases.vendored.json +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/identity/substrate.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/identity/tool_effects.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/identity/tool_policy.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/identity/tools.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/identity/visit_workflow.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/__init__.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/__init__.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/agora_tools.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/comms_facade.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/config_facade.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/data_registry_facade.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/discovery_facade.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/discovery_queries.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/factory.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/host_facade.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/llm_client.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/local_helper_tools.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/media_subprocess.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/output_specs.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/run_facade.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/telegram_facade.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/tool_inventory_facade.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractmemory/brain_handlers.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractmemory/identity_support.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractmemory/seam_handlers.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/memory/__init__.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/memory/active_context.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/memory/active_memory.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/memory/compaction.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/memory/kg_packets.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/memory/memact_composer.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/memory/recall_levels.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/memory/token_budget.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/rendering/__init__.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/rendering/json_stringify.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/scheduler/__init__.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/scheduler/convenience.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/scheduler/multi_store.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/scheduler/registry.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/scheduler/scheduler.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/session_history.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/storage/__init__.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/storage/artifacts.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/storage/base.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/storage/commands.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/storage/in_memory.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/storage/json_files.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/storage/lease.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/storage/ledger_chain.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/storage/ledger_slim.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/storage/observable.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/storage/offloading.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/storage/serialize.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/storage/snapshots.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/storage/sqlite.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/storage/steer_sidecar.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/turn_grounding.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/utils/__init__.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/utils/atomic_files.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/utils/file_filters.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/utils/workspace_paths.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/visualflow_compiler/compiler.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/visualflow_compiler/visual/execution_metrics.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/visualflow_compiler/visual/executor.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/visualflow_compiler/visual/function_library.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/visualflow_compiler/visual/pin_expressions.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/workflow_bundle/models.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/workflow_bundle/packer.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/workflow_bundle/reader.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/workflow_bundle/registry.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/README.md +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/conftest.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_abstractcore_comms_facade.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_abstractcore_discovery_facade.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_abstractcore_host_facade.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_abstractcore_run_facade.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_abstractcore_telegram_facade.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_active_context_policy.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_active_memory.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_agora_agent_alias_identity.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_agora_tools_http.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_analyze_media_addressing_and_walling.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_answer_user_effect.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_artifacts.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_browser_probe_target_walling.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_budget_law_no_unrequested_caps.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_capability_default_reasoning.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_chat_summarizer_integration.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_code_node_restricted_python.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_command_store.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_compaction_helpers.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_compaction_summarizer_route.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_config_facade_models_engines.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_control_adapter_while.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_crash_ordering_inversions.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_data_registry_facade.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_default_tools_camera_gating.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_default_tools_comms_gating.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_default_tools_include_skim_files.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_default_tools_include_skim_folders.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_default_tools_include_skim_web.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_default_tools_search_files_executor.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_diary_capture.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_diary_write_rescue.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_directory_lease.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_disabled_toolsets_seam.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_discovery_survives_unbuildable_default.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_document_markdown_tables.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_document_renderers_hr_quote.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_durable_toolsets.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_durable_write_discipline.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_effect_cancellation.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_effect_issuance_idempotency.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_effect_payload_stays_json_serializable.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_election_consequence_teaching.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_emergence_experiment.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_emit_event_uses_wait_index.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_emit_event_without_workflow_registry.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_endpoint_profile_route_context.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_entity_awake_memory_fixes.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_entity_brain_effects.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_entity_chat_driver.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_entity_chat_tools_reflection.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_entity_diary.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_entity_execute_tool.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_entity_fetch_url_tool.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_entity_life_loop.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_entity_memory_richness.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_entity_phase_graph_conformance.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_entity_recent_memories.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_entity_runtime.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_entity_search_memory.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_entity_sleep_bound_and_yield_attribution.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_entity_substrate_resolution.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_entity_visit_honesty.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_entity_workspace_cap.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_entity_workspace_tools.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_event_wait_index.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_every_path_bearing_tool_is_walled.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_evidence_recorder.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_evidence_recorder_post_policy_envelope.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_execute_command_output_offload.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_execution_capability_discovery.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_explicit_eject_other_clients.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_factory_default_retry_policy.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_format_repair_nudge.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_fresh_install_no_provider.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_gateway_facades_c4899.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_git_read_only_refiner.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_hf_process_residency_merge.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_hot_path_store_reads.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_indexed_idempotency_lookup.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_integration_abstractcore.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_integrations_abstractcore.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_json_file_run_store_children_index.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_json_run_cache_bound.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_json_store_scan_memo.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_jsonl_ledger_recovery.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_kg_learn_and_recall_contract.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_ledger_chain.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_ledger_record_slimming.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_ledger_subscription.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_live_token_deltas.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_llm_call_media_artifact_refs.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_llm_call_payload_shape_refusal.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_llm_call_requires_prompt.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_llm_call_response_schema_normalization.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_llm_call_structured_output_fallback.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_llm_call_text_phase_progress.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_llm_call_truncation_retry_contract.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_llm_call_use_context_appends_turn.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_llm_client_grounding_tail.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_llm_client_media_artifacts.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_llm_client_system_context.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_llm_client_tool_call_parsing.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_llm_retry_classification.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_llm_streaming_on_token.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_local_helper_tool_exposure.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_local_residency_host_sweep.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_max_iterations_ceiling.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_mcp_remote_tool_executor.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_mcp_worker_logging.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_mcp_worker_security.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_mcp_worker_stdio.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_media_artifact_resolution.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_media_capability_default_routing.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_media_subprocess.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_memact_composer_from_kg_result.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_memory_appraise_handler.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_memory_communities.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_memory_kg_packets.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_memory_kg_predicate_aliasing.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_memory_kg_query_packetization_restart.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_memory_note_effect.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_memory_query_effect.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_memory_query_rich_filters.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_memory_seam_handlers.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_memory_seam_sqlite_durability.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_memory_tag_effect.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_mlx_generation_serialization.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_mlx_process_residency_merge.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_model_eject_cancel.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_model_residency_clean_switch.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_model_residency_control_plane.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_model_residency_lock_and_context_estimate.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_multi_store_scheduler.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_multimodal_abstractcore_integration.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_native_mlx_application_wiring.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_native_mlx_execution_controls_live.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_native_tool_channel.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_night_voice.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_no_default_provider_refusal_ux.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_offload_answer_chain_c4978.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_offloaded_node_traces_report_unknown_not_zero.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_offloading.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_packaging_extras.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_parallel_readonly_tool_execution.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_pause_resume.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_pdf_unicode_rendering.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_personal_cycle.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_phantom_attachment_index.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_phase_graph_artifact_control.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_phase_graph_obedience.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_phase_vocabulary_migration.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_pooled_client_strips_construction_cache_key.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_prompt_cache_export_import.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_prompt_cache_fingerprint_stability.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_prompt_cache_modules.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_prompt_cache_posture_inheritance.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_prompt_cache_thinking_and_prompt_only.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_prompt_overlay.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_provider_endpoint_profile_resolution.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_provider_pin_routing_isolation.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_queryable_run_store.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_read_idle_threading.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_readoption_experiment.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_real_integration.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_realize_election.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_recall_levels_policy.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_remote_client_cancel.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_remote_llm_client.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_remote_speculation_defaults.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_rendering_agent_trace_report.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_rendering_json_stringify.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_report_branding.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_retry_idempotency.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_run_history_bundle.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_run_scoped_tool_policy.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_run_tool_scope_ceiling.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_runtime_browser_session_boundary.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_runtime_default_provider_model_refresh.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_runtime_effect_invocation_trace.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_runtime_health_and_bounded_vars.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_runtime_install_boundary.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_runtime_node_traces.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_runtime_start_seeds_tool_support.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_runtime_tick_step_gate.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_scheduler.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_send_email_refiner.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_session_history.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_session_prompt_cache_attribution.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_session_prompt_cache_visibility.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_session_route_stamp.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_shell_tool_exposure.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_snapshots.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_speculation_inheritance.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_speculation_reaches_provider_construction.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_sqlite_ledger_store.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_start_subworkflow_async_wait.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_steer_sidecar.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_storage_deletion.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_structured_output_schema_enum.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_subworkflow.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_terminal_effect_completion.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_thinking_inheritance.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_tool_approval_executor.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_tool_approval_resume_executes.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_tool_approval_wait_key_identity.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_tool_calls_idempotency_keys.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_tool_catalog.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_tool_descriptor_registry.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_tool_executor_argument_sanitization.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_tool_executor_error_output_detection.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_tool_executor_filename_alias.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_tool_executor_read_file_aliases.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_tool_executor_timeout.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_tool_inventory_facade.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_tool_invoke_effect.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_tool_policy_and_mounts.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_tool_wait_allowlist_safety.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_topic_election_world_model.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_trace_context_propagation.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_turn_grounding_byte_stability.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_turn_grounding_carriers_a3.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_vars_query_effect.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visit_ab_fixture.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visit_history_replay_caps.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visit_midturn_elections.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visit_midturn_resume.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visit_workflow.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visual_agent_skills_block_passthrough.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visual_entity_memory_nodes.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visual_flow_end_effect_only_persistence.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visual_llm_call_partial_override.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visual_memact_compose_node.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visual_unknown_node_type_refuses.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visual_wait_event_deadline_passthrough.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_add_message_builtin.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_agora_react_agent.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_call_tool_node.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_capability_routes_and_thinking.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_compiler_basic.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_continue_on_error.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_edit_json_schema_node.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_event_inbox_react_agent.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_file_nodes_workspace.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_function_library.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_get_element_node.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_get_random_element_node.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_get_var_node.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_has_tools_builtin.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_make_object_node.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_media_nodes.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_memory_effect_nodes.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_memory_source_pins.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_pin_expressions.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_prompt_only.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_random_nodes.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_schema_enum_switch.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_string_contains_replace.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_tool_parameters_node.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_w4_feelings_lens.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_wait_event_deadline.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_wait_event_prompt_metadata.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_wait_until_streak.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_wait_until_utc_normalization.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_workflow_bundle_registry.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_workspace_builtin_deny.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_workspace_policy_absolute_reanchor.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_workspace_policy_allowlist_mode.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_workspace_prompt_context.py +0 -0
- {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_write_chart.py +0 -0
|
@@ -5,6 +5,21 @@ All notable changes to AbstractRuntime will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [0.5.1] - 2026-09-26
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- `StaleResumeError` (a `ValueError`, exported from `abstractruntime`): what `Runtime.resume` raises
|
|
13
|
+
when the run is no longer waiting or waits on another key, so a host that resumes the same wait
|
|
14
|
+
from two places can tell a lost race from a real failure. The messages are unchanged.
|
|
15
|
+
|
|
16
|
+
### Fixed
|
|
17
|
+
|
|
18
|
+
- A wait is resumed at most once. Two callers resuming the same wait at the same moment could both
|
|
19
|
+
succeed, and the run then executed the resumed node twice (seen as an Agent node starting a
|
|
20
|
+
second full agent loop after its child finished). The second caller is now refused with
|
|
21
|
+
"Run is not waiting", as it already was when the calls did not overlap.
|
|
22
|
+
|
|
8
23
|
## [0.5.0] - 2026-09-26
|
|
9
24
|
|
|
10
25
|
### Fixed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: AbstractRuntime
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.1
|
|
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
|
|
@@ -54,7 +54,7 @@ Description-Content-Type: text/markdown
|
|
|
54
54
|
|
|
55
55
|
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.
|
|
56
56
|
|
|
57
|
-
**Version:** 0.5.
|
|
57
|
+
**Version:** 0.5.1 • **Python:** 3.10+
|
|
58
58
|
|
|
59
59
|
**Status:** pre-1.0 (API may evolve). For production use, pin versions and follow `CHANGELOG.md`.
|
|
60
60
|
|
|
@@ -146,7 +146,7 @@ state = rt.resume(
|
|
|
146
146
|
assert state.status.value == "completed"
|
|
147
147
|
```
|
|
148
148
|
|
|
149
|
-
## What’s included (v0.5.
|
|
149
|
+
## What’s included (v0.5.1)
|
|
150
150
|
|
|
151
151
|
Kernel (import-light):
|
|
152
152
|
- workflow graphs: `WorkflowSpec` (`src/abstractruntime/core/spec.py`)
|
|
@@ -4,7 +4,7 @@
|
|
|
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.5.
|
|
7
|
+
**Version:** 0.5.1 • **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
|
|
|
@@ -96,7 +96,7 @@ state = rt.resume(
|
|
|
96
96
|
assert state.status.value == "completed"
|
|
97
97
|
```
|
|
98
98
|
|
|
99
|
-
## What’s included (v0.5.
|
|
99
|
+
## What’s included (v0.5.1)
|
|
100
100
|
|
|
101
101
|
Kernel (import-light):
|
|
102
102
|
- workflow graphs: `WorkflowSpec` (`src/abstractruntime/core/spec.py`)
|
|
@@ -69,6 +69,8 @@ Implementation: `src/abstractruntime/core/runtime.py`.
|
|
|
69
69
|
- optional `step_gate()` is consulted at every step boundary; when it returns `False` the tick returns the persisted state and the run stays `RUNNING` (a later tick continues where it stopped)
|
|
70
70
|
- `Runtime.resume(workflow, run_id, wait_key, payload, max_steps=...) -> RunState`
|
|
71
71
|
- validates the `wait_key`, writes `payload` to `WaitState.result_key` (if set), and continues from `WaitState.resume_to_node`
|
|
72
|
+
- a wait is resumed at most once: a resume of a run that is no longer waiting, or that waits on another key, raises `StaleResumeError` (a `ValueError`), for example when another caller resumed it first
|
|
73
|
+
- the check and the commit run under a per-run lock, and tools approved with `{"approved": true}` execute while that lock is held, so a long tool delays a competing resume of the same run, which is then refused
|
|
72
74
|
- `Runtime.get_state(run_id) -> RunState` and `Runtime.get_ledger(run_id) -> list[dict]`
|
|
73
75
|
- host-facing read APIs for checkpoints and the append-only ledger
|
|
74
76
|
- `Runtime.cancel_run(run_id, reason=None, cancelled_by="api") -> RunState`
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# AbstractRuntime — Architecture
|
|
2
2
|
|
|
3
3
|
> Updated: 2026-09-26
|
|
4
|
-
> Version: 0.5.
|
|
4
|
+
> Version: 0.5.1
|
|
5
5
|
> Scope: this describes **what is implemented in this repository**.
|
|
6
6
|
|
|
7
7
|
AbstractRuntime is a **durable workflow runtime**: it executes workflow graphs as a persisted state machine with explicit waits (user, time, events, jobs, subworkflows). A run can pause for hours/days and resume **without** keeping Python stacks/coroutines alive.
|
|
@@ -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: 30
|
|
16
16
|
- Proposed: 12
|
|
17
17
|
- Completed: 34
|
|
18
18
|
- Deprecated: 13
|
|
@@ -24,6 +24,15 @@ repairs existing MLX instance scheduling and remote speculation/boolean-reasonin
|
|
|
24
24
|
forwarding; it does not add another provider. Core's deferred backend/capability
|
|
25
25
|
and pressure-eviction work is tracked separately by its planned 0848–0853.
|
|
26
26
|
|
|
27
|
+
2026-09-26: counts reconciled to disk (30 planned). Added the Automations
|
|
28
|
+
pair: [0847](planned/0847_automations_v1_controller_contracts_occurrences_triggers.md)
|
|
29
|
+
(P1, v1: controller bundle, definition/state contracts, deterministic
|
|
30
|
+
occurrence creation, trigger-source registry, session-turn selector, index
|
|
31
|
+
queries) and [0848](planned/0848_automations_v2_external_event_inbox_and_run_triggers.md)
|
|
32
|
+
(P2, planned after v1: durable external-event inbox, `event` and
|
|
33
|
+
`run.finished`/`run.failed` sources with reconciliation). Umbrella:
|
|
34
|
+
abstractframework backlog 0928.
|
|
35
|
+
|
|
27
36
|
## Topic tracks
|
|
28
37
|
|
|
29
38
|
- `planned/runtime_systemic_reliability/` + `proposed/runtime_systemic_reliability/`
|
|
@@ -43,6 +52,9 @@ and pressure-eviction work is tracked separately by its planned 0848–0853.
|
|
|
43
52
|
|
|
44
53
|
## Next recommended work
|
|
45
54
|
|
|
55
|
+
0. `planned/0847_automations_v1_controller_contracts_occurrences_triggers.md`
|
|
56
|
+
P1, leads the next minor wave (Automations v1); the gateway and apps
|
|
57
|
+
integrate against its contracts. `0848` (v2 external triggers) follows it.
|
|
46
58
|
1. `planned/runtime_systemic_reliability/0045_crash_replay_harness_and_ordering_invariant.md`
|
|
47
59
|
The keystone: kill-and-replay harness + ONE written crash-ordering
|
|
48
60
|
invariant + the two ordering-inversion fixes. Every other track item is a
|
|
@@ -121,6 +133,8 @@ and pressure-eviction work is tracked separately by its planned 0848–0853.
|
|
|
121
133
|
| 027* | `planned/027_quote_provenance_discipline.md` |
|
|
122
134
|
| 028* | `planned/028_selective_artifact_rehydration.md` |
|
|
123
135
|
| 0070 | `planned/0070_standalone_wui_browser_session_security_contract.md` |
|
|
136
|
+
| 0847 | `planned/0847_automations_v1_controller_contracts_occurrences_triggers.md` (P1, Automations v1) |
|
|
137
|
+
| 0848 | `planned/0848_automations_v2_external_event_inbox_and_run_triggers.md` (P2, planned after 0847) |
|
|
124
138
|
| 0044 | `planned/runtime_systemic_reliability/0044_meta_analysis_record.md` (track source record) |
|
|
125
139
|
| 0045 | `planned/runtime_systemic_reliability/0045_crash_replay_harness_and_ordering_invariant.md` |
|
|
126
140
|
| 0046 | `planned/runtime_systemic_reliability/0046_per_run_driver_exclusion.md` |
|
|
@@ -0,0 +1,497 @@
|
|
|
1
|
+
# 0847-abstractruntime: [FEATURE] Automations v1: controller bundle, definition/state contracts, deterministic occurrence creation, trigger-source registry, session-turn selector, index queries
|
|
2
|
+
|
|
3
|
+
> Created: 2026-09-26
|
|
4
|
+
> Status: Planned
|
|
5
|
+
> Type: feature
|
|
6
|
+
> Priority: P1 (leads the next minor wave; every other package's Automations work integrates against it)
|
|
7
|
+
> Labels: automations, triggers, durability, session-history, run-index
|
|
8
|
+
> Design: untracked/design/automations-PLAN.md (2026-09-26)
|
|
9
|
+
|
|
10
|
+
## Summary
|
|
11
|
+
|
|
12
|
+
Make an Automation a runtime-native durable workflow. The automation IS a
|
|
13
|
+
controller root run (`automation_id == controller root run_id`) executing one
|
|
14
|
+
pinned, runtime-packaged VisualFlow bundle
|
|
15
|
+
(`abstractframework.automation-controller@1.0.0`, flow `controller`). Each firing
|
|
16
|
+
is a serial child run (an *occurrence*) created with a deterministic id, so a
|
|
17
|
+
crash at any point around dispatch can never produce a duplicate or a lost
|
|
18
|
+
occurrence. Triggers are pluggable `TriggerAdapter`s discovered through the
|
|
19
|
+
entry-point group `abstractruntime.trigger_sources`; v1 ships `schedule@1` and
|
|
20
|
+
`manual@1`. Commands (revise, pause, resume, run now, stop current, archive) are
|
|
21
|
+
applied by one runtime function, `apply_automation_command`, under the same
|
|
22
|
+
per-run serialization as `resume()`. One session-turn selector
|
|
23
|
+
(`select_session_turns`) replaces the root-only history filters so Growing mode,
|
|
24
|
+
occurrence transcripts and Discuss all read the same conversation. Run-index
|
|
25
|
+
queries (`list_automations`, `latest_occurrence`, attribution filters on
|
|
26
|
+
`list_run_index`) let hosts project automations without loading run payloads.
|
|
27
|
+
Everything works from a bundle alone, without the gateway.
|
|
28
|
+
|
|
29
|
+
## Why
|
|
30
|
+
|
|
31
|
+
The operator's principles for the feature (design §1, verbatim):
|
|
32
|
+
|
|
33
|
+
> **Runtime-native.** Automations execute as durable runtime workflows, with ordinary run state, ledgers, artifacts and child runs.
|
|
34
|
+
>
|
|
35
|
+
> **One system.** An Automation is its root run. Gateway APIs and indexes project runtime truth; they do not independently schedule or execute work.
|
|
36
|
+
>
|
|
37
|
+
> **Extensible triggers.** "Trigger" is the user concept. Runtime `TriggerSource` adapters register once and become discoverable to hosts and apps.
|
|
38
|
+
>
|
|
39
|
+
> **Visible and manageable.** Users can inspect results and steps, edit definitions, pause/resume, run manually, stop current work and archive.
|
|
40
|
+
>
|
|
41
|
+
> **Conversation representation.** Each occurrence contributes a trigger/task turn and answer. Independent mode starts fresh; Growing mode supplies bounded prior conversation. Long-term summaries remain target-owned in v1.
|
|
42
|
+
>
|
|
43
|
+
> **Isolated discussion.** Discuss creates a separate session seeded at a selected occurrence. It cannot write into automation context or resources.
|
|
44
|
+
>
|
|
45
|
+
> **Minimal scope.** Reuse commands, stores, effects, bundles and tool ceilings. External admission, automatic summaries and connector infrastructure are deferred.
|
|
46
|
+
|
|
47
|
+
Operator rulings of 2026-09-26 (verbatim; they amend the design):
|
|
48
|
+
|
|
49
|
+
> 1. Runtime-root model with child occurrences: **approved**.
|
|
50
|
+
>
|
|
51
|
+
> 2. Independent mode as the default: **agreed** (matches today's `share_context=false` behaviour for isolated occurrences).
|
|
52
|
+
>
|
|
53
|
+
> 3. Schedule + manual first; external triggers in the next phase: **agreed**, but the next phase is a PLANNED backlog item, not proposed.
|
|
54
|
+
>
|
|
55
|
+
> 4. **Discuss is NOT read-only and NOT tool-restricted.** A discussion is a new durable runtime session, forked/seeded from the automation's
|
|
56
|
+
> conversation through the chosen occurrence, replayable like any session, with the target's normal tools. Isolation means only that it
|
|
57
|
+
> never writes back into the automation's session/context (a fork). Contract B's `DISCUSSION_READERS_V1` allowlist is DROPPED. Open detail
|
|
58
|
+
> (question to the operator): workspace of a discussion — own workspace with read access to the occurrence's, or shared read-write.
|
|
59
|
+
|
|
60
|
+
Today the only scheduling primitive is the `on_schedule` node inside a
|
|
61
|
+
user's flow and gateway-side `scheduled:` wrapper runs; neither is an
|
|
62
|
+
inspectable, editable, pausable object, their history is filtered out of
|
|
63
|
+
conversation replay, and a crash between "child started" and "parent waits"
|
|
64
|
+
leaves an orphan child that recovery cannot re-link.
|
|
65
|
+
|
|
66
|
+
## Scope and non-goals
|
|
67
|
+
|
|
68
|
+
### In scope (v1)
|
|
69
|
+
|
|
70
|
+
- **Contract A** — definition (`_meta.automation`), controller state
|
|
71
|
+
(`_runtime.automation`) and the `automation.*` ledger observations, recorded as
|
|
72
|
+
existing `emit_event` StepRecords with stable record identities.
|
|
73
|
+
- **Contract B** — occurrence attribution (`_meta.occurrence`, inherited by
|
|
74
|
+
descendants with `role:"descendant"`), deterministic child ids,
|
|
75
|
+
`Runtime.start(..., run_id=)` and `START_SUBWORKFLOW.payload.run_id` with
|
|
76
|
+
atomic create-if-absent + identity validation on every run store, and the
|
|
77
|
+
admission → child create/load → parent wait ordering with recovery that
|
|
78
|
+
reconstructs the wait. Discussion attribution (`_meta.discussion`) and a
|
|
79
|
+
discussion seed stored once and included in the discussion session's later
|
|
80
|
+
history composition.
|
|
81
|
+
- **Contract C** — `TriggerSource` / `TriggerBinding` / `TriggerEnvelope`,
|
|
82
|
+
the `TriggerAdapter` protocol, the `abstractruntime.trigger_sources`
|
|
83
|
+
entry-point group and registry, and the two v1 sources `schedule@1` and
|
|
84
|
+
`manual@1`.
|
|
85
|
+
- **Contract D** — the controller bundle packaged inside the wheel, its
|
|
86
|
+
`automation.<node_id>` adapters (issuing existing effects only), and
|
|
87
|
+
`apply_automation_command()` sharing the root's per-run lock.
|
|
88
|
+
- **Contract E** — `select_session_turns`, `list_run_index` attribution filters,
|
|
89
|
+
`latest_occurrence`, `list_automations`, and the indexed columns
|
|
90
|
+
`automation_id, role, occurrence_index, session_kind, change_cursor` on both
|
|
91
|
+
persistent stores (SQLite and JSON files) plus the in-memory and offloading
|
|
92
|
+
wrappers.
|
|
93
|
+
- Context modes: Independent (default; fresh `occurrence` session per
|
|
94
|
+
occurrence) and Growing (controller and occurrences share one `automation`
|
|
95
|
+
session; bounded prior conversation via the selector).
|
|
96
|
+
- Discuss at runtime level: a new `discussion` session seeded through a chosen
|
|
97
|
+
occurrence, replayable like any session, running the target with its normal
|
|
98
|
+
tools. It never writes into the automation's session or context.
|
|
99
|
+
|
|
100
|
+
### Out of scope (v1)
|
|
101
|
+
|
|
102
|
+
- External event admission (inbox, generic `event` source, `run.finished` /
|
|
103
|
+
`run.failed` sources) — planned as
|
|
104
|
+
[0848](0848_automations_v2_external_event_inbox_and_run_triggers.md).
|
|
105
|
+
- Any tool restriction on Discuss: the `DISCUSSION_READERS_V1` allowlist from the
|
|
106
|
+
design is dropped by operator ruling 4. The discussion's workspace model (own
|
|
107
|
+
workspace with read access vs shared read-write) is an open operator question;
|
|
108
|
+
do not guess — implement the fork of session/context and leave the workspace
|
|
109
|
+
policy to the ruling.
|
|
110
|
+
- Automatic Growing-mode summaries (`context.growing.summary` returns
|
|
111
|
+
`unsupported_feature`), constrained fetching, calendar scheduling, connectors.
|
|
112
|
+
- Gateway routes, attention/seen cursors, legacy-schedule projection, UI — owned
|
|
113
|
+
by the gateway and app packages.
|
|
114
|
+
- Parallel execution registry, template database, per-automation generated
|
|
115
|
+
flows, automatic legacy migration, universal broker, arbitrary filter
|
|
116
|
+
language, concurrent occurrences, delivery router, agent-memory transfer.
|
|
117
|
+
- Multi-process runners on one store: v1 supports one active runner per store
|
|
118
|
+
(see Risks; 0046 is the general fix).
|
|
119
|
+
|
|
120
|
+
## Contracts (copied from the design, §3 A–E)
|
|
121
|
+
|
|
122
|
+
Notation: `?` optional, timestamps UTC RFC3339, `JSON` arbitrary JSON. Other
|
|
123
|
+
objects reject unknown fields.
|
|
124
|
+
|
|
125
|
+
### A — Definition/state/ledger
|
|
126
|
+
|
|
127
|
+
```text
|
|
128
|
+
_meta.automation = {
|
|
129
|
+
schema_version:1, revision:int>=1=1, title:nonempty-string,
|
|
130
|
+
controller:{bundle_ref:"abstractframework.automation-controller@1.0.0",
|
|
131
|
+
flow_id:"controller"},
|
|
132
|
+
target:{workflow_id:string,bundle_ref:string,flow_id:string,input_data:JSON={}},
|
|
133
|
+
trigger:TriggerBinding,
|
|
134
|
+
context:{mode:"independent"|"growing"="independent",
|
|
135
|
+
growing:{summary?:{enabled:bool,every_n:int>=1,max_tokens:int>=1}}={}},
|
|
136
|
+
policy:{serial:true,misfire:"coalesce",failure:"continue"},
|
|
137
|
+
session_id:string,created_at:timestamp,archived_at:timestamp|null=null
|
|
138
|
+
}
|
|
139
|
+
_runtime.automation = {
|
|
140
|
+
active_revision:int=1,
|
|
141
|
+
pending_occurrence:null|{
|
|
142
|
+
run_id:UUID,index:int>=1,event_id:string,revision:int,
|
|
143
|
+
envelope:TriggerEnvelope,phase:"admitted"|"dispatched"
|
|
144
|
+
}=null,
|
|
145
|
+
anchor:timestamp|null=null,tick:int>=0=0,next_index:int>=1=1,
|
|
146
|
+
scheduled_count:int>=0=0,paused:bool=false,
|
|
147
|
+
last_outcome:null|{run_id:UUID,index:int,status:string,finished_at:timestamp}=null
|
|
148
|
+
}
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Server owns IDs, timestamps and revisions. Any supplied
|
|
152
|
+
`context.growing.summary` returns `unsupported_feature` in v1.
|
|
153
|
+
|
|
154
|
+
Ledger observations use existing StepRecords with `effect.type="emit_event"`,
|
|
155
|
+
`effect.payload.name` below and `effect.payload.payload`:
|
|
156
|
+
|
|
157
|
+
```text
|
|
158
|
+
common={schema_version:1,automation_id,revision,at,command_id?}
|
|
159
|
+
automation.created common+{definition}
|
|
160
|
+
automation.revised common+{previous_revision,definition}
|
|
161
|
+
automation.admitted common+{run_id,index,event_id,trigger_envelope}
|
|
162
|
+
automation.dispatched common+{run_id,index}
|
|
163
|
+
automation.completed common+{run_id,index,status,finished_at,notify}
|
|
164
|
+
automation.coalesced common+{first_tick,last_tick,missed_count,event_id}
|
|
165
|
+
automation.paused common+{}
|
|
166
|
+
automation.resumed common+{next_fire_at}
|
|
167
|
+
automation.archived common+{active_occurrence_run_id?}
|
|
168
|
+
automation.command_result
|
|
169
|
+
common+{command_id,status:"applied"|"rejected",error?}
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
These record facts, not external delivery. Stable record identities prevent
|
|
173
|
+
duplicate observations.
|
|
174
|
+
|
|
175
|
+
Command semantics (design §2): **Pause** suspends scheduled admissions; the
|
|
176
|
+
current occurrence finishes. **Run now** is allowed while paused, executes once
|
|
177
|
+
and remains paused; rejected when busy/exhausted/archived; no queue. **Resume**
|
|
178
|
+
re-arms without firing or catching up paused time. **Revise** activates at the
|
|
179
|
+
next controller boundary and re-arms idle waits without firing. **Stop current**
|
|
180
|
+
cancels the occurrence tree only. **Archive** prevents future admissions,
|
|
181
|
+
finishes current work, retains history. Normal downtime coalesces missed
|
|
182
|
+
scheduled ticks into at most one occurrence. Automation pause is
|
|
183
|
+
`_runtime.automation.paused`, not runtime execution freeze: the parked command
|
|
184
|
+
wait accepts manual admission and the flag remains true.
|
|
185
|
+
|
|
186
|
+
### B — Attribution/creation/discussion
|
|
187
|
+
|
|
188
|
+
```text
|
|
189
|
+
_meta.occurrence={
|
|
190
|
+
automation_id:UUID,occurrence_index:int>=1,event_id:string,revision:int>=1,
|
|
191
|
+
role:"occurrence"|"descendant",fired_at:timestamp,
|
|
192
|
+
trigger_envelope:TriggerEnvelope
|
|
193
|
+
}
|
|
194
|
+
_meta.discussion={
|
|
195
|
+
automation_id,occurrence_index,revision,seed_run_id,seed_messages?
|
|
196
|
+
}
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
Descendants inherit attribution with `role:"descendant"`; only occurrence roots
|
|
200
|
+
become turns. Discussion seed is stored once and included in subsequent local
|
|
201
|
+
history composition.
|
|
202
|
+
|
|
203
|
+
Child IDs:
|
|
204
|
+
|
|
205
|
+
```python
|
|
206
|
+
uuid5(UUID(automation_id), f"{revision}:{occurrence_index}") # scheduled
|
|
207
|
+
uuid5(UUID(automation_id), "manual:" + command_id) # manual
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
Add `Runtime.start(..., run_id: str|None=None)` and
|
|
211
|
+
`START_SUBWORKFLOW.payload.run_id`; neither currently exists. Explicit IDs
|
|
212
|
+
require atomic create-if-absent and identity validation, never overwrite.
|
|
213
|
+
Persist admission first; create/load child; persist parent wait. Recovery
|
|
214
|
+
reconstructs the wait.
|
|
215
|
+
|
|
216
|
+
> **Amended by operator ruling 4 (2026-09-26):** the design's Discuss ceiling
|
|
217
|
+
> (`_runtime.allowed_tools = target_effective_tools ∩ DISCUSSION_READERS_V1`) is
|
|
218
|
+
> DROPPED. A discussion runs with the target's normal tools and ceiling; its
|
|
219
|
+
> isolation is a fork of session/context only.
|
|
220
|
+
|
|
221
|
+
### C — Triggers
|
|
222
|
+
|
|
223
|
+
```text
|
|
224
|
+
TriggerSource={
|
|
225
|
+
id:string,version:int>=1,label:string,config_schema:JSONSchema,
|
|
226
|
+
event_schema:JSONSchema,capabilities:{kind:"time"|"manual"|"event"}
|
|
227
|
+
}
|
|
228
|
+
TriggerBinding={
|
|
229
|
+
binding_id:UUID,source_id:string,source_version:int,config:JSON
|
|
230
|
+
}
|
|
231
|
+
TriggerEnvelope={
|
|
232
|
+
event_id:string,source_id:string,source_version:int,
|
|
233
|
+
fired_at:timestamp,payload:JSON,binding_id:UUID
|
|
234
|
+
}
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
Entry-point group: `abstractruntime.trigger_sources`.
|
|
238
|
+
|
|
239
|
+
```python
|
|
240
|
+
class TriggerAdapter(Protocol):
|
|
241
|
+
descriptor: TriggerSource
|
|
242
|
+
def validate(self, config: dict) -> dict: ...
|
|
243
|
+
def prepare(self, binding: TriggerBinding, *,
|
|
244
|
+
state: dict, now: str) -> TriggerWait: ...
|
|
245
|
+
def normalize(self, binding: TriggerBinding, *,
|
|
246
|
+
event_id: str, fired_at: str,
|
|
247
|
+
payload: dict) -> TriggerEnvelope: ...
|
|
248
|
+
|
|
249
|
+
# TriggerWait:
|
|
250
|
+
# {kind:"until",until:timestamp}
|
|
251
|
+
# {kind:"event",scope:"run",name:string}
|
|
252
|
+
# {kind:"exhausted"}
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
```text
|
|
256
|
+
schedule@1:{start_at?:timestamp,every?:string,until?:timestamp,
|
|
257
|
+
count?:int>=1,anchor?:timestamp}
|
|
258
|
+
manual@1:{}
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
Persist defaults `start_at=creation_time`, `anchor=start_at`; initially require
|
|
262
|
+
equal values. `every` is a positive integer duration `[smhd]`; absent means
|
|
263
|
+
one-shot. `count>1` requires `every`. Count scheduled admissions only; one
|
|
264
|
+
coalesced firing counts once. `until` is exclusive.
|
|
265
|
+
|
|
266
|
+
### D — Controller
|
|
267
|
+
|
|
268
|
+
Bundle `abstractframework.automation-controller@1.0.0`, flow `controller`.
|
|
269
|
+
|
|
270
|
+
```text
|
|
271
|
+
start:on_flow_start
|
|
272
|
+
→ read_definition → wait → admit → prepare_context
|
|
273
|
+
→ dispatch → record_outcome → next → read_definition
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
Middle nodes have `nodeType:"automation"` and corresponding adapter IDs
|
|
277
|
+
`automation.<node_id>`. Exhausted/archive paths reach `end:on_flow_end`.
|
|
278
|
+
|
|
279
|
+
Adapters issue existing effects. `apply_automation_command()` shares root
|
|
280
|
+
mutation serialization; revisions activate at `read_definition`. Manual
|
|
281
|
+
admission bypasses only the automation pause gate.
|
|
282
|
+
|
|
283
|
+
### E — Queries
|
|
284
|
+
|
|
285
|
+
```python
|
|
286
|
+
list_run_index(..., automation_id: str|None=None,
|
|
287
|
+
role: str|None=None, session_kind: str|None=None,
|
|
288
|
+
changed_since: str|None=None) -> list[RunIndexRow]
|
|
289
|
+
latest_occurrence(automation_id: str) -> RunIndexRow|None
|
|
290
|
+
list_automations(*, status: str|None=None, changed_since: str|None=None,
|
|
291
|
+
cursor: str|None=None, limit: int=50) -> Page
|
|
292
|
+
select_session_turns(store, session_id: str, *,
|
|
293
|
+
include_occurrences: bool=True,
|
|
294
|
+
before: str|None=None, automation_id: str|None=None,
|
|
295
|
+
through_occurrence: int|None=None,
|
|
296
|
+
limit: int=50) -> list[Turn]
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
Add indexed `automation_id,role,occurrence_index,session_kind,change_cursor`.
|
|
300
|
+
No runtime `plane` parameter; gateway selects the store. Session kinds derive
|
|
301
|
+
from attribution/controller linkage, including children. Existing indexes omit
|
|
302
|
+
vars.
|
|
303
|
+
|
|
304
|
+
`Page={items,next_cursor,change_cursor}`; opaque restart-stable cursors,
|
|
305
|
+
explicit invalidation after incompatible rebuild, archive tombstones retained.
|
|
306
|
+
|
|
307
|
+
## Current code reality
|
|
308
|
+
|
|
309
|
+
Verified 2026-09-26 against `2100d1f` (paths under `src/abstractruntime/`):
|
|
310
|
+
|
|
311
|
+
- **No explicit run id.** `Runtime.start` (`core/runtime.py:1292-1484`) accepts
|
|
312
|
+
`workflow, vars, actor_id, session_id, parent_run_id` only; the id comes from
|
|
313
|
+
`RunState.new` → `str(uuid.uuid4())` (`core/models.py:219-238`), and the run is
|
|
314
|
+
persisted with a plain `self._run_store.save(run)` (`core/runtime.py:1483`).
|
|
315
|
+
- **Stores upsert; there is no create-if-absent.** SQLite `save`
|
|
316
|
+
(`storage/sqlite.py:522`) is `INSERT … ON CONFLICT(run_id) DO UPDATE`; the
|
|
317
|
+
JSON store (`storage/json_files.py:513`) writes a temp file and `replace()`s.
|
|
318
|
+
An explicit id therefore needs a new atomic create-or-load primitive on every
|
|
319
|
+
`RunStore` (SQLite, JSON files, in-memory, offloading wrapper).
|
|
320
|
+
- **Subworkflow child id is random and saved before the parent waits.**
|
|
321
|
+
`_handle_start_subworkflow` (`core/runtime.py:4164`) calls `self.start(...)`
|
|
322
|
+
at `core/runtime.py:4453` (random child id, child saved immediately), then
|
|
323
|
+
returns `EffectOutcome.waiting(WaitState(wait_key=f"subworkflow:{sub_run_id}"))`
|
|
324
|
+
(`core/runtime.py:4470-4486`). The parent's wait is recorded in the ledger at
|
|
325
|
+
`core/runtime.py:3649-3654` and committed to the run store only at
|
|
326
|
+
`core/runtime.py:2696-2706`. A crash between the two leaves an orphan child and
|
|
327
|
+
a parent that re-dispatches a second child on replay.
|
|
328
|
+
- **Per-run lock is held only by resume.** `_PerRunLocks`
|
|
329
|
+
(`core/runtime.py:492-522`, process-wide RLock per run id, instance
|
|
330
|
+
`_RESUME_LOCKS` at `:525`) is acquired only in `resume()`
|
|
331
|
+
(`core/runtime.py:2813`). Commands and controller boundaries must join it; it
|
|
332
|
+
does not serialize separate processes.
|
|
333
|
+
- **Terminal state is saved before the terminal event.** Every terminal path
|
|
334
|
+
saves the run and only then calls `_append_terminal_status_event`
|
|
335
|
+
(`core/runtime.py:2640-2641`, `:2690-2691`, `:2722-2723`; method at `:2068`).
|
|
336
|
+
Occurrence completion must therefore be observed by reading the child's state
|
|
337
|
+
on the parent's resume, not by relying on the event alone.
|
|
338
|
+
- **Conversation replay is bounded and root-only.** `session_chat_messages`
|
|
339
|
+
(`session_history.py:75`, defaults 40 messages / 8 000 chars per message /
|
|
340
|
+
24 000 total) rides `_best_effort_session_turns`
|
|
341
|
+
(`history_bundle.py:686`), which queries
|
|
342
|
+
`list_run_index(session_id=sid, root_only=True, …)` (`history_bundle.py:816`)
|
|
343
|
+
and also skips runs with a `parent_run_id` on the scan path
|
|
344
|
+
(`history_bundle.py:872-873`). `_classify_turn` (`history_bundle.py:708-727`)
|
|
345
|
+
labels any run with `_meta.schedule` or a `scheduled:` workflow id as
|
|
346
|
+
`scheduled`, and `session_chat_messages` drops `scheduled` turns
|
|
347
|
+
(`session_history.py:155-158`). Occurrence child runs are invisible to every
|
|
348
|
+
history path today; `select_session_turns` must replace these filters, not add
|
|
349
|
+
a parallel one.
|
|
350
|
+
- **`on_schedule` is drift-based, not anchored.** The node handler
|
|
351
|
+
(`visualflow_compiler/adapters/event_adapter.py:98-205`) computes
|
|
352
|
+
`until = now + interval` on each pass (`:140-148`) and accepts `ms` and
|
|
353
|
+
decimal amounts (`:134`). `schedule@1` is anchored (`anchor + tick*every`),
|
|
354
|
+
integer `[smhd]` only, with coalescing; it must not reuse this time math.
|
|
355
|
+
- **Index filters.** `QueryableRunIndexStore.list_run_index`
|
|
356
|
+
(`storage/base.py:125-141`) filters by `status, workflow_id, session_id,
|
|
357
|
+
root_only` only; the SQLite implementation (`storage/sqlite.py:709`, page query
|
|
358
|
+
at `:747-758`) selects fixed columns and never reads vars. JSON files
|
|
359
|
+
(`storage/json_files.py:719`), in-memory (`storage/in_memory.py:68`) and
|
|
360
|
+
offloading (`storage/offloading.py:419`) mirror the same signature.
|
|
361
|
+
- **Bundles load without the gateway.** `open_workflow_bundle`
|
|
362
|
+
(`workflow_bundle/reader.py:75`) opens a directory or `.flow` zip; nothing in
|
|
363
|
+
the package ships a bundle as a resource yet, and `pyproject.toml` declares no
|
|
364
|
+
entry-point groups (wheel = `packages = ["src/abstractruntime"]`).
|
|
365
|
+
- **Command store exists and is idempotent per process.** `JsonlCommandStore.append`
|
|
366
|
+
(`storage/commands.py:276`) dedups on `command_id` under an in-process lock and
|
|
367
|
+
returns `CommandAppendResult(accepted, duplicate, seq)`; cursors live in
|
|
368
|
+
`JsonFileCommandCursorStore` (`:183`). The runtime has no automation command
|
|
369
|
+
applier; the gateway runner polls and applies commands itself.
|
|
370
|
+
- **Tool ceilings.** `resolve_tool_scope` (`core/tool_scope.py:20`) intersects a
|
|
371
|
+
run's `allowed_tools` with every ancestor. Discussion runs must be started
|
|
372
|
+
without a parent link to the automation tree so this intersection does not
|
|
373
|
+
inherit the controller's or occurrence's ceiling by accident.
|
|
374
|
+
- No `automation` or `trigger_source` identifier exists anywhere in `src/`.
|
|
375
|
+
|
|
376
|
+
## Seams
|
|
377
|
+
|
|
378
|
+
### What this item must READ before writing (owned by other packages)
|
|
379
|
+
|
|
380
|
+
- **abstractgateway `src/abstractgateway/runner.py`** — the command lane
|
|
381
|
+
(`_poll_commands` at `:1293`, `_apply_command` at `:1754`) and the
|
|
382
|
+
parent-resume behaviour for `subworkflow:` waits (`:500-550`, `:2531`), so that
|
|
383
|
+
controller children are driven and their parents resumed exactly once by the
|
|
384
|
+
host that already does this, and so `apply_automation_command` is callable from
|
|
385
|
+
`_apply_command` without a second applier.
|
|
386
|
+
- **abstractgateway `src/abstractgateway/hosts/bundle_host.py`** —
|
|
387
|
+
`_seed_session_history` (`:2024`), the host-side session history seeding that
|
|
388
|
+
`select_session_turns` must feed (Growing mode, discussion seed), so the
|
|
389
|
+
gateway swaps its call rather than keeping a second history path.
|
|
390
|
+
|
|
391
|
+
Any reference to these that is not verified in the live code is written to fail
|
|
392
|
+
loudly and raised with the gateway owner, never hedged.
|
|
393
|
+
|
|
394
|
+
### What other packages read from this item (identifiers owned here)
|
|
395
|
+
|
|
396
|
+
- `apply_automation_command(...)` — the only automation command applier.
|
|
397
|
+
- `Runtime.start(..., run_id=...)` and `START_SUBWORKFLOW.payload.run_id`.
|
|
398
|
+
- `select_session_turns(store, session_id, *, include_occurrences, before,
|
|
399
|
+
automation_id, through_occurrence, limit)`.
|
|
400
|
+
- `list_automations(...)`, `latest_occurrence(automation_id)`, and the new
|
|
401
|
+
`list_run_index` filters (`automation_id`, `role`, `session_kind`,
|
|
402
|
+
`changed_since`).
|
|
403
|
+
- `TriggerAdapter`, `TriggerSource`, `TriggerBinding`, `TriggerEnvelope`, and the
|
|
404
|
+
entry-point group `abstractruntime.trigger_sources`.
|
|
405
|
+
- Bundle `abstractframework.automation-controller@1.0.0`, flow `controller`.
|
|
406
|
+
- The `automation.*` ledger event names and the `_meta.automation`,
|
|
407
|
+
`_runtime.automation`, `_meta.occurrence`, `_meta.discussion` shapes.
|
|
408
|
+
|
|
409
|
+
These names are frozen once this item lands; the gateway integrates against them
|
|
410
|
+
before its own work completes.
|
|
411
|
+
|
|
412
|
+
## Acceptance criteria
|
|
413
|
+
|
|
414
|
+
- [ ] `Runtime.start(run_id=...)` and `START_SUBWORKFLOW.payload.run_id` create a
|
|
415
|
+
run atomically if absent, load it when present with a matching identity,
|
|
416
|
+
and raise `identity_conflict` on a mismatch; no path overwrites an existing
|
|
417
|
+
run. Implemented on SQLite, JSON files, in-memory and offloading stores.
|
|
418
|
+
- [ ] Occurrence dispatch persists admission → creates/loads the child →
|
|
419
|
+
persists the parent wait; a crash injected at every commit point yields
|
|
420
|
+
exactly one child per `(revision, occurrence_index)` or `manual:command_id`,
|
|
421
|
+
and recovery reconstructs the parent's wait.
|
|
422
|
+
- [ ] `apply_automation_command` applies revise/pause/resume/run_now/
|
|
423
|
+
stop_current/archive under the root's per-run lock (shared with
|
|
424
|
+
`resume()`); duplicate `command_id`s are idempotent and every outcome is
|
|
425
|
+
recorded as `automation.command_result`.
|
|
426
|
+
- [ ] Pause/run-now/resume/revise/archive semantics match the design §2 rules
|
|
427
|
+
(no catch-up on resume, at most one coalesced occurrence after downtime,
|
|
428
|
+
run-now while paused stays paused, busy/exhausted/archived rejections).
|
|
429
|
+
- [ ] `schedule@1` and `manual@1` are discovered through
|
|
430
|
+
`abstractruntime.trigger_sources`; a third-party source registered by entry
|
|
431
|
+
point appears in the registry with no code change here.
|
|
432
|
+
- [ ] Independent mode starts each occurrence in a fresh `occurrence` session;
|
|
433
|
+
Growing mode supplies bounded prior conversation from
|
|
434
|
+
`select_session_turns`; only occurrence roots become turns.
|
|
435
|
+
- [ ] A discussion session is seeded once through the selected occurrence,
|
|
436
|
+
replays like any session over several turns, runs with the target's normal
|
|
437
|
+
tools, and never writes into the automation's session or context.
|
|
438
|
+
- [ ] `list_automations`, `latest_occurrence` and the `list_run_index`
|
|
439
|
+
attribution filters return the same results on SQLite and JSON files;
|
|
440
|
+
cursors survive a restart; archive tombstones remain listable.
|
|
441
|
+
- [ ] Replaying an automation's history performs zero provider and tool calls.
|
|
442
|
+
- [ ] The controller bundle ships inside the wheel and runs standalone with a
|
|
443
|
+
runtime and a store, without the gateway.
|
|
444
|
+
- [ ] Architecture, API and backlog docs describe the contracts; no gateway,
|
|
445
|
+
app or UI change is part of this item.
|
|
446
|
+
|
|
447
|
+
## Testing
|
|
448
|
+
|
|
449
|
+
Deliver, and run against both persistent stores:
|
|
450
|
+
|
|
451
|
+
- `tests/test_automation_occurrence_recovery.py` — crash around every dispatch
|
|
452
|
+
commit; exactly one child, reconstructed wait.
|
|
453
|
+
- `tests/test_automation_commands.py` — edit/pause/manual/restart races,
|
|
454
|
+
idempotent replays, revision checks.
|
|
455
|
+
- `tests/test_automation_session_turns.py` — multiple occurrences and discussion
|
|
456
|
+
turns through `select_session_turns`, Independent vs Growing.
|
|
457
|
+
- `tests/test_automation_discussion_isolation.py` — discussion turns with normal
|
|
458
|
+
tools never write into the automation session, context or controller state.
|
|
459
|
+
- `tests/test_automation_index.py` — attribution filters, `list_automations`
|
|
460
|
+
paging, `latest_occurrence`, restart-stable cursors, tombstones.
|
|
461
|
+
- `tests/test_automation_replay_read_only.py` — history replay makes zero
|
|
462
|
+
provider/tool calls.
|
|
463
|
+
|
|
464
|
+
Full suite green; no live provider required (deterministic fixture flows).
|
|
465
|
+
|
|
466
|
+
## Risks
|
|
467
|
+
|
|
468
|
+
| Risk | Mitigation | Proof |
|
|
469
|
+
|---|---|---|
|
|
470
|
+
| Duplicate children | Atomic deterministic create-or-load | `test_automation_occurrence_recovery.py`: crash around every dispatch commit |
|
|
471
|
+
| Command races/replay | Shared root lock, idempotent outcomes, optional revision checks | `test_automation_commands.py`: edit/pause/manual/restart races |
|
|
472
|
+
| Lost/duplicated context | Shared selector, persistent discussion seed | `test_automation_session_turns.py`: multiple occurrences/discussion turns |
|
|
473
|
+
| Discussion writes back into the automation | Discussion is a separate session (fork); no parent link into the automation tree | `test_automation_discussion_isolation.py` |
|
|
474
|
+
|
|
475
|
+
Additional runtime-owned risks: the per-run lock is process-local, so two
|
|
476
|
+
runners on one store can still race (v1 supports one active runner per store;
|
|
477
|
+
the general fix is
|
|
478
|
+
[0046](runtime_systemic_reliability/0046_per_run_driver_exclusion.md)); a
|
|
479
|
+
long-lived controller root accumulates vars and ledger records (keep controller
|
|
480
|
+
state bounded; see
|
|
481
|
+
[0053](runtime_systemic_reliability/0053_bounded_run_vars_growth.md)).
|
|
482
|
+
|
|
483
|
+
## Dependencies and ADR status
|
|
484
|
+
|
|
485
|
+
- Upstream: none. Downstream: the gateway Automations work depends on this item
|
|
486
|
+
and must integrate against it before completing.
|
|
487
|
+
- Related runtime items: 0045 (crash-ordering invariant — the dispatch ordering
|
|
488
|
+
here is an instance of it), 0046, 0053, and
|
|
489
|
+
[0848](0848_automations_v2_external_event_inbox_and_run_triggers.md) (v2).
|
|
490
|
+
- ADR impact: likely one new ADR — "an automation is its controller root run;
|
|
491
|
+
occurrences are deterministic child runs" — to be written with the
|
|
492
|
+
implementation, not before.
|
|
493
|
+
- Effort estimate from the design: 8–12 engineer-days (±50%).
|
|
494
|
+
|
|
495
|
+
## Related
|
|
496
|
+
|
|
497
|
+
- abstractframework backlog 0928 (Automations umbrella).
|