AbstractRuntime 0.16.0__tar.gz → 0.18.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (909) hide show
  1. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/CHANGELOG.md +138 -0
  2. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/PKG-INFO +45 -7
  3. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/README.md +41 -3
  4. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/README.md +2 -0
  5. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/adr/0002_execution_modes_local_remote_hybrid.md +1 -0
  6. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/api.md +5 -3
  7. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/architecture.md +6 -0
  8. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/automations.md +6 -2
  9. abstractruntime-0.18.0/docs/backlog/proposed/0865_model_loaded_ledger_event.md +27 -0
  10. abstractruntime-0.18.0/docs/digital-identity.md +184 -0
  11. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/entity-runtime.md +3 -0
  12. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/getting-started.md +1 -1
  13. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/integrations/abstractcore.md +5 -3
  14. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/replay.md +5 -2
  15. abstractruntime-0.18.0/docs/track-record.md +176 -0
  16. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/troubleshooting.md +16 -1
  17. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/workflow-bundles.md +12 -0
  18. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/llms-full.txt +476 -15
  19. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/llms.txt +4 -2
  20. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/mkdocs.yml +2 -0
  21. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/pyproject.toml +7 -4
  22. abstractruntime-0.18.0/release-notes.md +86 -0
  23. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/scripts/changelog.py +63 -1
  24. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/scripts/generate_llms_full.py +2 -0
  25. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/skills/abstractruntime/SKILL.md +8 -2
  26. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/__init__.py +2 -0
  27. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/automations/attention.py +11 -1
  28. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/core/effect_cancellation.py +15 -0
  29. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/core/live_deltas.py +1 -0
  30. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/core/run_attribution.py +12 -4
  31. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/core/runtime.py +19 -1
  32. abstractruntime-0.18.0/src/abstractruntime/identity/__init__.py +86 -0
  33. abstractruntime-0.18.0/src/abstractruntime/identity/acquaintances.py +249 -0
  34. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/identity/chat.py +6 -1
  35. abstractruntime-0.18.0/src/abstractruntime/identity/digital_identity.py +854 -0
  36. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/identity/life.py +42 -1
  37. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/identity/prelude.py +28 -1
  38. abstractruntime-0.18.0/src/abstractruntime/identity/track_record.py +735 -0
  39. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/identity/visit_workflow.py +10 -1
  40. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/integrations/abstractcore/discovery_facade.py +18 -0
  41. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/integrations/abstractcore/host_facade.py +28 -0
  42. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/integrations/abstractcore/llm_client.py +112 -3
  43. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/integrations/abstractcore/output_specs.py +1 -1
  44. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/integrations/abstractcore/tool_executor.py +15 -3
  45. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/a2_delegated_approval_completed/expected_view.json +4 -0
  46. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/a_delegated_child_approval/expected_view.json +2 -0
  47. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/c_parallel_tool_batch/expected_view.json +2 -0
  48. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/e2_structured_repeated_node/expected_view.json +2 -0
  49. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/f_windowed_slim/expected_view.json +1 -0
  50. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/h_denied_approval/expected_view.json +1 -0
  51. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/view.py +8 -1
  52. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/storage/sqlite.py +31 -2
  53. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/visualflow_compiler/compiler.py +8 -1
  54. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/visualflow_compiler/visual/builtins.py +101 -27
  55. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/visualflow_compiler/visual/executor.py +7 -1
  56. abstractruntime-0.18.0/tests/fixtures/visualflow/compare_text_operands.json +38 -0
  57. abstractruntime-0.18.0/tests/fixtures/visualflow/typed_literals_flow.json +223 -0
  58. abstractruntime-0.18.0/tests/fixtures/visualflow/typed_literals_flow.legacy.json +219 -0
  59. abstractruntime-0.18.0/tests/test_automation_occurrence_error.py +41 -0
  60. abstractruntime-0.18.0/tests/test_changelog_fragments.py +158 -0
  61. abstractruntime-0.18.0/tests/test_digital_identity.py +722 -0
  62. abstractruntime-0.18.0/tests/test_discovery_facade_model_errors.py +24 -0
  63. abstractruntime-0.18.0/tests/test_duck_typed_store_session_attribution.py +45 -0
  64. abstractruntime-0.18.0/tests/test_effect_interrupted.py +144 -0
  65. abstractruntime-0.18.0/tests/test_identity_acquaintances.py +181 -0
  66. abstractruntime-0.18.0/tests/test_identity_track_record.py +473 -0
  67. abstractruntime-0.18.0/tests/test_model_idle_unload_relay.py +114 -0
  68. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_model_residency_clean_switch.py +3 -1
  69. abstractruntime-0.18.0/tests/test_model_residency_lock_set.py +85 -0
  70. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_packaging_extras.py +9 -3
  71. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_replay_public_updates.py +8 -0
  72. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_sqlite_ledger_store.py +3 -1
  73. abstractruntime-0.18.0/tests/test_tool_executor_error_output_detection.py +129 -0
  74. abstractruntime-0.18.0/tests/test_visual_compare_typed_values.py +117 -0
  75. abstractruntime-0.16.0/release-notes.md +0 -76
  76. abstractruntime-0.16.0/src/abstractruntime/identity/__init__.py +0 -17
  77. abstractruntime-0.16.0/tests/test_changelog_fragments.py +0 -78
  78. abstractruntime-0.16.0/tests/test_tool_executor_error_output_detection.py +0 -40
  79. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/.github/workflows/changelog.yml +0 -0
  80. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/.github/workflows/ci.yml +0 -0
  81. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/.github/workflows/release.yml +0 -0
  82. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/.gitignore +0 -0
  83. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/ACKNOWLEDGMENTS.md +0 -0
  84. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/CODE_OF_CONDUCT.md +0 -0
  85. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/CONTRIBUTING.md +0 -0
  86. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/LICENSE +0 -0
  87. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/ROADMAP.md +0 -0
  88. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/SECURITY.md +0 -0
  89. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/changelog.d/README.md +0 -0
  90. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
  91. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
  92. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/adr/0004_runtime_owns_run_scoped_media_execution_truth.md +0 -0
  93. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/adr/0005_runtime_owns_abstractcore_host_discovery_queries.md +0 -0
  94. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/adr/0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md +0 -0
  95. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/adr/0007_runtime_relays_core_owned_model_residency_truth.md +0 -0
  96. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/adr/0008_integration_facades_are_the_complete_host_surface.md +0 -0
  97. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/adr/0010_one_replay_many_views.md +0 -0
  98. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/adr/0011_memory_facade_is_the_complete_host_surface_for_abstractmemory.md +0 -0
  99. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/adr/README.md +0 -0
  100. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/artifacts.md +0 -0
  101. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/README.md +0 -0
  102. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/completed/001_runtime_kernel.md +0 -0
  103. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
  104. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/completed/0030_runtime_host_facades_for_comms_telegram_and_tool_specs.md +0 -0
  105. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/completed/0032_runtime_durable_outbound_comms_truth.md +0 -0
  106. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/completed/0033_runtime_host_local_prompt_cache_export_import_surface.md +0 -0
  107. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/completed/0035_model_residency_provider_truth_for_local_http_clients.md +0 -0
  108. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/completed/0037_visualflow_generate_music_node_compiler_parity.md +0 -0
  109. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/completed/0039_runtime_music_structure_prompt_bool_contract.md +0 -0
  110. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/completed/003_wait_primitives.md +0 -0
  111. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/completed/0040_task_agnostic_local_residency_listing.md +0 -0
  112. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/completed/0041_runtime_hardware_extras_avoid_nonpermissive_document_stacks.md +0 -0
  113. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/completed/0042_core_vision_upscale_and_parameter_surface.md +0 -0
  114. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/completed/0043_runtime_vision_adapter_and_batch_surface.md +0 -0
  115. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/completed/004_scheduler_driver.md +0 -0
  116. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
  117. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
  118. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
  119. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/completed/009_artifact_store.md +0 -0
  120. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/completed/010_examples_and_composition.md +0 -0
  121. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/completed/011_subworkflow_support.md +0 -0
  122. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
  123. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
  124. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
  125. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/completed/019_runtime_host_facade_for_core_operator_surfaces.md +0 -0
  126. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/completed/020_runtime_gateway_install_boundary.md +0 -0
  127. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/completed/021_runtime_gateway_env_namespace_cleanup.md +0 -0
  128. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/completed/022_model_residency_control_plane.md +0 -0
  129. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/completed/023_truthful_local_media_residency_boundaries.md +0 -0
  130. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/completed/024_runtime_owned_run_scoped_media_execution.md +0 -0
  131. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md +0 -0
  132. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md +0 -0
  133. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/completed/028_runtime_bloc_kv_lifecycle_and_pruning.md +0 -0
  134. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/completed/029_runtime_music_generation_and_discovery_via_abstractcore.md +0 -0
  135. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/completed/0846_mlx_instance_scheduling_and_execution_controls.md +0 -0
  136. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/completed/0847_automations_v1_controller_contracts_occurrences_triggers.md +0 -0
  137. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/completed/0851_per_account_voice_stores.md +0 -0
  138. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/completed/0852_capability_refusals_are_not_retried.md +0 -0
  139. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/completed/0855_prefix_stability_contract_of_consecutive_llm_calls.md +0 -0
  140. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/completed/0856_memory_facade_and_ledger_provenance.md +0 -0
  141. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/completed/0862_is_empty_accepts_lists.md +0 -0
  142. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/completed/0863_index_build_never_loses_a_run_created_during_it.md +0 -0
  143. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/completed/0864_facade_catalog_hub_search_pages.md +0 -0
  144. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
  145. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
  146. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
  147. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
  148. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/deprecated/0034_agent_runtime_convenience_constructor.md +0 -0
  149. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
  150. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
  151. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
  152. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/deprecated/004_tests.md +0 -0
  153. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/deprecated/005_docs_updates.md +0 -0
  154. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
  155. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
  156. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
  157. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/deprecated/README.md +0 -0
  158. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
  159. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/planned/0070_standalone_wui_browser_session_security_contract.md +0 -0
  160. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
  161. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
  162. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
  163. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
  164. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/planned/0233_real_run_cancellation.md +0 -0
  165. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/planned/025_runtime_retention_and_purge_contract.md +0 -0
  166. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/planned/026_context_checkpoint_self_compression.md +0 -0
  167. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/planned/027_quote_provenance_discipline.md +0 -0
  168. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/planned/028_selective_artifact_rehydration.md +0 -0
  169. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/planned/0845_session_prompt_cache_resume_and_purge_contract.md +0 -0
  170. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/planned/0848_automations_v2_external_event_inbox_and_run_triggers.md +0 -0
  171. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/planned/0853_session_tool_policy_before_the_approval_wait.md +0 -0
  172. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/planned/0854_replay_view.md +0 -0
  173. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/planned/0857_entity_direct_memory_writes_provenance.md +0 -0
  174. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/planned/0858_typed_runs_run_type_stamped_at_start.md +0 -0
  175. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/planned/0859_replay_view_ephemeral_text_deltas.md +0 -0
  176. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/planned/0866_queued_state_in_the_ledger_and_pools_lend_never_build.md +0 -0
  177. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/planned/runtime_portability/0065_portable_process_and_lock_layer.md +0 -0
  178. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/planned/runtime_portability/0066_portable_io_and_media_reader.md +0 -0
  179. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/planned/runtime_portability/README.md +0 -0
  180. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/planned/runtime_systemic_reliability/0044_meta_analysis_record.md +0 -0
  181. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/planned/runtime_systemic_reliability/0045_crash_replay_harness_and_ordering_invariant.md +0 -0
  182. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/planned/runtime_systemic_reliability/0046_per_run_driver_exclusion.md +0 -0
  183. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/planned/runtime_systemic_reliability/0047_indexed_idempotency_lookup.md +0 -0
  184. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/planned/runtime_systemic_reliability/0048_durable_io_unification.md +0 -0
  185. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/planned/runtime_systemic_reliability/0049_llm_client_mechanical_split.md +0 -0
  186. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/planned/runtime_systemic_reliability/0050_control_sidecar_all_writers.md +0 -0
  187. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/planned/runtime_systemic_reliability/0051_runtime_owned_durable_event_mailbox.md +0 -0
  188. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/planned/runtime_systemic_reliability/0052_sync_store_event_loop_tripwire.md +0 -0
  189. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/planned/runtime_systemic_reliability/0053_bounded_run_vars_growth.md +0 -0
  190. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/planned/runtime_systemic_reliability/0054_runtime_health_counters.md +0 -0
  191. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/planned/runtime_systemic_reliability/0055_jsonl_store_honesty.md +0 -0
  192. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/planned/runtime_systemic_reliability/0064_prompt_cache_fingerprint_stability.md +0 -0
  193. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/planned/runtime_systemic_reliability/0067_durable_write_discipline.md +0 -0
  194. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/planned/runtime_systemic_reliability/0068_hot_path_store_reads.md +0 -0
  195. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/planned/runtime_systemic_reliability/README.md +0 -0
  196. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/proposed/0031_runtime_tool_spec_adapters_for_gateway_and_mcp.md +0 -0
  197. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/proposed/0036_local_media_residency_bridge_to_core_residency.md +0 -0
  198. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/proposed/0038_core_server_pool_residency_affinity.md +0 -0
  199. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/proposed/0069_document_renderer_professional_figures.md +0 -0
  200. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/proposed/0849_conversation_search_tool_usage_outputs_and_thinking.md +0 -0
  201. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/proposed/0850_growing_automation_history_out_of_the_controller_ledger.md +0 -0
  202. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/proposed/0860_replay_view_stop_wording_from_the_ledger.md +0 -0
  203. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/proposed/0861_replay_view_activity_tool_sandbox_and_call_timings.md +0 -0
  204. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/proposed/0862_replay_view_message_artifacts_exclude_bookkeeping.md +0 -0
  205. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/proposed/runtime_systemic_reliability/0056_schema_version_and_quarantine_loading.md +0 -0
  206. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/proposed/runtime_systemic_reliability/0057_trust_boundary_stamp_registry.md +0 -0
  207. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/proposed/runtime_systemic_reliability/0058_terminal_run_archival_helper.md +0 -0
  208. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/proposed/runtime_systemic_reliability/0059_memory_span_handler_extraction.md +0 -0
  209. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/proposed/runtime_systemic_reliability/0060_visualflow_compiler_decomposition.md +0 -0
  210. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/proposed/runtime_systemic_reliability/0061_root_api_deprecation_machinery.md +0 -0
  211. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/proposed/runtime_systemic_reliability/0062_dependency_honesty_extras.md +0 -0
  212. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/proposed/runtime_systemic_reliability/0063_b3_envelope_lane_unification.md +0 -0
  213. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/backlog/proposed/runtime_systemic_reliability/README.md +0 -0
  214. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/email.md +0 -0
  215. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/evidence.md +0 -0
  216. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/faq.md +0 -0
  217. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/integrations/abstractmemory.md +0 -0
  218. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/limits.md +0 -0
  219. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/manual_testing.md +0 -0
  220. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/mcp-worker.md +0 -0
  221. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/proposal.md +0 -0
  222. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/provenance.md +0 -0
  223. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/snapshots.md +0 -0
  224. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/tool-approval.md +0 -0
  225. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/docs/tools-comms.md +0 -0
  226. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/examples/01_hello_world.py +0 -0
  227. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/examples/02_ask_user.py +0 -0
  228. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/examples/03_wait_until.py +0 -0
  229. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/examples/04_multi_step.py +0 -0
  230. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/examples/05_persistence.py +0 -0
  231. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/examples/06_llm_integration.py +0 -0
  232. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/examples/07_react_agent.py +0 -0
  233. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/examples/README.md +0 -0
  234. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/pytest.ini +0 -0
  235. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/scripts/backfill_diary_edges.py +0 -0
  236. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/scripts/regen_replay_conformance.py +0 -0
  237. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/automation_queries.py +0 -0
  238. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/automations/__init__.py +0 -0
  239. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/automations/adapters.py +0 -0
  240. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/automations/bundle.py +0 -0
  241. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/automations/bundles/automation-controller/flows/controller.json +0 -0
  242. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/automations/bundles/automation-controller/manifest.json +0 -0
  243. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/automations/commands.py +0 -0
  244. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/automations/consumers.py +0 -0
  245. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/automations/controller.py +0 -0
  246. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/automations/ledger.py +0 -0
  247. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/automations/models.py +0 -0
  248. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/automations/samples.py +0 -0
  249. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/automations/service.py +0 -0
  250. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/automations/wakes.py +0 -0
  251. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/conversation_search.py +0 -0
  252. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/core/__init__.py +0 -0
  253. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/core/config.py +0 -0
  254. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/core/event_keys.py +0 -0
  255. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/core/health.py +0 -0
  256. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/core/models.py +0 -0
  257. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/core/policy.py +0 -0
  258. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/core/progress_channel.py +0 -0
  259. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/core/publish.py +0 -0
  260. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/core/questions.py +0 -0
  261. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/core/run_identity.py +0 -0
  262. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/core/run_lifecycle.py +0 -0
  263. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/core/run_origin.py +0 -0
  264. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/core/spec.py +0 -0
  265. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/core/step_context.py +0 -0
  266. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/core/tool_scope.py +0 -0
  267. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/core/vars.py +0 -0
  268. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/documents/__init__.py +0 -0
  269. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/documents/charts.py +0 -0
  270. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/documents/docx.py +0 -0
  271. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/documents/pdf.py +0 -0
  272. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/email/__init__.py +0 -0
  273. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/email/actions.py +0 -0
  274. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/email/automations.py +0 -0
  275. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/email/binding.py +0 -0
  276. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/email/feeder.py +0 -0
  277. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/email/frame.py +0 -0
  278. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/email/inbox.py +0 -0
  279. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/evidence/__init__.py +0 -0
  280. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/evidence/recorder.py +0 -0
  281. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/history_bundle.py +0 -0
  282. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/identity/act_only.py +0 -0
  283. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/identity/communities.py +0 -0
  284. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/identity/diary.py +0 -0
  285. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/identity/digest.py +0 -0
  286. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/identity/entity_runtime.py +0 -0
  287. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/identity/fingerprint.py +0 -0
  288. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/identity/lease.py +0 -0
  289. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/identity/memory_reader.py +0 -0
  290. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/identity/night_voice.py +0 -0
  291. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/identity/phase_graph.py +0 -0
  292. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/identity/phase_spec.py +0 -0
  293. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/identity/prompt_overlay.py +0 -0
  294. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/identity/reflection.py +0 -0
  295. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/identity/spec/entity_phases.vendored.json +0 -0
  296. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/identity/substrate.py +0 -0
  297. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/identity/tool_effects.py +0 -0
  298. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/identity/tool_policy.py +0 -0
  299. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/identity/tools.py +0 -0
  300. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/integrations/__init__.py +0 -0
  301. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/integrations/abstractcore/__init__.py +0 -0
  302. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/integrations/abstractcore/agora_tools.py +0 -0
  303. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/integrations/abstractcore/command_sandbox_host.py +0 -0
  304. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/integrations/abstractcore/comms_facade.py +0 -0
  305. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/integrations/abstractcore/config_facade.py +0 -0
  306. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
  307. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/integrations/abstractcore/data_registry_facade.py +0 -0
  308. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
  309. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/integrations/abstractcore/discovery_queries.py +0 -0
  310. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +0 -0
  311. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/integrations/abstractcore/email_facade.py +0 -0
  312. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
  313. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/integrations/abstractcore/factory.py +0 -0
  314. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/integrations/abstractcore/local_helper_tools.py +0 -0
  315. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
  316. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/integrations/abstractcore/mcp_facade.py +0 -0
  317. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
  318. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/integrations/abstractcore/media_subprocess.py +0 -0
  319. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
  320. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/integrations/abstractcore/run_facade.py +0 -0
  321. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/integrations/abstractcore/server_facade.py +0 -0
  322. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
  323. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/integrations/abstractcore/structured_facade.py +0 -0
  324. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/integrations/abstractcore/structured_output.py +0 -0
  325. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
  326. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/integrations/abstractcore/telegram_facade.py +0 -0
  327. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/integrations/abstractcore/tool_effects.py +0 -0
  328. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/integrations/abstractcore/tool_inventory_facade.py +0 -0
  329. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/integrations/abstractcore/voice_facade.py +0 -0
  330. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/integrations/abstractcore/voice_library.py +0 -0
  331. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +0 -0
  332. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
  333. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/integrations/abstractmemory/brain_handlers.py +0 -0
  334. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
  335. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/integrations/abstractmemory/identity_support.py +0 -0
  336. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/integrations/abstractmemory/memory_facade.py +0 -0
  337. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/integrations/abstractmemory/seam_handlers.py +0 -0
  338. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/mail_verbs.py +0 -0
  339. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/memory/__init__.py +0 -0
  340. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/memory/active_context.py +0 -0
  341. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/memory/active_memory.py +0 -0
  342. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/memory/compaction.py +0 -0
  343. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/memory/kg_packets.py +0 -0
  344. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/memory/memact_composer.py +0 -0
  345. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/memory/recall_levels.py +0 -0
  346. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/memory/token_budget.py +0 -0
  347. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/rendering/__init__.py +0 -0
  348. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
  349. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/rendering/json_stringify.py +0 -0
  350. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/__init__.py +0 -0
  351. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/__init__.py +0 -0
  352. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/a2_delegated_approval_completed/manifest.json +0 -0
  353. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/a2_delegated_approval_completed/records.json +0 -0
  354. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/a2_delegated_approval_completed/runs.json +0 -0
  355. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/a_delegated_child_approval/manifest.json +0 -0
  356. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/a_delegated_child_approval/records.json +0 -0
  357. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/a_delegated_child_approval/runs.json +0 -0
  358. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/b_timer_without_resume/expected_view.json +0 -0
  359. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/b_timer_without_resume/manifest.json +0 -0
  360. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/b_timer_without_resume/records.json +0 -0
  361. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/b_timer_without_resume/runs.json +0 -0
  362. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/c_parallel_tool_batch/manifest.json +0 -0
  363. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/c_parallel_tool_batch/records.json +0 -0
  364. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/c_parallel_tool_batch/runs.json +0 -0
  365. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/d_cancellation/expected_view.json +0 -0
  366. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/d_cancellation/manifest.json +0 -0
  367. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/d_cancellation/records.json +0 -0
  368. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/d_cancellation/runs.json +0 -0
  369. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/e2_structured_repeated_node/manifest.json +0 -0
  370. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/e2_structured_repeated_node/records.json +0 -0
  371. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/e2_structured_repeated_node/runs.json +0 -0
  372. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/e_structured_output_agents/expected_view.json +0 -0
  373. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/e_structured_output_agents/manifest.json +0 -0
  374. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/e_structured_output_agents/records.json +0 -0
  375. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/e_structured_output_agents/runs.json +0 -0
  376. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/f_windowed_slim/manifest.json +0 -0
  377. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/f_windowed_slim/records.json +0 -0
  378. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/f_windowed_slim/runs.json +0 -0
  379. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/g_ask_user/expected_view.json +0 -0
  380. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/g_ask_user/manifest.json +0 -0
  381. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/g_ask_user/records.json +0 -0
  382. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/g_ask_user/runs.json +0 -0
  383. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/h_denied_approval/manifest.json +0 -0
  384. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/h_denied_approval/records.json +0 -0
  385. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/h_denied_approval/runs.json +0 -0
  386. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/i_wait_kinds/expected_view.json +0 -0
  387. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/i_wait_kinds/manifest.json +0 -0
  388. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/i_wait_kinds/records.json +0 -0
  389. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/i_wait_kinds/runs.json +0 -0
  390. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/j_event_answered_then_pause/expected_view.json +0 -0
  391. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/j_event_answered_then_pause/manifest.json +0 -0
  392. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/j_event_answered_then_pause/records.json +0 -0
  393. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/j_event_answered_then_pause/runs.json +0 -0
  394. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/k_nested_delegation/expected_view.json +0 -0
  395. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/k_nested_delegation/manifest.json +0 -0
  396. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/k_nested_delegation/records.json +0 -0
  397. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/k_nested_delegation/runs.json +0 -0
  398. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/l_answer_then_completion/expected_view.json +0 -0
  399. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/l_answer_then_completion/manifest.json +0 -0
  400. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/l_answer_then_completion/records.json +0 -0
  401. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/l_answer_then_completion/runs.json +0 -0
  402. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/m_session_tool_policy/expected_view.json +0 -0
  403. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/m_session_tool_policy/manifest.json +0 -0
  404. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/m_session_tool_policy/records.json +0 -0
  405. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/conformance/m_session_tool_policy/runs.json +0 -0
  406. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/delta.py +0 -0
  407. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/replay/executions.py +0 -0
  408. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/scheduler/__init__.py +0 -0
  409. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/scheduler/convenience.py +0 -0
  410. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/scheduler/multi_store.py +0 -0
  411. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/scheduler/registry.py +0 -0
  412. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/scheduler/scheduler.py +0 -0
  413. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/session_history.py +0 -0
  414. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/session_turns.py +0 -0
  415. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/storage/__init__.py +0 -0
  416. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/storage/artifacts.py +0 -0
  417. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/storage/base.py +0 -0
  418. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/storage/change_ring.py +0 -0
  419. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/storage/commands.py +0 -0
  420. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/storage/in_memory.py +0 -0
  421. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/storage/json_files.py +0 -0
  422. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/storage/lease.py +0 -0
  423. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/storage/ledger_chain.py +0 -0
  424. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/storage/ledger_slim.py +0 -0
  425. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/storage/observable.py +0 -0
  426. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/storage/offloading.py +0 -0
  427. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/storage/serialize.py +0 -0
  428. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/storage/session_tool_policy.py +0 -0
  429. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/storage/snapshots.py +0 -0
  430. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/storage/steer_sidecar.py +0 -0
  431. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/triggers/__init__.py +0 -0
  432. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/triggers/cloudevents.py +0 -0
  433. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/triggers/connection_events.py +0 -0
  434. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/triggers/connections.py +0 -0
  435. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/triggers/email_received.py +0 -0
  436. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/triggers/event_frame.py +0 -0
  437. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/triggers/feed.py +0 -0
  438. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/triggers/manual.py +0 -0
  439. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/triggers/protocol.py +0 -0
  440. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/triggers/registry.py +0 -0
  441. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/triggers/schedule.py +0 -0
  442. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/triggers/webhook.py +0 -0
  443. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/turn_grounding.py +0 -0
  444. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/utils/__init__.py +0 -0
  445. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/utils/atomic_files.py +0 -0
  446. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/utils/file_filters.py +0 -0
  447. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/utils/workspace_paths.py +0 -0
  448. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
  449. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
  450. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
  451. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
  452. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
  453. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
  454. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
  455. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
  456. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
  457. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
  458. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
  459. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
  460. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
  461. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
  462. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
  463. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/visualflow_compiler/visual/execution_metrics.py +0 -0
  464. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/visualflow_compiler/visual/function_library.py +0 -0
  465. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/visualflow_compiler/visual/loop_back_check.py +0 -0
  466. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/visualflow_compiler/visual/loop_limit_lowering.py +0 -0
  467. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
  468. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
  469. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/visualflow_compiler/visual/pin_expressions.py +0 -0
  470. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/visualflow_compiler/visual/reroute_lowering.py +0 -0
  471. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
  472. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/workflow_bundle/models.py +0 -0
  473. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/workflow_bundle/packer.py +0 -0
  474. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/workflow_bundle/reader.py +0 -0
  475. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/src/abstractruntime/workflow_bundle/registry.py +0 -0
  476. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/README.md +0 -0
  477. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/automation_harness.py +0 -0
  478. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/conftest.py +0 -0
  479. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/email_wp2_support.py +0 -0
  480. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/fixtures/feeds/atom.xml +0 -0
  481. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/fixtures/feeds/rdf-not-a-feed.xml +0 -0
  482. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/fixtures/feeds/rss1-malformed.xml +0 -0
  483. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/fixtures/feeds/rss1.xml +0 -0
  484. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/fixtures/feeds/rss2.xml +0 -0
  485. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/fixtures/schedule_v1_corpus.json +0 -0
  486. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/live_email/conftest.py +0 -0
  487. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/live_email/live_email_support.py +0 -0
  488. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/live_email/test_email_live_runtime.py +0 -0
  489. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/media_endpoint_profile_probe.py +0 -0
  490. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_abstractcore_comms_facade.py +0 -0
  491. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_abstractcore_discovery_facade.py +0 -0
  492. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_abstractcore_host_facade.py +0 -0
  493. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_abstractcore_run_facade.py +0 -0
  494. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_abstractcore_server_facade.py +0 -0
  495. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_abstractcore_structured_facade.py +0 -0
  496. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_abstractcore_telegram_facade.py +0 -0
  497. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_active_consumers_index.py +0 -0
  498. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_active_context_policy.py +0 -0
  499. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_active_index.py +0 -0
  500. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_active_memory.py +0 -0
  501. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_agora_agent_alias_identity.py +0 -0
  502. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_agora_tools_http.py +0 -0
  503. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_analyze_media_addressing_and_walling.py +0 -0
  504. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_answer_user_effect.py +0 -0
  505. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_artifact_session_candidates.py +0 -0
  506. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_artifacts.py +0 -0
  507. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_automation_calendar_schedule.py +0 -0
  508. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_automation_commands.py +0 -0
  509. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_automation_controller.py +0 -0
  510. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_automation_controller_recovery.py +0 -0
  511. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_automation_definition.py +0 -0
  512. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_automation_discussion_isolation.py +0 -0
  513. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_automation_email_results.py +0 -0
  514. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_automation_growing_context.py +0 -0
  515. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_automation_index.py +0 -0
  516. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_automation_list_reads.py +0 -0
  517. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_automation_named_policy_compiler.py +0 -0
  518. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_automation_next_fire.py +0 -0
  519. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_automation_occurrence_input_resolver.py +0 -0
  520. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_automation_occurrence_recovery.py +0 -0
  521. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_automation_replay_read_only.py +0 -0
  522. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_automation_retry.py +0 -0
  523. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_automation_session_turns.py +0 -0
  524. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_automation_status.py +0 -0
  525. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_automation_tool_approval.py +0 -0
  526. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_browser_probe_target_walling.py +0 -0
  527. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_budget_law_no_unrequested_caps.py +0 -0
  528. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_capability_default_reasoning.py +0 -0
  529. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_chat_summarizer_integration.py +0 -0
  530. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_code_node_imports.py +0 -0
  531. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_code_node_restricted_python.py +0 -0
  532. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_command_sandbox_host_facade.py +0 -0
  533. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_command_store.py +0 -0
  534. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_compaction_helpers.py +0 -0
  535. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_compaction_summarizer_route.py +0 -0
  536. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_config_facade_model_contexts.py +0 -0
  537. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_config_facade_models_engines.py +0 -0
  538. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_config_facade_voice_input_hint.py +0 -0
  539. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_control_adapter_while.py +0 -0
  540. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_controller_bundle_packaged.py +0 -0
  541. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_conversation_search.py +0 -0
  542. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_conversational_questions.py +0 -0
  543. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_crash_ordering_inversions.py +0 -0
  544. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_create_if_absent.py +0 -0
  545. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_data_registry_facade.py +0 -0
  546. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_decision_facade_and_node.py +0 -0
  547. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_decision_output.py +0 -0
  548. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_default_model_warmup_switch.py +0 -0
  549. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_default_tools_camera_gating.py +0 -0
  550. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_default_tools_comms_gating.py +0 -0
  551. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_default_tools_include_skim_files.py +0 -0
  552. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_default_tools_include_skim_folders.py +0 -0
  553. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_default_tools_include_skim_web.py +0 -0
  554. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_default_tools_search_files_executor.py +0 -0
  555. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_diary_capture.py +0 -0
  556. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_diary_write_rescue.py +0 -0
  557. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_directory_lease.py +0 -0
  558. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_disabled_toolsets_seam.py +0 -0
  559. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_discovery_survives_unbuildable_default.py +0 -0
  560. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_discovery_tts_unavailable_reason.py +0 -0
  561. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_discovery_voice_openai_api_key.py +0 -0
  562. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_discussion_session_anchor.py +0 -0
  563. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_document_markdown_tables.py +0 -0
  564. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_document_renderers_hr_quote.py +0 -0
  565. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_durable_toolsets.py +0 -0
  566. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_durable_write_discipline.py +0 -0
  567. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
  568. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_effect_cancellation.py +0 -0
  569. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_effect_issuance_idempotency.py +0 -0
  570. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_effect_payload_stays_json_serializable.py +0 -0
  571. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_election_consequence_teaching.py +0 -0
  572. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_email_binding_and_refiner.py +0 -0
  573. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_email_feeder_batched.py +0 -0
  574. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_email_feeder_flags.py +0 -0
  575. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_email_gate_fixes.py +0 -0
  576. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_email_inbox_and_trigger.py +0 -0
  577. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_email_received_mailbox_id.py +0 -0
  578. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_email_regate_fixes.py +0 -0
  579. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_email_review_fixes.py +0 -0
  580. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_email_self_trigger_loop.py +0 -0
  581. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_email_stream_consumers.py +0 -0
  582. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_email_toolset_and_walls.py +0 -0
  583. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_emergence_experiment.py +0 -0
  584. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_emit_event_uses_wait_index.py +0 -0
  585. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_emit_event_without_workflow_registry.py +0 -0
  586. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_endpoint_profile_media_end_to_end.py +0 -0
  587. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_endpoint_profile_media_in_process.py +0 -0
  588. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_endpoint_profile_media_specs_keep_provider.py +0 -0
  589. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_endpoint_profile_route_context.py +0 -0
  590. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_entity_awake_memory_fixes.py +0 -0
  591. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_entity_brain_effects.py +0 -0
  592. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_entity_chat_driver.py +0 -0
  593. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_entity_chat_tools_reflection.py +0 -0
  594. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_entity_diary.py +0 -0
  595. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_entity_execute_tool.py +0 -0
  596. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_entity_fetch_url_tool.py +0 -0
  597. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_entity_history_window.py +0 -0
  598. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_entity_life_loop.py +0 -0
  599. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_entity_memory_richness.py +0 -0
  600. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_entity_phase_graph_conformance.py +0 -0
  601. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_entity_react_visit_window.py +0 -0
  602. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_entity_recent_memories.py +0 -0
  603. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_entity_runtime.py +0 -0
  604. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_entity_search_memory.py +0 -0
  605. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_entity_sleep_bound_and_yield_attribution.py +0 -0
  606. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_entity_substrate_resolution.py +0 -0
  607. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_entity_visit_honesty.py +0 -0
  608. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_entity_workspace_cap.py +0 -0
  609. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_entity_workspace_tools.py +0 -0
  610. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_event_index_cross_process.py +0 -0
  611. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_event_wait_index.py +0 -0
  612. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_every_path_bearing_tool_is_walled.py +0 -0
  613. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_evidence_recorder.py +0 -0
  614. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_evidence_recorder_post_policy_envelope.py +0 -0
  615. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_execute_command_output_offload.py +0 -0
  616. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_execution_capability_discovery.py +0 -0
  617. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_explicit_eject_other_clients.py +0 -0
  618. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_factory_default_retry_policy.py +0 -0
  619. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
  620. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_format_repair_nudge.py +0 -0
  621. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_fresh_install_no_provider.py +0 -0
  622. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_gateway_facades_c4899.py +0 -0
  623. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_git_read_only_refiner.py +0 -0
  624. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_hf_process_residency_merge.py +0 -0
  625. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_history_window_multimodal.py +0 -0
  626. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_hot_path_store_reads.py +0 -0
  627. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_indexed_idempotency_lookup.py +0 -0
  628. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_integration_abstractcore.py +0 -0
  629. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_integrations_abstractcore.py +0 -0
  630. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_json_file_run_store_change_token_after_build.py +0 -0
  631. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_json_file_run_store_children_index.py +0 -0
  632. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_json_file_run_store_index_build_race.py +0 -0
  633. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_json_run_cache_bound.py +0 -0
  634. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_json_store_scan_memo.py +0 -0
  635. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_jsonl_ledger_recovery.py +0 -0
  636. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_jsonl_ledger_seq_cross_process.py +0 -0
  637. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_jsonl_row_index.py +0 -0
  638. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_kg_learn_and_recall_contract.py +0 -0
  639. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_ledger_chain.py +0 -0
  640. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_ledger_cursor_invariants.py +0 -0
  641. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_ledger_get_record.py +0 -0
  642. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_ledger_record_slimming.py +0 -0
  643. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_ledger_subscription.py +0 -0
  644. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_live_token_deltas.py +0 -0
  645. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_llm_call_media_artifact_refs.py +0 -0
  646. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
  647. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
  648. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_llm_call_payload_shape_refusal.py +0 -0
  649. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_llm_call_prefix_stability_contract.py +0 -0
  650. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_llm_call_requires_prompt.py +0 -0
  651. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_llm_call_response_schema_normalization.py +0 -0
  652. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_llm_call_structured_output_fallback.py +0 -0
  653. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_llm_call_text_phase_progress.py +0 -0
  654. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_llm_call_truncation_retry_contract.py +0 -0
  655. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_llm_call_use_context_appends_turn.py +0 -0
  656. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
  657. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_llm_client_grounding_tail.py +0 -0
  658. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_llm_client_media_artifacts.py +0 -0
  659. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_llm_client_system_context.py +0 -0
  660. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_llm_client_tool_call_parsing.py +0 -0
  661. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_llm_retry_classification.py +0 -0
  662. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_llm_streaming_on_token.py +0 -0
  663. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_local_helper_tool_exposure.py +0 -0
  664. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_local_residency_host_sweep.py +0 -0
  665. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
  666. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_mail_verbs.py +0 -0
  667. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_mailbox_index.py +0 -0
  668. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_max_iterations_ceiling.py +0 -0
  669. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_mcp_remote_tool_executor.py +0 -0
  670. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_mcp_runs_untrusted_and_facade.py +0 -0
  671. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_mcp_worker_logging.py +0 -0
  672. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_mcp_worker_security.py +0 -0
  673. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_mcp_worker_stdio.py +0 -0
  674. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_media_artifact_resolution.py +0 -0
  675. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_media_capability_default_routing.py +0 -0
  676. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_media_host_endpoint_resolver.py +0 -0
  677. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_media_only_requests_skip_text_client.py +0 -0
  678. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_media_subprocess.py +0 -0
  679. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_memact_composer_from_kg_result.py +0 -0
  680. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_memory_appraise_handler.py +0 -0
  681. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_memory_communities.py +0 -0
  682. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_memory_facade.py +0 -0
  683. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
  684. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_memory_kg_packets.py +0 -0
  685. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_memory_kg_predicate_aliasing.py +0 -0
  686. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_memory_kg_query_packetization_restart.py +0 -0
  687. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
  688. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
  689. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_memory_note_effect.py +0 -0
  690. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_memory_query_effect.py +0 -0
  691. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_memory_query_rich_filters.py +0 -0
  692. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_memory_revise.py +0 -0
  693. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
  694. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_memory_seam_handlers.py +0 -0
  695. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_memory_seam_sqlite_durability.py +0 -0
  696. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_memory_step_provenance.py +0 -0
  697. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_memory_tag_effect.py +0 -0
  698. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_mlx_generation_serialization.py +0 -0
  699. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_mlx_process_residency_merge.py +0 -0
  700. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_model_eject_cancel.py +0 -0
  701. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_model_residency_control_plane.py +0 -0
  702. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_model_residency_lock_and_context_estimate.py +0 -0
  703. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_model_residency_release_and_readable_holders.py +0 -0
  704. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_multi_store_scheduler.py +0 -0
  705. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_multimodal_abstractcore_integration.py +0 -0
  706. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_native_mlx_application_wiring.py +0 -0
  707. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_native_mlx_execution_controls_live.py +0 -0
  708. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_native_tool_channel.py +0 -0
  709. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_night_voice.py +0 -0
  710. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_no_default_provider_refusal_ux.py +0 -0
  711. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_occurrence_named_inputs.py +0 -0
  712. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_occurrence_samples.py +0 -0
  713. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_offload_answer_chain_c4978.py +0 -0
  714. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_offloaded_node_traces_report_unknown_not_zero.py +0 -0
  715. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_offloading.py +0 -0
  716. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_parallel_readonly_tool_execution.py +0 -0
  717. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_pause_resume.py +0 -0
  718. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_pdf_unicode_rendering.py +0 -0
  719. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_personal_cycle.py +0 -0
  720. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_phantom_attachment_index.py +0 -0
  721. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_phase_graph_artifact_control.py +0 -0
  722. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_phase_graph_obedience.py +0 -0
  723. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_phase_vocabulary_migration.py +0 -0
  724. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_pooled_client_strips_construction_cache_key.py +0 -0
  725. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_prompt_cache_export_import.py +0 -0
  726. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_prompt_cache_fingerprint_stability.py +0 -0
  727. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_prompt_cache_modules.py +0 -0
  728. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_prompt_cache_posture_inheritance.py +0 -0
  729. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_prompt_cache_thinking_and_prompt_only.py +0 -0
  730. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_prompt_overlay.py +0 -0
  731. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_provider_endpoint_profile_resolution.py +0 -0
  732. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_provider_pin_routing_isolation.py +0 -0
  733. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_public_action_approval_context.py +0 -0
  734. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_publish_event.py +0 -0
  735. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_queryable_run_store.py +0 -0
  736. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_r12_workspace_sandbox.py +0 -0
  737. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
  738. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_read_idle_threading.py +0 -0
  739. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_readoption_experiment.py +0 -0
  740. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_real_integration.py +0 -0
  741. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_realize_election.py +0 -0
  742. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_recall_levels_policy.py +0 -0
  743. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_remote_client_cancel.py +0 -0
  744. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_remote_llm_client.py +0 -0
  745. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_remote_speculation_defaults.py +0 -0
  746. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_rendering_agent_trace_report.py +0 -0
  747. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_rendering_json_stringify.py +0 -0
  748. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_replay_conformance.py +0 -0
  749. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_replay_conformance_package.py +0 -0
  750. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_replay_cursor_token.py +0 -0
  751. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_replay_delta_cost.py +0 -0
  752. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_replay_invariants.py +0 -0
  753. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_replay_review_findings.py +0 -0
  754. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_replay_tool_policy.py +0 -0
  755. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_report_branding.py +0 -0
  756. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_residency_fit_refusal_broadcast.py +0 -0
  757. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_resident_media_generation.py +0 -0
  758. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_resume_concurrent_same_wait.py +0 -0
  759. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_retry_idempotency.py +0 -0
  760. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_run_history_bundle.py +0 -0
  761. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_run_index_workspace_root.py +0 -0
  762. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_run_mutation_lock.py +0 -0
  763. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_run_origin.py +0 -0
  764. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_run_scoped_tool_policy.py +0 -0
  765. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_run_store_change_token.py +0 -0
  766. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_run_tool_scope_ceiling.py +0 -0
  767. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_runtime_browser_session_boundary.py +0 -0
  768. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
  769. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_runtime_default_provider_model_refresh.py +0 -0
  770. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_runtime_effect_invocation_trace.py +0 -0
  771. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_runtime_health_and_bounded_vars.py +0 -0
  772. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_runtime_install_boundary.py +0 -0
  773. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
  774. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_runtime_node_traces.py +0 -0
  775. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_runtime_start_seeds_tool_support.py +0 -0
  776. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_runtime_tick_step_gate.py +0 -0
  777. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_schedule_run.py +0 -0
  778. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_schedule_v1_corpus.py +0 -0
  779. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_schedule_v2_calendar.py +0 -0
  780. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_scheduler.py +0 -0
  781. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_send_email_refiner.py +0 -0
  782. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_send_email_self_default_policy.py +0 -0
  783. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
  784. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_session_history.py +0 -0
  785. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_session_prompt_cache_attribution.py +0 -0
  786. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_session_prompt_cache_visibility.py +0 -0
  787. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_session_route_stamp.py +0 -0
  788. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_session_start_cost.py +0 -0
  789. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_session_tool_policy.py +0 -0
  790. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_shell_tool_exposure.py +0 -0
  791. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_snapshots.py +0 -0
  792. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_speculation_inheritance.py +0 -0
  793. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_speculation_reaches_provider_construction.py +0 -0
  794. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_start_subworkflow_async_wait.py +0 -0
  795. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
  796. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
  797. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_steer_sidecar.py +0 -0
  798. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_step_context.py +0 -0
  799. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_storage_deletion.py +0 -0
  800. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_streamed_voice_namespace.py +0 -0
  801. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_structured_output_schema_enum.py +0 -0
  802. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_structured_schema_execution_client.py +0 -0
  803. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_subworkflow.py +0 -0
  804. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_terminal_effect_completion.py +0 -0
  805. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
  806. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_thinking_inheritance.py +0 -0
  807. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
  808. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_tool_approval_executor.py +0 -0
  809. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_tool_approval_resume_executes.py +0 -0
  810. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_tool_approval_wait_key_identity.py +0 -0
  811. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_tool_calls_idempotency_keys.py +0 -0
  812. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_tool_catalog.py +0 -0
  813. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_tool_descriptor_registry.py +0 -0
  814. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_tool_executor_argument_sanitization.py +0 -0
  815. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_tool_executor_filename_alias.py +0 -0
  816. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
  817. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_tool_executor_read_file_aliases.py +0 -0
  818. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_tool_executor_timeout.py +0 -0
  819. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_tool_inventory_facade.py +0 -0
  820. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_tool_invoke_effect.py +0 -0
  821. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_tool_policy_and_mounts.py +0 -0
  822. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_tool_wait_allowlist_safety.py +0 -0
  823. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_topic_election_world_model.py +0 -0
  824. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_trace_context_propagation.py +0 -0
  825. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_trigger_cloudevents.py +0 -0
  826. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_trigger_connection_listening.py +0 -0
  827. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_trigger_connections.py +0 -0
  828. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_trigger_feed.py +0 -0
  829. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_trigger_registry.py +0 -0
  830. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_trigger_schedule_math.py +0 -0
  831. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_trigger_webhook.py +0 -0
  832. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_trusted_run_index.py +0 -0
  833. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_turn_grounding_byte_stability.py +0 -0
  834. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_turn_grounding_carriers_a3.py +0 -0
  835. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_vars_query_effect.py +0 -0
  836. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visit_ab_fixture.py +0 -0
  837. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visit_live_guidance.py +0 -0
  838. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visit_midturn_elections.py +0 -0
  839. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visit_midturn_resume.py +0 -0
  840. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visit_workflow.py +0 -0
  841. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
  842. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visual_agent_skills_block_passthrough.py +0 -0
  843. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
  844. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
  845. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
  846. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
  847. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visual_entity_memory_nodes.py +0 -0
  848. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visual_flow_end_effect_only_persistence.py +0 -0
  849. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visual_llm_call_partial_override.py +0 -0
  850. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
  851. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visual_loop_back_out_of_body.py +0 -0
  852. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visual_loop_limit_and_list_nodes.py +0 -0
  853. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visual_loop_limit_on_wire.py +0 -0
  854. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visual_memact_compose_node.py +0 -0
  855. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
  856. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
  857. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
  858. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visual_reroute_lowering.py +0 -0
  859. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visual_set_vars_pins.py +0 -0
  860. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visual_unknown_node_type_refuses.py +0 -0
  861. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visual_wait_event_deadline_passthrough.py +0 -0
  862. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visualflow_add_message_builtin.py +0 -0
  863. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
  864. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visualflow_agora_react_agent.py +0 -0
  865. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visualflow_call_tool_node.py +0 -0
  866. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visualflow_capability_routes_and_thinking.py +0 -0
  867. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visualflow_compiler_basic.py +0 -0
  868. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
  869. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visualflow_continue_on_error.py +0 -0
  870. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visualflow_edit_json_schema_node.py +0 -0
  871. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visualflow_event_inbox_react_agent.py +0 -0
  872. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visualflow_file_nodes_workspace.py +0 -0
  873. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visualflow_function_library.py +0 -0
  874. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visualflow_get_element_node.py +0 -0
  875. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visualflow_get_random_element_node.py +0 -0
  876. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visualflow_get_var_node.py +0 -0
  877. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visualflow_has_tools_builtin.py +0 -0
  878. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
  879. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
  880. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visualflow_make_object_node.py +0 -0
  881. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visualflow_media_nodes.py +0 -0
  882. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visualflow_memory_effect_nodes.py +0 -0
  883. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visualflow_memory_source_pins.py +0 -0
  884. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visualflow_pin_expressions.py +0 -0
  885. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visualflow_prompt_only.py +0 -0
  886. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visualflow_random_nodes.py +0 -0
  887. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visualflow_schema_enum_switch.py +0 -0
  888. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visualflow_string_contains_replace.py +0 -0
  889. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_visualflow_tool_parameters_node.py +0 -0
  890. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_voice_library_facade.py +0 -0
  891. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_voice_openai_api_key_path.py +0 -0
  892. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_voice_projection_contract.py +0 -0
  893. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_voice_stream_is_not_a_wait.py +0 -0
  894. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_w4_feelings_lens.py +0 -0
  895. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_wait_event_deadline.py +0 -0
  896. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_wait_event_prompt_metadata.py +0 -0
  897. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_wait_until_streak.py +0 -0
  898. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_wait_until_utc_normalization.py +0 -0
  899. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_workflow_bundle_registry.py +0 -0
  900. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_workspace_builtin_deny.py +0 -0
  901. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_workspace_context_allowed_workspaces.py +0 -0
  902. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_workspace_policy_absolute_reanchor.py +0 -0
  903. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_workspace_policy_allowlist_mode.py +0 -0
  904. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
  905. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
  906. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_workspace_prompt_context.py +0 -0
  907. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_workspace_read_only.py +0 -0
  908. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_workspace_writable_paths.py +0 -0
  909. {abstractruntime-0.16.0 → abstractruntime-0.18.0}/tests/test_write_chart.py +0 -0
@@ -10,6 +10,144 @@ Unreleased changes live in [`changelog.d/`](changelog.d/README.md), one file per
10
10
 
11
11
  ## [Unreleased]
12
12
 
13
+ ## [0.18.0] - 2026-11-04
14
+
15
+ ### Added
16
+
17
+ - **Acquaintances of an entity or a session** (`identity/acquaintances.py`, framework backlog 1119):
18
+ `entity_acquaintances(home_dir, run_store)` and `session_acquaintances(session_id, run_store)` answer two
19
+ lists, the other entities and the humans it interacted with, each with first and last seen, the number of
20
+ interactions and the task kinds. Computed from existing records, never stored: the participants the
21
+ gateway stamps on visit, summon and meet runs, the person who started a run (`_meta.origin`), and who left
22
+ a task in the task inbox. Identifiers only; interactions with no usable identifier (an `agent:` participant,
23
+ a participant without a namespace, a person-started run without an actor) are listed under `not_counted`,
24
+ never guessed. See `docs/track-record.md#acquaintances`.
25
+ - **An entity's digital identity: its look and its voice, one record in its home**
26
+ (`abstractruntime.identity.digital_identity`, framework ADR 0052 draft, backlog 1119; `docs/digital-identity.md`).
27
+ `<home>/identity.json` holds the avatar design, its colour and the voice (`schema_version` 1). `write_identity` checks
28
+ every bound (`IdentityInvalid` names the field), runs the gateway's `check` hook, appends an `identity_changed` row to
29
+ `state_history.jsonl` (the `phase_changed` field names) before the file is replaced atomically, and never gives a
30
+ `rev` twice: one write at a time per home (`<home>/.identity.lock`, held from the read to the file replace). A
31
+ file it cannot read in full raises `IdentityUnreadable` on read and on write, never "no identity".
32
+ `default_identity` is the recorded default anyone can recompute (SHA-256 of the entity id, eight engraved Watch
33
+ designs, an HSL colour, the gateway's default voice as a value); `record_default_identity` writes it once and never
34
+ overwrites. `identity_at_rev` answers an old rev from the biography. The reference `entity:castor#3` rides
35
+ `vars._runtime.identity_ref` beside the signed entity stamp (`stamp_run_identity_ref`, `read_run_identity_ref`,
36
+ `parse_identity_ref`). `identity_fingerprint` derives the individual's `actor_id` from the manifest, with the diary's
37
+ chain head. Homes without `identity.json` are untouched.
38
+ - **The summon tells the entity when its look or voice changed**: one sentence ("Your voice changed on 4 November (by
39
+ laurent): now fr-male-rene.") in the summon prelude, after the identity core, when the change is newer than the
40
+ previous summon (`render_summon_prelude(home_dir=, identity_since=)`, `ChatSession(identity_since=)`,
41
+ `build_visit_workflow(identity_since=)` or `_visit.identity_since` seeded by the door).
42
+ - **The idle unload reaches the host: `set_model_idle_unload(seconds)`** (host facade, `LocalAbstractCoreLLMClient`,
43
+ `MultiLocalAbstractCoreLLMClient`; framework backlog 1115). It relays AbstractCore's process-wide idle-unload time
44
+ (ADR 0012, default 60 minutes): a model no call has used for that long is unloaded, a locked model never is, and a
45
+ running call is never interrupted. `None` or `0` turns it off; a refused value answers `ok: false`. Local residency
46
+ rows of in-process text models carry `idle_unload_s`, `last_used_at` and `idle_unload_at`, and pass through Core's
47
+ `in_use` and `locked_by`, so a host can show a model that is in use, or kept loaded by another account.
48
+ - **`set_model_residency_locks(locks)`**: the locked models become exactly the listed ones (resident ones locked,
49
+ missing ones loaded then locked, the others unlocked), each pair with its own outcome. A lock names a provider and a
50
+ model; the `base_url` of a configured endpoint is not part of the key. A host stores its "Keep loaded" set and
51
+ replays it at start; as a `set_` name it is replayed when the gateway's model host rebuilds a client.
52
+ - **Track record and reputation of an entity or a session** (`identity/track_record.py`, ADR 0052 §5-§6,
53
+ framework backlog 1119). `entity_track_record(home_dir, run_store, ledger_store, *, book_head)` and
54
+ `session_track_record(session_id, run_store, ledger_store)` answer sessions, runs, successes, failures,
55
+ cancelled, in progress and tokens (input, output, total), per task kind (`<phase or role>/<workflow_id>`,
56
+ from ids only) and overall; `compute_reputation(record)` gives trust per task kind,
57
+ `(successes + 1) / (successes + failures + 2)` with its support, the support-weighted overall, and the
58
+ last 20 outcomes as evidence ("no experience yet" when there is none). Everything is computed from
59
+ existing records; nothing is stored. Only work from outside counts: turn roots a person or a trigger
60
+ started and automation occurrences (once each, however many attempts); sub-runs, controllers, the
61
+ session memory run and runs another run or the system started never do. Outcomes come from the run
62
+ status, the occurrence's `automation.completed` decision, an entity task marked `done`, and the work
63
+ order verdicts (`done:` / `blocked:`). Feedback from people and agents (`feedback_user`,
64
+ `feedback_agent`) is typed but has no source yet, so every answer says `basis: "completion-rate only"`.
65
+ Each answer names its subject's `identity_ref` and, for an entity, its `identity_fingerprint`.
66
+ See `docs/track-record.md`.
67
+ - **`metrics_many` also returns `tokens_input` and `tokens_output`** (SQLite ledger): `usage.input_tokens`
68
+ (else `prompt_tokens`) and `output_tokens` (else `completion_tokens`) of completed `llm_call` records.
69
+ Existing keys are unchanged.
70
+ - **`identity.life.read_work_order_verdicts(home_dir)`**: the verdicts the work lane archived in
71
+ `work_order.done.md`, oldest first.
72
+
73
+ ### Changed
74
+
75
+ - **AbstractCore 2.34.0 or newer** (base install, `apple` and `gpu` settings): the idle unload and its residency rows
76
+ come from it.
77
+ - **A load with `ttl_s` or `keep_alive` on an in-process model** still lists them under `unsupported_options`; its
78
+ warning now names the idle unload that applies instead ("the idle unload setting applies (60 min unused, never while
79
+ it is kept loaded)"), or says it is off.
80
+
81
+ ### Fixed
82
+
83
+ - **A run store whose index cannot attribute a session is refused, never started as a plain chat**
84
+ (`core/run_attribution.py`, framework backlog 0938). A third-party store with `list_run_index` but no `session_kind`
85
+ in its rows (an index written before automations v1) used to report "no kinds" and let a `discussion-session:` start
86
+ through as an ordinary chat, skipping the discussion's read-only anchor. It now raises `SessionAttributionError`
87
+ naming the missing column; a store with no index at all names both methods it lacks. Built-in stores are unchanged.
88
+ Upgrading a custom store: add `session_kind` and `role` to its index rows, or implement `session_kinds(session_id)`
89
+ (see `docs/automations.md`, "Storage guarantees").
90
+ - **A tool that reports its failure as a JSON object keeps its explanation** (`integrations/abstractcore/tool_executor.py`,
91
+ framework backlog 1005). A failed result's `output` used to be emptied when the tool returned its failure as a JSON
92
+ string, so the agent and the run ledger saw only the error line (for a web search: "No results found", never the
93
+ backends tried, the bot-challenge status or the hint). The parsed object is now the result's `output`, as for a tool
94
+ that returns a dict; a plain text error (`Error: ...`) still keeps an empty output and its message in `error`.
95
+ - **The visual-flow Agent node shows the model that explanation** (`visualflow_compiler/compiler.py`). A failed call
96
+ whose `output` is an object is rendered as its error line followed by the object (`[web_search]: Error: No results
97
+ found` then the JSON), under the same `agent_observation_max_chars` limit; a plain text failure still shows its error
98
+ line alone.
99
+ - Failure payloads are now recorded in the run ledger and the history bundle like success payloads: whatever a tool puts
100
+ in its failure JSON (its parameters included) is stored with the run.
101
+
102
+ ## [0.17.0] - 2026-11-03
103
+
104
+ ### Added
105
+
106
+ - **`EffectInterrupted`: a host stop interrupts an effect, it never fails it** (`core/effect_cancellation.py`,
107
+ exported as `abstractruntime.EffectInterrupted`; gateway backlog 1103). A host that stops on purpose (a gateway stop
108
+ or restart, a model-host restart for an update) raises it into the effect in flight. The runtime writes no terminal
109
+ record and re-raises: the ledger tail stays STARTED, the run stays RUNNING at its last durable step, and the next
110
+ tick (after the host is back) sends the effect again under the same idempotency key as attempt 1, so no retry is
111
+ consumed and nothing reaches an automation's outcome. A BaseException like `EffectKilled`, so no `except Exception`
112
+ on the way turns it into a failure. The interrupted call's live text ends `cancelled` with `detail: "interrupted"`.
113
+ - **Public updates carry their type in replay** (`replay/view.py`). A `public_update` message has
114
+ `update_kind`: `"finding"` when the actor typed the event `kind: "finding"` (a fact or piece of
115
+ evidence it established), otherwise `"progress"` (what it is doing), including events written
116
+ before the field existed. Clients use it as given, for example to list the findings of a
117
+ conversation. See [docs/replay.md](docs/replay.md#public-conversation-messages).
118
+ - **Hosts tell model errors apart through the discovery facade** (`integrations/abstractcore/discovery_facade.py`):
119
+ `ModelNotDownloadedError` and `ModelNotFoundError` are AbstractCore's own classes, so a host (the gateway's
120
+ "model not downloaded" sentence) catches exactly what Core raises and reads `model` / `provider` without importing
121
+ AbstractCore.
122
+ - **Replayed tool calls keep the model's call id** (`replay/view.py`). An `activities[].tool_calls[]`
123
+ row keyed by a runtime call id (`id`) also carries `call_id`, the model's own id, which is what a
124
+ public update's `source_call_ids` cite; a client can now resolve a finding to the results it cites.
125
+
126
+ ### Changed
127
+
128
+ - **Compare reads text next to a number or true/false exactly** (`visual/builtins.py` `_exact_from_text`, ADR 0049 as
129
+ amended 2026-11-03: "we must have automatic conversion"). When one side is a number or true/false and the other is
130
+ text, the text is read as that type by the Flow editor's literal grammar (a decimal number, ASCII, no `_`, finite,
131
+ a whole number kept exact beyond 2**53; or `true`/`false` in any case), so `5 == "5"` and `"9" < 10` are true. This
132
+ covers flows saved by AbstractFlow 0.13.0 (a typed value stored as text next to a wired number) and text arriving at
133
+ run time from a form, an API input or a model, with no re-save. `"1_000"`, `"0x10"`, `"inf"`, `"nan"`, full-width
134
+ digits and empty text are refused. Text against text is never converted (`"10" > "9"` compares text). The table is
135
+ `tests/fixtures/visualflow/compare_text_operands.json`.
136
+ - **Compare refuses values it cannot compare instead of answering False** (`visual/builtins.py` `control_compare`,
137
+ ADR 0049). Text that is not a number next to a number, or not `true`/`false` next to true/false (`5 == "five"`,
138
+ every operator; text that is a number or true/false is read as one, see "Compare reads text next to a number or true/false exactly" above), and `<`/`<=`/`>`/`>=` between values Python cannot order
139
+ (`None > 3`, a list and a number), now fail the step with an error naming the node and pins: "Compare 'Is five'
140
+ (node same) ==: b is text ('five'), not a number; a is a number (5)." Before, these answered False silently.
141
+ Equality of same-type values and Python's equality across other types (`None == 5`) are unchanged; true/false
142
+ compares with numbers as Python's booleans do (`True == 1`).
143
+ - **AbstractCore floor 2.33.0** in the base install and the `apple` and `gpu` extras (was 2.32.0).
144
+
145
+ ### Fixed
146
+
147
+ - **An automation occurrence whose agent completed with `success: false` names the agent's reason**
148
+ (`automations/attention.py`). The attention item and the `automation_failed` email said "completed" (the run's status
149
+ word); the reason is now read from the Agent node's `meta.error`, and when there is none it says so plainly.
150
+
13
151
  ## [0.16.0] - 2026-11-02
14
152
 
15
153
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: AbstractRuntime
3
- Version: 0.16.0
3
+ Version: 0.18.0
4
4
  Summary: AbstractRuntime: a durable graph runner designed to pair with AbstractCore.
5
5
  Project-URL: AbstractCore (website), https://www.abstractcore.ai/
6
6
  Project-URL: AbstractRuntime (GitHub), https://github.com/lpalbou/abstractruntime
@@ -20,7 +20,7 @@ Classifier: Programming Language :: Python :: 3.11
20
20
  Classifier: Programming Language :: Python :: 3.12
21
21
  Classifier: Programming Language :: Python :: 3.13
22
22
  Requires-Python: >=3.10
23
- Requires-Dist: abstractcore>=2.32.0
23
+ Requires-Dist: abstractcore>=2.34.0
24
24
  Requires-Dist: abstractmemory>=0.4.0
25
25
  Requires-Dist: abstractsemantics>=0.0.5
26
26
  Requires-Dist: anyio<5.0.0,>=4.12.1
@@ -35,14 +35,14 @@ Requires-Dist: reportlab<5.0.0,>=4.0.0
35
35
  Requires-Dist: restrictedpython>=7.0
36
36
  Requires-Dist: unstructured[docx,odt,pptx,rtf,xlsx]<0.19.0,>=0.18.32
37
37
  Provides-Extra: apple
38
- Requires-Dist: abstractcore[apple]>=2.32.0; extra == 'apple'
38
+ Requires-Dist: abstractcore[apple]>=2.34.0; extra == 'apple'
39
39
  Requires-Dist: setuptools<82.0.0,>=80.10.2; extra == 'apple'
40
40
  Provides-Extra: docs
41
41
  Requires-Dist: mkdocs-material>=9.0.0; extra == 'docs'
42
42
  Requires-Dist: mkdocs>=1.6.0; extra == 'docs'
43
43
  Requires-Dist: pymdown-extensions>=10.0; extra == 'docs'
44
44
  Provides-Extra: gpu
45
- Requires-Dist: abstractcore[gpu]>=2.32.0; extra == 'gpu'
45
+ Requires-Dist: abstractcore[gpu]>=2.34.0; extra == 'gpu'
46
46
  Requires-Dist: setuptools<82.0.0,>=77.0.3; extra == 'gpu'
47
47
  Provides-Extra: test
48
48
  Requires-Dist: aiosmtpd<2.0.0,>=1.4.4; extra == 'test'
@@ -55,16 +55,54 @@ Description-Content-Type: text/markdown
55
55
 
56
56
  It is designed for long-running workflows that must survive restarts and explicitly model blocking (human input, timers, external events, subworkflows) without keeping Python stacks alive.
57
57
 
58
- **Version:** 0.16.0 • **Python:** 3.10+
58
+ **Version:** 0.18.0 • **Python:** 3.10+
59
59
 
60
60
  **Status:** pre-1.0 (API may evolve). For production use, pin versions and follow `CHANGELOG.md`.
61
61
 
62
+ ## What's new in 0.18.0
63
+
64
+ - **Models unload after being idle**: a host sets how long a local model may sit unused (`set_model_idle_unload`,
65
+ AbstractCore's default 60 minutes; off with `None` or `0`); a running call is never interrupted and a model kept
66
+ loaded never unloads. `set_model_residency_locks` relays the host's "Keep loaded" set, and both come back after a
67
+ model-host restart. Loaded-model rows say when a model was last used, whether it is in use, who keeps it loaded
68
+ and when it unloads. Requires AbstractCore 2.34.0 or newer.
69
+ - **A failed tool keeps its explanation**: a tool that reports its failure as a JSON object (a web search's backends,
70
+ bot-challenge status and hint) keeps it in the result, the run ledger and what the visual-flow Agent node shows
71
+ the model, after the error line.
72
+ - **A store that cannot attribute a session is refused**: a custom run store whose index rows lack `session_kind`
73
+ no longer lets a discussion start as a plain chat; it raises `SessionAttributionError` naming what to add.
74
+ - **An entity has a recorded look and voice**: one record in its home holds its avatar and its voice, with a default
75
+ from birth and every change remembered (the entity is told when its look or voice changed). See
76
+ [docs/digital-identity.md](docs/digital-identity.md).
77
+ - **An entity has a track record and a first reputation**: both are computed from what it has done (runs, outcomes,
78
+ tokens per kind of task); until feedback from people and agents exists, the reputation is the completion rate
79
+ only. See [docs/track-record.md](docs/track-record.md).
80
+ - **An entity knows its acquaintances**: the entities and people it has interacted with are listed from its own
81
+ records, with when they first and last met. See [docs/track-record.md](docs/track-record.md#acquaintances). Full
82
+ list: [CHANGELOG.md](CHANGELOG.md).
83
+
84
+ ## What's new in 0.17.0
85
+
86
+ - **A host stop suspends a run, it never fails it**: a host that stops on purpose raises `EffectInterrupted` into
87
+ the effect in flight; the runtime writes no terminal record, the run stays running at its last durable step, and
88
+ the next tick sends the call again as attempt 1 (no retry used, no automation outcome, nothing notified).
89
+ - **Public updates are typed**: a `public_update` in the replay view carries `update_kind`, `"finding"` (a fact or
90
+ piece of evidence the actor established) or `"progress"` (what it is doing), so a client can list a conversation's
91
+ findings. See [docs/replay.md](docs/replay.md#public-conversation-messages).
92
+ - **Replayed tool calls keep the model's call id**: an `activities[].tool_calls[]` row also carries `call_id`, the id
93
+ a public update's `source_call_ids` cite, so a finding resolves to the results it cites.
94
+ - **Compare reads text next to a number or true/false exactly**: `5 == "5"` and `"9" < 10` are true, text it
95
+ cannot read as that type (`"five"`, `"0x10"`, empty) fails the step with an error naming the node and pins, and
96
+ text against text is never converted.
97
+ - **An automation occurrence says why it failed**: when the agent finished without success, the attention item and
98
+ the notification carry the agent's own error, never "completed". Full list: [CHANGELOG.md](CHANGELOG.md).
99
+
62
100
  ## What's new in 0.16.0
63
101
 
64
102
  - **Calibrated decisions**: an `LLM_CALL` whose output says `modality: "decision"` returns typed answers
65
103
  (`answers`, `decision`) from a decision model instead of generated text; `run_facade.decide(...)` runs one as a
66
104
  durable child run and the `decide` VisualFlow node asks a choice, yes/no or score question. Requires AbstractCore
67
- 2.32.0. See [docs/integrations/abstractcore.md](docs/integrations/abstractcore.md).
105
+ 2.32.0 or newer (AbstractRuntime 0.18.0 requires 2.34.0). See [docs/integrations/abstractcore.md](docs/integrations/abstractcore.md).
68
106
  - **Conversational questions and guidance**: `ASK_USER` can ask an essential question (waits indefinitely) or a timed
69
107
  clarification with a declared fallback; `Runtime.steer(..., display_text=)` records human guidance in its exact
70
108
  words; opt-in public updates and tool-approval `public_action` context appear in the replay view.
@@ -145,7 +183,7 @@ Remote-light runtime:
145
183
  pip install abstractruntime
146
184
  ```
147
185
 
148
- The base install includes AbstractCore 2.32.0 or newer (its light install:
186
+ The base install includes AbstractCore 2.34.0 or newer (its light install:
149
187
  remote providers, tools, vision, voice, audio, music, and decision integration), plus the
150
188
  `abstractruntime-mcp-worker` entry point. It keeps inference remote/light by
151
189
  default: local engines such as MLX, vLLM, HuggingFace/Torch, Diffusers, and
@@ -4,16 +4,54 @@
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.16.0 • **Python:** 3.10+
7
+ **Version:** 0.18.0 • **Python:** 3.10+
8
8
 
9
9
  **Status:** pre-1.0 (API may evolve). For production use, pin versions and follow `CHANGELOG.md`.
10
10
 
11
+ ## What's new in 0.18.0
12
+
13
+ - **Models unload after being idle**: a host sets how long a local model may sit unused (`set_model_idle_unload`,
14
+ AbstractCore's default 60 minutes; off with `None` or `0`); a running call is never interrupted and a model kept
15
+ loaded never unloads. `set_model_residency_locks` relays the host's "Keep loaded" set, and both come back after a
16
+ model-host restart. Loaded-model rows say when a model was last used, whether it is in use, who keeps it loaded
17
+ and when it unloads. Requires AbstractCore 2.34.0 or newer.
18
+ - **A failed tool keeps its explanation**: a tool that reports its failure as a JSON object (a web search's backends,
19
+ bot-challenge status and hint) keeps it in the result, the run ledger and what the visual-flow Agent node shows
20
+ the model, after the error line.
21
+ - **A store that cannot attribute a session is refused**: a custom run store whose index rows lack `session_kind`
22
+ no longer lets a discussion start as a plain chat; it raises `SessionAttributionError` naming what to add.
23
+ - **An entity has a recorded look and voice**: one record in its home holds its avatar and its voice, with a default
24
+ from birth and every change remembered (the entity is told when its look or voice changed). See
25
+ [docs/digital-identity.md](docs/digital-identity.md).
26
+ - **An entity has a track record and a first reputation**: both are computed from what it has done (runs, outcomes,
27
+ tokens per kind of task); until feedback from people and agents exists, the reputation is the completion rate
28
+ only. See [docs/track-record.md](docs/track-record.md).
29
+ - **An entity knows its acquaintances**: the entities and people it has interacted with are listed from its own
30
+ records, with when they first and last met. See [docs/track-record.md](docs/track-record.md#acquaintances). Full
31
+ list: [CHANGELOG.md](CHANGELOG.md).
32
+
33
+ ## What's new in 0.17.0
34
+
35
+ - **A host stop suspends a run, it never fails it**: a host that stops on purpose raises `EffectInterrupted` into
36
+ the effect in flight; the runtime writes no terminal record, the run stays running at its last durable step, and
37
+ the next tick sends the call again as attempt 1 (no retry used, no automation outcome, nothing notified).
38
+ - **Public updates are typed**: a `public_update` in the replay view carries `update_kind`, `"finding"` (a fact or
39
+ piece of evidence the actor established) or `"progress"` (what it is doing), so a client can list a conversation's
40
+ findings. See [docs/replay.md](docs/replay.md#public-conversation-messages).
41
+ - **Replayed tool calls keep the model's call id**: an `activities[].tool_calls[]` row also carries `call_id`, the id
42
+ a public update's `source_call_ids` cite, so a finding resolves to the results it cites.
43
+ - **Compare reads text next to a number or true/false exactly**: `5 == "5"` and `"9" < 10` are true, text it
44
+ cannot read as that type (`"five"`, `"0x10"`, empty) fails the step with an error naming the node and pins, and
45
+ text against text is never converted.
46
+ - **An automation occurrence says why it failed**: when the agent finished without success, the attention item and
47
+ the notification carry the agent's own error, never "completed". Full list: [CHANGELOG.md](CHANGELOG.md).
48
+
11
49
  ## What's new in 0.16.0
12
50
 
13
51
  - **Calibrated decisions**: an `LLM_CALL` whose output says `modality: "decision"` returns typed answers
14
52
  (`answers`, `decision`) from a decision model instead of generated text; `run_facade.decide(...)` runs one as a
15
53
  durable child run and the `decide` VisualFlow node asks a choice, yes/no or score question. Requires AbstractCore
16
- 2.32.0. See [docs/integrations/abstractcore.md](docs/integrations/abstractcore.md).
54
+ 2.32.0 or newer (AbstractRuntime 0.18.0 requires 2.34.0). See [docs/integrations/abstractcore.md](docs/integrations/abstractcore.md).
17
55
  - **Conversational questions and guidance**: `ASK_USER` can ask an essential question (waits indefinitely) or a timed
18
56
  clarification with a declared fallback; `Runtime.steer(..., display_text=)` records human guidance in its exact
19
57
  words; opt-in public updates and tool-approval `public_action` context appear in the replay view.
@@ -94,7 +132,7 @@ Remote-light runtime:
94
132
  pip install abstractruntime
95
133
  ```
96
134
 
97
- The base install includes AbstractCore 2.32.0 or newer (its light install:
135
+ The base install includes AbstractCore 2.34.0 or newer (its light install:
98
136
  remote providers, tools, vision, voice, audio, music, and decision integration), plus the
99
137
  `abstractruntime-mcp-worker` entry point. It keeps inference remote/light by
100
138
  default: local engines such as MLX, vLLM, HuggingFace/Torch, Diffusers, and
@@ -44,6 +44,8 @@ In this repo, the AbstractCore wiring lives under `src/abstractruntime/integrati
44
44
 
45
45
  - `automations.md` — automations: a workflow run on a schedule, on an event or on request as a durable controller run; triggers (`schedule@1`, `schedule@2` calendar rules in a time zone, `manual@1`, `email.received@1`, `feed.item@1` RSS 2.0 / RSS 1.0 / Atom, `webhook.received@1` Standard Webhooks, entry-point sources), per-user trigger connections, the CloudEvents envelope (`input_data.event`), run origin (`_meta.origin`), wakes (`SCHEDULE_RUN`: work later in the same session, with at most the caller's tools), Publish to channel (`PUBLISH_EVENT`, alerts with `recipient` and `channels`), commands, independent or growing context, discussions forked at any occurrence (own writable workspace, the automation's workspace mounted read-only), tool approval, typed waits, notifications and retries, and the storage guarantees (create-if-absent, per-run lock, turn roots, session kinds, one writer process per store)
46
46
  - `entity-runtime.md` — per-entity runtimes for summoned entities: homes, the one-writer lease, act-only diary privacy (`$act_only` refs), durable visit waits with deadlines
47
+ - `digital-identity.md` — an entity's look and voice: `identity.json` in the home, the recorded default, the `identity_changed` biography row, the identity reference on runs, the fingerprint, the summon cue
48
+ - `track-record.md` — an entity's or a session's track record (sessions, runs, successes, failures, tokens) and reputation (trust per task kind with its evidence), computed from existing records; completion rates until feedback exists; and its acquaintances (the entities and humans it met)
47
49
  - `evidence.md` — artifact-backed evidence capture for external-boundary tools
48
50
  - `mcp-worker.md` — MCP worker CLI (`abstractruntime-mcp-worker`)
49
51
  - `replay.md` — the replay view: one reconstruction of a run tree (status, the interaction to answer, messages, one activity per execution, artifacts, usage, the workflow it executes) that every client renders; the durable cursor (`seq`, `list_after`); conformance fixtures
@@ -30,6 +30,7 @@ effect payloads, client construction arguments, or Runtime-owned environment var
30
30
  - Thin-mode clients can run the workflow logic while delegating inference to a server.
31
31
  - Remote mode supports AbstractCore per-request `base_url` routing (dynamic endpoint selection).
32
32
  - Tool execution can be gated by trust/sandbox policy outside the router.
33
+ - In every mode, a host stop interrupts an effect (`EffectInterrupted`: no terminal record, re-issued on the next tick); only a failure the effect itself met is recorded as failed.
33
34
 
34
35
  ### See Also
35
36
  - Implementation: [`backlog/completed/005_abstractcore_integration.md`](../backlog/completed/005_abstractcore_integration.md)
@@ -139,8 +139,9 @@ tool-approval waits retain their own contracts.
139
139
  An opt-in actor may inherit `_runtime.conversation: {enabled: true}` through native child
140
140
  workflows and VisualFlow Agent nodes. This flag does not create an extra inference call.
141
141
  Public updates enter replay only through an explicit completed `EMIT_EVENT` named
142
- `public_update`, with payload `id`, `text`, `run_id`, optional `session_id`, `iteration` and
143
- `source_call_ids`. The event's owner must match `run_id`; private diary/thinking fences are
142
+ `public_update`, with payload `id`, `text`, `run_id`, optional `session_id`, `iteration`,
143
+ `source_call_ids` and optional `kind` (`"progress"` or `"finding"`, replayed as the message's
144
+ `update_kind`). The event's owner must match `run_id`; private diary/thinking fences are
144
145
  excluded. See [replay.md](replay.md#public-conversation-messages).
145
146
 
146
147
  Actors may attach `public_action` to a proposed `TOOL_CALLS` payload with `text`,
@@ -458,13 +459,14 @@ Implementation: `src/abstractruntime/replay/` (ADR 0010). Guide: [replay.md](rep
458
459
 
459
460
  ### AbstractCore (LLM + tools)
460
461
 
461
- Requires: `pip install abstractruntime` (AbstractCore 2.32.0 or newer is part of the base install).
462
+ Requires: `pip install abstractruntime` (AbstractCore 2.34.0 or newer is part of the base install).
462
463
 
463
464
  Implementation: `src/abstractruntime/integrations/abstractcore/*`.
464
465
 
465
466
  Entry points:
466
467
  - `create_local_runtime(...)`, `create_remote_runtime(...)`, `create_hybrid_runtime(...)` (`src/abstractruntime/integrations/abstractcore/factory.py`)
467
468
  - public discovery facade: `AbstractCoreDiscoveryFacade`, `get_abstractcore_discovery_facade(...)` (`src/abstractruntime/integrations/abstractcore/discovery_facade.py`)
469
+ - model errors a host tells apart, AbstractCore's own classes: `from abstractruntime.integrations.abstractcore.discovery_facade import ModelNotDownloadedError, ModelNotFoundError` (`ModelNotDownloadedError` is a `ModelNotFoundError` whose `model` and `provider` name what to download); a host never imports `abstractcore` for them
468
470
  - public host facade: `AbstractCoreHostFacade`, `get_abstractcore_host_facade(...)` (`src/abstractruntime/integrations/abstractcore/host_facade.py`)
469
471
  - public voice library facade: `AbstractCoreVoiceFacade`, `get_abstractcore_voice_facade(...)`, `VoiceLibraryError` (`src/abstractruntime/integrations/abstractcore/voice_facade.py`): languages, cloned voices (list by language, read, rename or replace the transcript, delete), cloning from a recording, voice design, the capability catalog; local in process, remote over the AbstractCore server's `/v1` voice routes (see [Voice library](integrations/abstractcore.md#voice-library))
470
472
  - email facade: `email_facade` (AbstractCore's mail library for hosts; see [Email](#email))
@@ -259,6 +259,12 @@ ONE ordering law ([backlog 0045](backlog/planned/runtime_systemic_reliability/00
259
259
  completion/resume path increments `RuntimeHealth` (`record_error`) and
260
260
  logs a warning. Best-effort observability records (progress events,
261
261
  status events) may stay quiet; records that replay depends on may not.
262
+ 4. **A requested host stop is a crash the host announces: identical replay, no terminal record.**
263
+ A host that stops on purpose (a gateway stop or restart, a model-host restart for an update)
264
+ raises `EffectInterrupted` (`core/effect_cancellation.py`) into the effect in flight. The
265
+ runtime appends nothing terminal and re-raises; the run stays RUNNING, and the next tick sends
266
+ the effect again under the same idempotency key as attempt 1 (no retry consumed). Only a
267
+ failure the effect itself met is recorded as failed.
262
268
 
263
269
  Kill-and-replay coverage for this law lives in the crash harness
264
270
  (`tests/harness.py`, backlog 0045): for every persistence point, kill →
@@ -1020,8 +1020,12 @@ Automations rely on four store guarantees. Hosts that bring their own store must
1020
1020
  chat. The JSON store also removes run temp files older than 10 minutes, left behind by a crash, when it opens.
1021
1021
  - **A run index for sessions.** `Runtime.start` checks the attribution of every root run that names a session. A
1022
1022
  store without a run index (no `session_kinds` and no `list_run_index`) cannot answer, and the start is refused with
1023
- `SessionAttributionError` rather than risk starting an unanchored run in a discussion session. Strict history reads
1024
- and `latest_occurrence` (which uses the store's `latest_occurrence_row`) need the index too.
1023
+ `SessionAttributionError` rather than risk starting an unanchored run in a discussion session. A store whose
1024
+ `list_run_index` rows do not carry `session_kind` (an index written before automations v1) cannot tell a discussion
1025
+ from a chat either: its session-bearing starts are refused the same way, never started as a plain chat. To upgrade
1026
+ a custom store, add `session_kind` and `role` to its index rows, or implement `session_kinds(session_id)`. The
1027
+ built-in stores already do. Strict history reads and `latest_occurrence` (which uses the store's
1028
+ `latest_occurrence_row`) need the index too.
1025
1029
 
1026
1030
  ### Crash safety
1027
1031
 
@@ -0,0 +1,27 @@
1
+ # 0865 — A `model_loaded` ledger event with the reserved context
2
+
3
+ > Package: AbstractRuntime (with AbstractCore residency claims)
4
+ > Type: task
5
+ > Created: 2026-10-29
6
+ > Priority: normal
7
+ > Labels: residency, ledger, observability
8
+
9
+ ## Summary
10
+
11
+ Operator ruling (2026-10-29): when a model loads it reserves the maximum context that fits (AbstractCore ADR 0010
12
+ point 8), and "never silently: the choice is written to the ledger (a model_loaded event with model, advertised context,
13
+ reserved context, free memory, buffer, reason) and to the log". AbstractCore already logs it and carries it on the
14
+ provider's residency claim (`context_reservation`: advertised, reserved, free_bytes, buffer, reason). The ledger event
15
+ is not written yet: a load happens inside a client build, outside any run's effect, so there is no step record to
16
+ attach it to.
17
+
18
+ ## Scope
19
+
20
+ - When a pooled client is built for a local model (`MultiLocalAbstractCoreLLMClient._get_client`), read the provider's
21
+ `context_reservation` and append one `model_loaded` record to the ledger of the run that triggered the build (or a
22
+ host-level ledger when no run did), with model, advertised context, reserved context, free memory, buffer, reason.
23
+ - The replay view and Observer show it as one readable line.
24
+
25
+ ## Acceptance criteria
26
+
27
+ - A chat that loads the default model leaves one `model_loaded` record with the numbers; a test is red without it.
@@ -0,0 +1,184 @@
1
+ # Digital identity (an entity's look and voice)
2
+
3
+ Every entity has one digital identity: the avatar design the apps draw for it, the colour of that
4
+ design, and the voice it speaks with. AbstractRuntime keeps it as one small file in the entity's
5
+ home, `identity.json`, and owns its format and its writer
6
+ (`abstractruntime.identity.digital_identity`). AbstractGateway checks what only it can check (the
7
+ design is in the avatar catalog it loaded, the voice is offered and downloaded, the home is not
8
+ held for maintenance) and then calls the runtime writer. Apps read the identity through the
9
+ gateway. This page documents the runtime half; the decision record is the framework's ADR 0052.
10
+
11
+ Identity says WHO the entity is. What it is doing right now (activity, poses) is a separate
12
+ subject.
13
+
14
+ ## The record
15
+
16
+ ```json
17
+ {
18
+ "schema_version": 1,
19
+ "rev": 2,
20
+ "avatar": {"style": "watch-vortex", "color": "#3a7bd5", "source": "chosen"},
21
+ "voice": {"provider": "abstractvoice", "model": "qwen3-tts", "voice": "fr-male-rene", "source": "chosen"},
22
+ "set_at": "2026-11-04T09:00:00+00:00",
23
+ "set_by": "user:laurent"
24
+ }
25
+ ```
26
+
27
+ | Field | Rule |
28
+ |---|---|
29
+ | `schema_version` | exactly 1 |
30
+ | `rev` | 1 for the first record, one more for each write, never reused |
31
+ | `avatar.style` | an abstractavatar design id: a lowercase letter, then up to 63 lowercase letters, digits or dashes |
32
+ | `avatar.color` | `#rrggbb`, lowercase hex |
33
+ | `avatar.source`, `voice.source` | `default` (the recorded default) or `chosen` |
34
+ | `voice` | `provider`, `model` and `voice` together (each non-empty, at most 128 printable characters), optional `speed` (above 0, at most 4) and `quality_preset` (at most 32 characters); or `null` |
35
+ | `set_at` | UTC time with its offset, set by the writer's clock |
36
+ | `set_by` | `namespace:name` (for example `user:laurent`), `operator`, or `default` |
37
+
38
+ `voice: null` is allowed only on the recorded default of a gateway that had no default voice
39
+ (`set_by: default`, `avatar.source: default`). Such an entity has no voice and says so; it never
40
+ borrows one. The whole file is at most 4096 bytes.
41
+
42
+ A file the runtime cannot read in full raises `IdentityUnreadable`, on read and on write: a newer
43
+ `schema_version`, broken JSON, a missing field, an unknown field, or a value out of bounds. It is
44
+ never treated as "no identity", and the writer never overwrites it. A home without
45
+ `identity.json` reads as `None`: its older `voice.yaml` and `appearance.json` are the gateway's to
46
+ read, and the runtime never touches them.
47
+
48
+ ## Writing it
49
+
50
+ ```python
51
+ from abstractruntime.identity import AvatarChoice, VoiceChoice, write_identity
52
+
53
+ record = write_identity(
54
+ home_dir,
55
+ avatar=AvatarChoice(style="watch-vortex", color="#3a7bd5", source="chosen"),
56
+ voice=VoiceChoice(provider="abstractvoice", model="qwen3-tts", voice="fr-male-rene", source="chosen"),
57
+ set_by="user:laurent",
58
+ cause="chosen",
59
+ provenance="PUT /entities/castor/identity",
60
+ check=gateway_checks, # optional: raise to refuse (catalog, offered voice, downloaded model)
61
+ )
62
+ ```
63
+
64
+ In this order: the current file is read; the new record gets the next `rev` and `set_at`; every
65
+ bound is checked (`IdentityInvalid`, whose `field` names the bad value, for example
66
+ `voice.speed`); `check(record)` runs; one row is appended to the home's biography; then the file
67
+ is replaced atomically. A refusal before the row writes nothing.
68
+
69
+ The biography is `<home>/state_history.jsonl`, the same append-only file and field names as the
70
+ `phase_changed` rows, so one reader handles both:
71
+
72
+ ```json
73
+ {"marker": "identity_changed", "rev": 2, "from": {...rev 1...}, "to": {...rev 2...},
74
+ "written_by": "user:laurent", "cause": "chosen", "at": "2026-11-04T09:00:00+00:00",
75
+ "provenance": "PUT /entities/castor/identity"}
76
+ ```
77
+
78
+ The row is on disk before the file moves. If the file then fails to move, the old identity stays,
79
+ the row stays, and the next write takes the rev after it: a rev is never given twice.
80
+ `identity_at_rev(home_dir, n)` answers what the identity was at rev `n` from the current file or
81
+ from these rows (a rev whose file never landed raises `LookupError`), so a copied home knows every
82
+ look and voice it ever had. `life_sleep_stats` skips these rows like every other marker row.
83
+
84
+ One write at a time per home: every write holds `<home>/.identity.lock` from its first read to
85
+ the file replace, and a second writer (another thread, another process, the gateway's start-up
86
+ pass racing a change from an app) waits its turn. Two writers never read the same rev, so a rev
87
+ is never given twice, and two default passes racing on one home write it once. The check hook
88
+ runs under the lock: keep it short. The lock file is never removed.
89
+
90
+ ## The recorded default
91
+
92
+ Every entity has a look and, when the gateway has a default voice, a voice from day one. The
93
+ default is recorded, never computed again at read time: once written it does not change when the
94
+ gateway's default voice changes.
95
+
96
+ `default_identity(entity_id, gateway_default_voice)` returns `(avatar, voice)`; it is pure (no
97
+ clock, no randomness), so anyone can recompute it:
98
+
99
+ - seed = SHA-256 of the entity id exactly as the manifest records it (`entity:castor`, or the
100
+ older `entity:castor@<home_id>`);
101
+ - design = `DEFAULT_STYLE_POOL[seed[0] % 8]`, the pool being, in this order: `watch-halo`,
102
+ `watch-vortex`, `watch-nebula`, `watch-rings`, `watch-galaxy`, `watch-lotus`, `watch-crystal`,
103
+ `watch-aurora` (all eight have a Watch drawing in abstractavatar 0.1.1);
104
+ - colour = HSL(hue = (seed[1] × 256 + seed[2]) mod 360, saturation 62 %, lightness 52 %), each RGB
105
+ channel = floor(c × 255 + 0.5), written `#rrggbb`;
106
+ - voice = the gateway's default voice `{provider, model, voice, speed?, quality_preset?}` as a
107
+ value, or `None` when it has none;
108
+ - `source: default` on both parts.
109
+
110
+ Worked example: for `entity:castor` the seed starts `0x1a 0x92 0x51`, so the design is
111
+ `26 % 8 = 2` → `watch-nebula` and the hue is `(146 × 256 + 81) % 360 = 17` → `#d06439`.
112
+
113
+ `record_default_identity(home_dir, entity_id=..., gateway_default_voice=..., provenance=...)`
114
+ writes it as the home's first record (`set_by: default`, biography `cause: recorded_default`) and
115
+ returns `(record, True)`; on a home that already has a record it returns `(record, False)` and
116
+ writes nothing. The gateway calls it at birth, once per existing home when it starts, and on the
117
+ first read of a home that start skipped.
118
+
119
+ ## The reference
120
+
121
+ Apps name an identity by reference, never by a copy of its values: `{"of": <subject>, "rev": <n>}`,
122
+ string form `<subject>#<n>`.
123
+
124
+ ```python
125
+ from abstractruntime.identity import identity_ref, parse_identity_ref
126
+
127
+ ref = identity_ref("entity:castor", 3)
128
+ str(ref) # "entity:castor#3"
129
+ parse_identity_ref("session:sess_9f2a#1") # a regular agent's identity rides its session
130
+ ```
131
+
132
+ `parse_identity_ref` refuses anything else (`castor`, `entity:castor`, `entity:castor#0`,
133
+ `entity:castor#03`). On a run the reference rides `vars["_runtime"]["identity_ref"]` as
134
+ `{"of", "rev"}`, beside the signed entity stamp (`vars["_runtime"]["entity"]`) and never inside
135
+ it: presentation is not authority. `stamp_run_identity_ref(vars, ref)` puts it there;
136
+ `read_run_identity_ref(vars)` returns it, or `None` when the run carries none (a reference is never
137
+ made up). An old rev resolves through `identity_at_rev`.
138
+
139
+ ## The fingerprint
140
+
141
+ `identity_fingerprint(manifest, book_head=diary.head())` names the individual:
142
+ `actor_id = ActorFingerprint.from_metadata(kind="entity", display_name=<slug>,
143
+ metadata={entity_id, home_id, spark_hash}).actor_id` (`ar_` + 24 hex), served with the continuity
144
+ receipts the home already has: `spark_hash` (the seed), `home_id` (the individual) and `book_head`
145
+ (the diary's chain head). It is derived on every read and stored nowhere. A copy of a home with a
146
+ new `home_id` is a different individual with a different `actor_id`. There are no keys and no
147
+ signatures.
148
+
149
+ ## The summon cue
150
+
151
+ At a summon the entity is told, in one sentence, about the change that made its current identity:
152
+
153
+ - "You were given your look and voice today." (the first record)
154
+ - "You were given your look today; you have no voice yet." (a first record without a voice)
155
+ - "Your voice changed on 4 November (by laurent): now fr-male-rene."
156
+ - "Your look changed today (by the operator): now watch-lotus in #aa3344."
157
+ - "Your look and voice changed today (by laurent): now watch-vortex in #3a7bd5, voice en-female-amy."
158
+
159
+ `identity_change_cue(home_dir, since=...)` returns that sentence, or `None`. It speaks of the
160
+ biography row of the current rev (never of a row whose file did not land), and only when that row
161
+ is newer than `since`, the previous summon's time; with `since=None` (the caller knows no previous
162
+ summon) it is always told. Dates are UTC.
163
+
164
+ `render_summon_prelude(..., home_dir=..., identity_since=...)` puts the sentence after the
165
+ identity core and before the diary tail, as a section that may be dropped to fit the budget (it is
166
+ fitted first). The prelude stays a pure read. The chat driver (`ChatSession(...,
167
+ identity_since=...)`) and the durable visit workflow (`build_visit_workflow(...,
168
+ identity_since=...)`, or `_visit.identity_since` seeded by the door at run creation, which wins)
169
+ pass the summon's home. An unreadable identity is named in the prelude's warnings; it does not
170
+ stop the summon.
171
+
172
+ The diary stays the entity's own record: nothing here writes a diary entry. The entity may write
173
+ one itself after hearing the cue.
174
+
175
+ ## Tests
176
+
177
+ `tests/test_digital_identity.py` (`-m basic`): the round trip and the row shape, every bound
178
+ naming its field, unreadable files refused on read and on write, the row before the file, the rev
179
+ never reused, the default rule against an independent HSL computation and a worked value, the pool
180
+ order, purity over 1000 calls, two homes of one spark getting different colours, the pool checked
181
+ against abstractavatar's catalog (skipped when the package is not installed), idempotent default
182
+ writes, the reference format and its place beside the stamp, the fingerprint formula, the cue
183
+ sentences and the `since` rule, and the cue in place in the prelude, the chat driver and the visit
184
+ workflow.
@@ -15,6 +15,9 @@ entities/castor/
15
15
  manifest.json # entity_id (birth marker — never a lookup key)
16
16
  spark.yaml # the attested seed
17
17
  substrate.yaml # operator's ONE mind choice (provider+model)
18
+ identity.json # look and voice (digital-identity.md)
19
+ .identity.lock # one identity write at a time
20
+ state_history.jsonl # biography: state, phase_changed and identity_changed rows
18
21
  memory.sqlite3 # graph + journal (abstractmemory)
19
22
  home.sqlite3 # diary book + command inbox
20
23
  runtime_castor.sqlite3 # run store + ledger (THIS page)
@@ -12,7 +12,7 @@ Remote-light runtime:
12
12
  pip install abstractruntime
13
13
  ```
14
14
 
15
- This installs AbstractCore 2.32.0 or newer with remote provider, vision,
15
+ This installs AbstractCore 2.34.0 or newer with remote provider, vision,
16
16
  voice, audio, music, decision, tool, and MCP-worker support. The base install is
17
17
  remote-light: it can route multimodal workflows to hosted or OpenAI-compatible
18
18
  endpoints, but it does not select local inferencer stacks such as MLX, vLLM,