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.
Files changed (602) hide show
  1. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/CHANGELOG.md +15 -0
  2. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/PKG-INFO +3 -3
  3. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/README.md +2 -2
  4. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/api.md +2 -0
  5. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/architecture.md +1 -1
  6. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/README.md +15 -1
  7. abstractruntime-0.5.1/docs/backlog/planned/0847_automations_v1_controller_contracts_occurrences_triggers.md +497 -0
  8. abstractruntime-0.5.1/docs/backlog/planned/0848_automations_v2_external_event_inbox_and_run_triggers.md +123 -0
  9. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/llms-full.txt +5 -3
  10. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/llms.txt +1 -1
  11. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/pyproject.toml +1 -1
  12. abstractruntime-0.5.1/release-notes.md +12 -0
  13. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/__init__.py +2 -1
  14. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/core/__init__.py +2 -1
  15. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/core/runtime.py +76 -7
  16. abstractruntime-0.5.1/tests/test_resume_concurrent_same_wait.py +155 -0
  17. abstractruntime-0.5.0/release-notes.md +0 -106
  18. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/.github/workflows/ci.yml +0 -0
  19. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/.github/workflows/release.yml +0 -0
  20. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/.gitignore +0 -0
  21. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/ACKNOWLEDGMENTS.md +0 -0
  22. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/CODE_OF_CONDUCT.md +0 -0
  23. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/CONTRIBUTING.md +0 -0
  24. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/LICENSE +0 -0
  25. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/ROADMAP.md +0 -0
  26. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/SECURITY.md +0 -0
  27. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/README.md +0 -0
  28. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
  29. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
  30. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
  31. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/adr/0004_runtime_owns_run_scoped_media_execution_truth.md +0 -0
  32. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/adr/0005_runtime_owns_abstractcore_host_discovery_queries.md +0 -0
  33. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/adr/0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md +0 -0
  34. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/adr/0007_runtime_relays_core_owned_model_residency_truth.md +0 -0
  35. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/adr/README.md +0 -0
  36. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/artifacts.md +0 -0
  37. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/001_runtime_kernel.md +0 -0
  38. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
  39. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/0030_runtime_host_facades_for_comms_telegram_and_tool_specs.md +0 -0
  40. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/0032_runtime_durable_outbound_comms_truth.md +0 -0
  41. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/0033_runtime_host_local_prompt_cache_export_import_surface.md +0 -0
  42. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/0035_model_residency_provider_truth_for_local_http_clients.md +0 -0
  43. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/0037_visualflow_generate_music_node_compiler_parity.md +0 -0
  44. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/0039_runtime_music_structure_prompt_bool_contract.md +0 -0
  45. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/003_wait_primitives.md +0 -0
  46. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/0040_task_agnostic_local_residency_listing.md +0 -0
  47. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/0041_runtime_hardware_extras_avoid_nonpermissive_document_stacks.md +0 -0
  48. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/0042_core_vision_upscale_and_parameter_surface.md +0 -0
  49. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/0043_runtime_vision_adapter_and_batch_surface.md +0 -0
  50. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/004_scheduler_driver.md +0 -0
  51. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
  52. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
  53. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
  54. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/009_artifact_store.md +0 -0
  55. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/010_examples_and_composition.md +0 -0
  56. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/011_subworkflow_support.md +0 -0
  57. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
  58. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
  59. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
  60. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/019_runtime_host_facade_for_core_operator_surfaces.md +0 -0
  61. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/020_runtime_gateway_install_boundary.md +0 -0
  62. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/021_runtime_gateway_env_namespace_cleanup.md +0 -0
  63. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/022_model_residency_control_plane.md +0 -0
  64. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/023_truthful_local_media_residency_boundaries.md +0 -0
  65. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/024_runtime_owned_run_scoped_media_execution.md +0 -0
  66. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md +0 -0
  67. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md +0 -0
  68. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/028_runtime_bloc_kv_lifecycle_and_pruning.md +0 -0
  69. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/029_runtime_music_generation_and_discovery_via_abstractcore.md +0 -0
  70. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/completed/0846_mlx_instance_scheduling_and_execution_controls.md +0 -0
  71. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
  72. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
  73. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
  74. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
  75. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/deprecated/0034_agent_runtime_convenience_constructor.md +0 -0
  76. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
  77. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
  78. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
  79. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/deprecated/004_tests.md +0 -0
  80. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/deprecated/005_docs_updates.md +0 -0
  81. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
  82. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
  83. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
  84. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/deprecated/README.md +0 -0
  85. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
  86. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/0070_standalone_wui_browser_session_security_contract.md +0 -0
  87. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
  88. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
  89. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
  90. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
  91. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/0233_real_run_cancellation.md +0 -0
  92. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/025_runtime_retention_and_purge_contract.md +0 -0
  93. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/026_context_checkpoint_self_compression.md +0 -0
  94. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/027_quote_provenance_discipline.md +0 -0
  95. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/028_selective_artifact_rehydration.md +0 -0
  96. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/0845_session_prompt_cache_resume_and_purge_contract.md +0 -0
  97. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/runtime_portability/0065_portable_process_and_lock_layer.md +0 -0
  98. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/runtime_portability/0066_portable_io_and_media_reader.md +0 -0
  99. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/runtime_portability/README.md +0 -0
  100. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/runtime_systemic_reliability/0044_meta_analysis_record.md +0 -0
  101. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/runtime_systemic_reliability/0045_crash_replay_harness_and_ordering_invariant.md +0 -0
  102. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/runtime_systemic_reliability/0046_per_run_driver_exclusion.md +0 -0
  103. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/runtime_systemic_reliability/0047_indexed_idempotency_lookup.md +0 -0
  104. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/runtime_systemic_reliability/0048_durable_io_unification.md +0 -0
  105. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/runtime_systemic_reliability/0049_llm_client_mechanical_split.md +0 -0
  106. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/runtime_systemic_reliability/0050_control_sidecar_all_writers.md +0 -0
  107. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/runtime_systemic_reliability/0051_runtime_owned_durable_event_mailbox.md +0 -0
  108. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/runtime_systemic_reliability/0052_sync_store_event_loop_tripwire.md +0 -0
  109. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/runtime_systemic_reliability/0053_bounded_run_vars_growth.md +0 -0
  110. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/runtime_systemic_reliability/0054_runtime_health_counters.md +0 -0
  111. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/runtime_systemic_reliability/0055_jsonl_store_honesty.md +0 -0
  112. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/runtime_systemic_reliability/0064_prompt_cache_fingerprint_stability.md +0 -0
  113. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/runtime_systemic_reliability/0067_durable_write_discipline.md +0 -0
  114. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/runtime_systemic_reliability/0068_hot_path_store_reads.md +0 -0
  115. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/planned/runtime_systemic_reliability/README.md +0 -0
  116. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/proposed/0031_runtime_tool_spec_adapters_for_gateway_and_mcp.md +0 -0
  117. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/proposed/0036_local_media_residency_bridge_to_core_residency.md +0 -0
  118. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/proposed/0038_core_server_pool_residency_affinity.md +0 -0
  119. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/proposed/0069_document_renderer_professional_figures.md +0 -0
  120. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/proposed/runtime_systemic_reliability/0056_schema_version_and_quarantine_loading.md +0 -0
  121. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/proposed/runtime_systemic_reliability/0057_trust_boundary_stamp_registry.md +0 -0
  122. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/proposed/runtime_systemic_reliability/0058_terminal_run_archival_helper.md +0 -0
  123. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/proposed/runtime_systemic_reliability/0059_memory_span_handler_extraction.md +0 -0
  124. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/proposed/runtime_systemic_reliability/0060_visualflow_compiler_decomposition.md +0 -0
  125. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/proposed/runtime_systemic_reliability/0061_root_api_deprecation_machinery.md +0 -0
  126. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/proposed/runtime_systemic_reliability/0062_dependency_honesty_extras.md +0 -0
  127. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/proposed/runtime_systemic_reliability/0063_b3_envelope_lane_unification.md +0 -0
  128. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/backlog/proposed/runtime_systemic_reliability/README.md +0 -0
  129. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/entity-runtime.md +0 -0
  130. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/evidence.md +0 -0
  131. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/faq.md +0 -0
  132. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/getting-started.md +0 -0
  133. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/integrations/abstractcore.md +0 -0
  134. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/limits.md +0 -0
  135. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/manual_testing.md +0 -0
  136. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/mcp-worker.md +0 -0
  137. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/proposal.md +0 -0
  138. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/provenance.md +0 -0
  139. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/snapshots.md +0 -0
  140. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/tool-approval.md +0 -0
  141. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/tools-comms.md +0 -0
  142. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/troubleshooting.md +0 -0
  143. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/docs/workflow-bundles.md +0 -0
  144. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/emails.config.example.yaml +0 -0
  145. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/examples/01_hello_world.py +0 -0
  146. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/examples/02_ask_user.py +0 -0
  147. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/examples/03_wait_until.py +0 -0
  148. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/examples/04_multi_step.py +0 -0
  149. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/examples/05_persistence.py +0 -0
  150. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/examples/06_llm_integration.py +0 -0
  151. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/examples/07_react_agent.py +0 -0
  152. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/examples/README.md +0 -0
  153. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/mkdocs.yml +0 -0
  154. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/pytest.ini +0 -0
  155. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/scripts/backfill_diary_edges.py +0 -0
  156. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/scripts/generate_llms_full.py +0 -0
  157. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/core/config.py +0 -0
  158. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/core/effect_cancellation.py +0 -0
  159. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/core/event_keys.py +0 -0
  160. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/core/health.py +0 -0
  161. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/core/live_deltas.py +0 -0
  162. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/core/models.py +0 -0
  163. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/core/policy.py +0 -0
  164. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/core/progress_channel.py +0 -0
  165. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/core/run_lifecycle.py +0 -0
  166. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/core/spec.py +0 -0
  167. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/core/tool_scope.py +0 -0
  168. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/core/vars.py +0 -0
  169. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/documents/__init__.py +0 -0
  170. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/documents/charts.py +0 -0
  171. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/documents/docx.py +0 -0
  172. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/documents/pdf.py +0 -0
  173. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/evidence/__init__.py +0 -0
  174. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/evidence/recorder.py +0 -0
  175. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/history_bundle.py +0 -0
  176. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/identity/__init__.py +0 -0
  177. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/identity/act_only.py +0 -0
  178. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/identity/chat.py +0 -0
  179. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/identity/communities.py +0 -0
  180. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/identity/diary.py +0 -0
  181. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/identity/digest.py +0 -0
  182. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/identity/entity_runtime.py +0 -0
  183. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/identity/fingerprint.py +0 -0
  184. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/identity/lease.py +0 -0
  185. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/identity/life.py +0 -0
  186. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/identity/memory_reader.py +0 -0
  187. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/identity/night_voice.py +0 -0
  188. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/identity/phase_graph.py +0 -0
  189. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/identity/phase_spec.py +0 -0
  190. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/identity/prelude.py +0 -0
  191. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/identity/prompt_overlay.py +0 -0
  192. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/identity/reflection.py +0 -0
  193. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/identity/spec/entity_phases.vendored.json +0 -0
  194. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/identity/substrate.py +0 -0
  195. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/identity/tool_effects.py +0 -0
  196. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/identity/tool_policy.py +0 -0
  197. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/identity/tools.py +0 -0
  198. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/identity/visit_workflow.py +0 -0
  199. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/__init__.py +0 -0
  200. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/__init__.py +0 -0
  201. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/agora_tools.py +0 -0
  202. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/comms_facade.py +0 -0
  203. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/config_facade.py +0 -0
  204. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
  205. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/data_registry_facade.py +0 -0
  206. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
  207. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/discovery_facade.py +0 -0
  208. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/discovery_queries.py +0 -0
  209. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +0 -0
  210. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
  211. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/factory.py +0 -0
  212. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/host_facade.py +0 -0
  213. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/llm_client.py +0 -0
  214. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/local_helper_tools.py +0 -0
  215. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
  216. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
  217. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/media_subprocess.py +0 -0
  218. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
  219. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/output_specs.py +0 -0
  220. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/run_facade.py +0 -0
  221. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
  222. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
  223. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/telegram_facade.py +0 -0
  224. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -0
  225. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/tool_inventory_facade.py +0 -0
  226. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +0 -0
  227. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
  228. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractmemory/brain_handlers.py +0 -0
  229. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
  230. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractmemory/identity_support.py +0 -0
  231. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/integrations/abstractmemory/seam_handlers.py +0 -0
  232. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/memory/__init__.py +0 -0
  233. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/memory/active_context.py +0 -0
  234. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/memory/active_memory.py +0 -0
  235. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/memory/compaction.py +0 -0
  236. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/memory/kg_packets.py +0 -0
  237. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/memory/memact_composer.py +0 -0
  238. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/memory/recall_levels.py +0 -0
  239. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/memory/token_budget.py +0 -0
  240. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/rendering/__init__.py +0 -0
  241. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
  242. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/rendering/json_stringify.py +0 -0
  243. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/scheduler/__init__.py +0 -0
  244. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/scheduler/convenience.py +0 -0
  245. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/scheduler/multi_store.py +0 -0
  246. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/scheduler/registry.py +0 -0
  247. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/scheduler/scheduler.py +0 -0
  248. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/session_history.py +0 -0
  249. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/storage/__init__.py +0 -0
  250. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/storage/artifacts.py +0 -0
  251. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/storage/base.py +0 -0
  252. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/storage/commands.py +0 -0
  253. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/storage/in_memory.py +0 -0
  254. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/storage/json_files.py +0 -0
  255. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/storage/lease.py +0 -0
  256. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/storage/ledger_chain.py +0 -0
  257. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/storage/ledger_slim.py +0 -0
  258. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/storage/observable.py +0 -0
  259. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/storage/offloading.py +0 -0
  260. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/storage/serialize.py +0 -0
  261. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/storage/snapshots.py +0 -0
  262. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/storage/sqlite.py +0 -0
  263. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/storage/steer_sidecar.py +0 -0
  264. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/turn_grounding.py +0 -0
  265. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/utils/__init__.py +0 -0
  266. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/utils/atomic_files.py +0 -0
  267. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/utils/file_filters.py +0 -0
  268. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/utils/workspace_paths.py +0 -0
  269. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
  270. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
  271. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
  272. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
  273. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
  274. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
  275. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
  276. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
  277. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
  278. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
  279. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
  280. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/visualflow_compiler/compiler.py +0 -0
  281. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
  282. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
  283. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
  284. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
  285. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
  286. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/visualflow_compiler/visual/execution_metrics.py +0 -0
  287. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/visualflow_compiler/visual/executor.py +0 -0
  288. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/visualflow_compiler/visual/function_library.py +0 -0
  289. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
  290. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
  291. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/visualflow_compiler/visual/pin_expressions.py +0 -0
  292. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
  293. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/workflow_bundle/models.py +0 -0
  294. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/workflow_bundle/packer.py +0 -0
  295. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/workflow_bundle/reader.py +0 -0
  296. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/src/abstractruntime/workflow_bundle/registry.py +0 -0
  297. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/README.md +0 -0
  298. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/conftest.py +0 -0
  299. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_abstractcore_comms_facade.py +0 -0
  300. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_abstractcore_discovery_facade.py +0 -0
  301. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_abstractcore_host_facade.py +0 -0
  302. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_abstractcore_run_facade.py +0 -0
  303. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_abstractcore_telegram_facade.py +0 -0
  304. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_active_context_policy.py +0 -0
  305. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_active_memory.py +0 -0
  306. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_agora_agent_alias_identity.py +0 -0
  307. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_agora_tools_http.py +0 -0
  308. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_analyze_media_addressing_and_walling.py +0 -0
  309. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_answer_user_effect.py +0 -0
  310. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_artifacts.py +0 -0
  311. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_browser_probe_target_walling.py +0 -0
  312. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_budget_law_no_unrequested_caps.py +0 -0
  313. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_capability_default_reasoning.py +0 -0
  314. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_chat_summarizer_integration.py +0 -0
  315. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_code_node_restricted_python.py +0 -0
  316. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_command_store.py +0 -0
  317. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_compaction_helpers.py +0 -0
  318. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_compaction_summarizer_route.py +0 -0
  319. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_config_facade_models_engines.py +0 -0
  320. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_control_adapter_while.py +0 -0
  321. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_crash_ordering_inversions.py +0 -0
  322. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_data_registry_facade.py +0 -0
  323. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_default_tools_camera_gating.py +0 -0
  324. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_default_tools_comms_gating.py +0 -0
  325. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_default_tools_include_skim_files.py +0 -0
  326. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_default_tools_include_skim_folders.py +0 -0
  327. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_default_tools_include_skim_web.py +0 -0
  328. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_default_tools_search_files_executor.py +0 -0
  329. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_diary_capture.py +0 -0
  330. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_diary_write_rescue.py +0 -0
  331. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_directory_lease.py +0 -0
  332. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_disabled_toolsets_seam.py +0 -0
  333. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_discovery_survives_unbuildable_default.py +0 -0
  334. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_document_markdown_tables.py +0 -0
  335. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_document_renderers_hr_quote.py +0 -0
  336. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_durable_toolsets.py +0 -0
  337. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_durable_write_discipline.py +0 -0
  338. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
  339. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_effect_cancellation.py +0 -0
  340. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_effect_issuance_idempotency.py +0 -0
  341. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_effect_payload_stays_json_serializable.py +0 -0
  342. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_election_consequence_teaching.py +0 -0
  343. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_emergence_experiment.py +0 -0
  344. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_emit_event_uses_wait_index.py +0 -0
  345. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_emit_event_without_workflow_registry.py +0 -0
  346. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_endpoint_profile_route_context.py +0 -0
  347. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_entity_awake_memory_fixes.py +0 -0
  348. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_entity_brain_effects.py +0 -0
  349. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_entity_chat_driver.py +0 -0
  350. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_entity_chat_tools_reflection.py +0 -0
  351. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_entity_diary.py +0 -0
  352. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_entity_execute_tool.py +0 -0
  353. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_entity_fetch_url_tool.py +0 -0
  354. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_entity_life_loop.py +0 -0
  355. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_entity_memory_richness.py +0 -0
  356. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_entity_phase_graph_conformance.py +0 -0
  357. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_entity_recent_memories.py +0 -0
  358. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_entity_runtime.py +0 -0
  359. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_entity_search_memory.py +0 -0
  360. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_entity_sleep_bound_and_yield_attribution.py +0 -0
  361. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_entity_substrate_resolution.py +0 -0
  362. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_entity_visit_honesty.py +0 -0
  363. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_entity_workspace_cap.py +0 -0
  364. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_entity_workspace_tools.py +0 -0
  365. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_event_wait_index.py +0 -0
  366. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_every_path_bearing_tool_is_walled.py +0 -0
  367. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_evidence_recorder.py +0 -0
  368. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_evidence_recorder_post_policy_envelope.py +0 -0
  369. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_execute_command_output_offload.py +0 -0
  370. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_execution_capability_discovery.py +0 -0
  371. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_explicit_eject_other_clients.py +0 -0
  372. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_factory_default_retry_policy.py +0 -0
  373. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
  374. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_format_repair_nudge.py +0 -0
  375. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_fresh_install_no_provider.py +0 -0
  376. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_gateway_facades_c4899.py +0 -0
  377. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_git_read_only_refiner.py +0 -0
  378. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_hf_process_residency_merge.py +0 -0
  379. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_hot_path_store_reads.py +0 -0
  380. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_indexed_idempotency_lookup.py +0 -0
  381. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_integration_abstractcore.py +0 -0
  382. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_integrations_abstractcore.py +0 -0
  383. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_json_file_run_store_children_index.py +0 -0
  384. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_json_run_cache_bound.py +0 -0
  385. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_json_store_scan_memo.py +0 -0
  386. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_jsonl_ledger_recovery.py +0 -0
  387. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_kg_learn_and_recall_contract.py +0 -0
  388. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_ledger_chain.py +0 -0
  389. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_ledger_record_slimming.py +0 -0
  390. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_ledger_subscription.py +0 -0
  391. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_live_token_deltas.py +0 -0
  392. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_llm_call_media_artifact_refs.py +0 -0
  393. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
  394. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
  395. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_llm_call_payload_shape_refusal.py +0 -0
  396. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_llm_call_requires_prompt.py +0 -0
  397. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_llm_call_response_schema_normalization.py +0 -0
  398. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_llm_call_structured_output_fallback.py +0 -0
  399. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_llm_call_text_phase_progress.py +0 -0
  400. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_llm_call_truncation_retry_contract.py +0 -0
  401. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_llm_call_use_context_appends_turn.py +0 -0
  402. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
  403. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_llm_client_grounding_tail.py +0 -0
  404. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_llm_client_media_artifacts.py +0 -0
  405. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_llm_client_system_context.py +0 -0
  406. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_llm_client_tool_call_parsing.py +0 -0
  407. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_llm_retry_classification.py +0 -0
  408. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_llm_streaming_on_token.py +0 -0
  409. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_local_helper_tool_exposure.py +0 -0
  410. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_local_residency_host_sweep.py +0 -0
  411. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
  412. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_max_iterations_ceiling.py +0 -0
  413. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_mcp_remote_tool_executor.py +0 -0
  414. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_mcp_worker_logging.py +0 -0
  415. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_mcp_worker_security.py +0 -0
  416. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_mcp_worker_stdio.py +0 -0
  417. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_media_artifact_resolution.py +0 -0
  418. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_media_capability_default_routing.py +0 -0
  419. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_media_subprocess.py +0 -0
  420. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_memact_composer_from_kg_result.py +0 -0
  421. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_memory_appraise_handler.py +0 -0
  422. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_memory_communities.py +0 -0
  423. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
  424. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_memory_kg_packets.py +0 -0
  425. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_memory_kg_predicate_aliasing.py +0 -0
  426. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_memory_kg_query_packetization_restart.py +0 -0
  427. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
  428. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
  429. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_memory_note_effect.py +0 -0
  430. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_memory_query_effect.py +0 -0
  431. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_memory_query_rich_filters.py +0 -0
  432. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
  433. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_memory_seam_handlers.py +0 -0
  434. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_memory_seam_sqlite_durability.py +0 -0
  435. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_memory_tag_effect.py +0 -0
  436. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_mlx_generation_serialization.py +0 -0
  437. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_mlx_process_residency_merge.py +0 -0
  438. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_model_eject_cancel.py +0 -0
  439. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_model_residency_clean_switch.py +0 -0
  440. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_model_residency_control_plane.py +0 -0
  441. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_model_residency_lock_and_context_estimate.py +0 -0
  442. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_multi_store_scheduler.py +0 -0
  443. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_multimodal_abstractcore_integration.py +0 -0
  444. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_native_mlx_application_wiring.py +0 -0
  445. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_native_mlx_execution_controls_live.py +0 -0
  446. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_native_tool_channel.py +0 -0
  447. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_night_voice.py +0 -0
  448. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_no_default_provider_refusal_ux.py +0 -0
  449. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_offload_answer_chain_c4978.py +0 -0
  450. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_offloaded_node_traces_report_unknown_not_zero.py +0 -0
  451. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_offloading.py +0 -0
  452. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_packaging_extras.py +0 -0
  453. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_parallel_readonly_tool_execution.py +0 -0
  454. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_pause_resume.py +0 -0
  455. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_pdf_unicode_rendering.py +0 -0
  456. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_personal_cycle.py +0 -0
  457. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_phantom_attachment_index.py +0 -0
  458. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_phase_graph_artifact_control.py +0 -0
  459. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_phase_graph_obedience.py +0 -0
  460. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_phase_vocabulary_migration.py +0 -0
  461. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_pooled_client_strips_construction_cache_key.py +0 -0
  462. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_prompt_cache_export_import.py +0 -0
  463. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_prompt_cache_fingerprint_stability.py +0 -0
  464. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_prompt_cache_modules.py +0 -0
  465. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_prompt_cache_posture_inheritance.py +0 -0
  466. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_prompt_cache_thinking_and_prompt_only.py +0 -0
  467. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_prompt_overlay.py +0 -0
  468. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_provider_endpoint_profile_resolution.py +0 -0
  469. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_provider_pin_routing_isolation.py +0 -0
  470. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_queryable_run_store.py +0 -0
  471. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
  472. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_read_idle_threading.py +0 -0
  473. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_readoption_experiment.py +0 -0
  474. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_real_integration.py +0 -0
  475. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_realize_election.py +0 -0
  476. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_recall_levels_policy.py +0 -0
  477. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_remote_client_cancel.py +0 -0
  478. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_remote_llm_client.py +0 -0
  479. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_remote_speculation_defaults.py +0 -0
  480. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_rendering_agent_trace_report.py +0 -0
  481. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_rendering_json_stringify.py +0 -0
  482. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_report_branding.py +0 -0
  483. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_retry_idempotency.py +0 -0
  484. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_run_history_bundle.py +0 -0
  485. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_run_scoped_tool_policy.py +0 -0
  486. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_run_tool_scope_ceiling.py +0 -0
  487. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_runtime_browser_session_boundary.py +0 -0
  488. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
  489. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_runtime_default_provider_model_refresh.py +0 -0
  490. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_runtime_effect_invocation_trace.py +0 -0
  491. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_runtime_health_and_bounded_vars.py +0 -0
  492. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_runtime_install_boundary.py +0 -0
  493. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
  494. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_runtime_node_traces.py +0 -0
  495. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_runtime_start_seeds_tool_support.py +0 -0
  496. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_runtime_tick_step_gate.py +0 -0
  497. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_scheduler.py +0 -0
  498. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_send_email_refiner.py +0 -0
  499. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
  500. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_session_history.py +0 -0
  501. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_session_prompt_cache_attribution.py +0 -0
  502. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_session_prompt_cache_visibility.py +0 -0
  503. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_session_route_stamp.py +0 -0
  504. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_shell_tool_exposure.py +0 -0
  505. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_snapshots.py +0 -0
  506. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_speculation_inheritance.py +0 -0
  507. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_speculation_reaches_provider_construction.py +0 -0
  508. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_sqlite_ledger_store.py +0 -0
  509. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_start_subworkflow_async_wait.py +0 -0
  510. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
  511. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
  512. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_steer_sidecar.py +0 -0
  513. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_storage_deletion.py +0 -0
  514. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_structured_output_schema_enum.py +0 -0
  515. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_subworkflow.py +0 -0
  516. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_terminal_effect_completion.py +0 -0
  517. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
  518. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_thinking_inheritance.py +0 -0
  519. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
  520. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_tool_approval_executor.py +0 -0
  521. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_tool_approval_resume_executes.py +0 -0
  522. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_tool_approval_wait_key_identity.py +0 -0
  523. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_tool_calls_idempotency_keys.py +0 -0
  524. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_tool_catalog.py +0 -0
  525. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_tool_descriptor_registry.py +0 -0
  526. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_tool_executor_argument_sanitization.py +0 -0
  527. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_tool_executor_error_output_detection.py +0 -0
  528. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_tool_executor_filename_alias.py +0 -0
  529. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
  530. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_tool_executor_read_file_aliases.py +0 -0
  531. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_tool_executor_timeout.py +0 -0
  532. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_tool_inventory_facade.py +0 -0
  533. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_tool_invoke_effect.py +0 -0
  534. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_tool_policy_and_mounts.py +0 -0
  535. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_tool_wait_allowlist_safety.py +0 -0
  536. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_topic_election_world_model.py +0 -0
  537. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_trace_context_propagation.py +0 -0
  538. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_turn_grounding_byte_stability.py +0 -0
  539. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_turn_grounding_carriers_a3.py +0 -0
  540. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_vars_query_effect.py +0 -0
  541. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visit_ab_fixture.py +0 -0
  542. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visit_history_replay_caps.py +0 -0
  543. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visit_midturn_elections.py +0 -0
  544. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visit_midturn_resume.py +0 -0
  545. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visit_workflow.py +0 -0
  546. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
  547. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visual_agent_skills_block_passthrough.py +0 -0
  548. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
  549. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
  550. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
  551. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
  552. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visual_entity_memory_nodes.py +0 -0
  553. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visual_flow_end_effect_only_persistence.py +0 -0
  554. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visual_llm_call_partial_override.py +0 -0
  555. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
  556. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visual_memact_compose_node.py +0 -0
  557. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
  558. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
  559. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
  560. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visual_unknown_node_type_refuses.py +0 -0
  561. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visual_wait_event_deadline_passthrough.py +0 -0
  562. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_add_message_builtin.py +0 -0
  563. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
  564. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_agora_react_agent.py +0 -0
  565. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_call_tool_node.py +0 -0
  566. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_capability_routes_and_thinking.py +0 -0
  567. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_compiler_basic.py +0 -0
  568. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
  569. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_continue_on_error.py +0 -0
  570. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_edit_json_schema_node.py +0 -0
  571. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_event_inbox_react_agent.py +0 -0
  572. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_file_nodes_workspace.py +0 -0
  573. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_function_library.py +0 -0
  574. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_get_element_node.py +0 -0
  575. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_get_random_element_node.py +0 -0
  576. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_get_var_node.py +0 -0
  577. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_has_tools_builtin.py +0 -0
  578. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
  579. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
  580. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_make_object_node.py +0 -0
  581. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_media_nodes.py +0 -0
  582. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_memory_effect_nodes.py +0 -0
  583. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_memory_source_pins.py +0 -0
  584. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_pin_expressions.py +0 -0
  585. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_prompt_only.py +0 -0
  586. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_random_nodes.py +0 -0
  587. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_schema_enum_switch.py +0 -0
  588. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_string_contains_replace.py +0 -0
  589. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_visualflow_tool_parameters_node.py +0 -0
  590. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_w4_feelings_lens.py +0 -0
  591. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_wait_event_deadline.py +0 -0
  592. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_wait_event_prompt_metadata.py +0 -0
  593. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_wait_until_streak.py +0 -0
  594. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_wait_until_utc_normalization.py +0 -0
  595. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_workflow_bundle_registry.py +0 -0
  596. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_workspace_builtin_deny.py +0 -0
  597. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_workspace_policy_absolute_reanchor.py +0 -0
  598. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_workspace_policy_allowlist_mode.py +0 -0
  599. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
  600. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
  601. {abstractruntime-0.5.0 → abstractruntime-0.5.1}/tests/test_workspace_prompt_context.py +0 -0
  602. {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.0
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.0 • **Python:** 3.10+
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.0)
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.0 • **Python:** 3.10+
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.0)
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.0
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: 28
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).