AbstractRuntime 0.4.13__tar.gz → 0.4.15__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 (323) hide show
  1. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/CHANGELOG.md +29 -1
  2. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/PKG-INFO +33 -12
  3. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/README.md +4 -4
  4. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/docs/adr/0002_execution_modes_local_remote_hybrid.md +1 -1
  5. abstractruntime-0.4.15/docs/adr/0004_runtime_owns_run_scoped_media_execution_truth.md +44 -0
  6. abstractruntime-0.4.15/docs/adr/0005_runtime_owns_abstractcore_host_discovery_queries.md +55 -0
  7. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/docs/adr/README.md +4 -1
  8. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/docs/api.md +9 -2
  9. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/docs/architecture.md +4 -3
  10. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/docs/backlog/README.md +19 -2
  11. abstractruntime-0.4.15/docs/backlog/completed/019_runtime_host_facade_for_core_operator_surfaces.md +181 -0
  12. abstractruntime-0.4.15/docs/backlog/completed/020_runtime_gateway_install_boundary.md +95 -0
  13. abstractruntime-0.4.15/docs/backlog/completed/021_runtime_gateway_env_namespace_cleanup.md +95 -0
  14. abstractruntime-0.4.15/docs/backlog/completed/022_model_residency_control_plane.md +95 -0
  15. abstractruntime-0.4.15/docs/backlog/completed/023_truthful_local_media_residency_boundaries.md +83 -0
  16. abstractruntime-0.4.15/docs/backlog/completed/024_runtime_owned_run_scoped_media_execution.md +79 -0
  17. abstractruntime-0.4.15/docs/backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md +153 -0
  18. abstractruntime-0.4.15/docs/backlog/planned/008_signatures_and_keys.md +75 -0
  19. abstractruntime-0.4.15/docs/backlog/planned/014_remote_tool_worker_executor.md +74 -0
  20. abstractruntime-0.4.15/docs/backlog/planned/017_limit_warnings_and_observability.md +73 -0
  21. abstractruntime-0.4.15/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +67 -0
  22. abstractruntime-0.4.15/docs/backlog/planned/025_runtime_retention_and_purge_contract.md +141 -0
  23. abstractruntime-0.4.15/docs/backlog/proposed/2026-05-20_agent_runtime_convenience_constructor.md +37 -0
  24. abstractruntime-0.4.15/docs/backlog/proposed/2026-05-20_runtime_local_admin_prompt_cache_save_load.md +74 -0
  25. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/docs/faq.md +31 -2
  26. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/docs/getting-started.md +1 -1
  27. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/docs/integrations/abstractcore.md +130 -7
  28. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/llms-full.txt +13 -10
  29. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/llms.txt +5 -4
  30. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/pyproject.toml +29 -8
  31. abstractruntime-0.4.15/release-notes.md +12 -0
  32. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/core/models.py +1 -0
  33. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/integrations/abstractcore/__init__.py +25 -0
  34. abstractruntime-0.4.15/src/abstractruntime/integrations/abstractcore/discovery_facade.py +292 -0
  35. abstractruntime-0.4.15/src/abstractruntime/integrations/abstractcore/discovery_queries.py +996 -0
  36. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +175 -0
  37. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/integrations/abstractcore/factory.py +20 -14
  38. abstractruntime-0.4.15/src/abstractruntime/integrations/abstractcore/host_facade.py +324 -0
  39. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/integrations/abstractcore/llm_client.py +1430 -36
  40. abstractruntime-0.4.15/src/abstractruntime/integrations/abstractcore/media_subprocess.py +234 -0
  41. abstractruntime-0.4.15/src/abstractruntime/integrations/abstractcore/run_facade.py +266 -0
  42. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +86 -0
  43. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/visualflow_compiler/compiler.py +9 -0
  44. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/visualflow_compiler/visual/executor.py +55 -0
  45. abstractruntime-0.4.15/tests/test_abstractcore_discovery_facade.py +814 -0
  46. abstractruntime-0.4.15/tests/test_abstractcore_host_facade.py +539 -0
  47. abstractruntime-0.4.15/tests/test_abstractcore_run_facade.py +172 -0
  48. abstractruntime-0.4.15/tests/test_model_residency_control_plane.py +324 -0
  49. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_multimodal_abstractcore_integration.py +106 -0
  50. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_packaging_extras.py +10 -7
  51. abstractruntime-0.4.13/docs/backlog/planned/008_signatures_and_keys.md +0 -21
  52. abstractruntime-0.4.13/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -69
  53. abstractruntime-0.4.13/docs/backlog/planned/015_agent_integration_improvements.md +0 -111
  54. abstractruntime-0.4.13/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -141
  55. abstractruntime-0.4.13/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -74
  56. abstractruntime-0.4.13/docs/backlog/proposed/2026-05-08_runtime_gateway_env_namespace_cleanup.md +0 -163
  57. abstractruntime-0.4.13/docs/backlog/proposed/2026-05-08_runtime_gateway_install_boundary.md +0 -128
  58. abstractruntime-0.4.13/docs/backlog/proposed/2026-05-09_runtime_retention_and_purge_contract.md +0 -82
  59. abstractruntime-0.4.13/release-notes.md +0 -3
  60. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/.github/workflows/ci.yml +0 -0
  61. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/.github/workflows/release.yml +0 -0
  62. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/.gitignore +0 -0
  63. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/ACKNOWLEDGMENTS.md +0 -0
  64. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/CONTRIBUTING.md +0 -0
  65. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/LICENSE +0 -0
  66. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/ROADMAP.md +0 -0
  67. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/SECURITY.md +0 -0
  68. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/docs/README.md +0 -0
  69. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
  70. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
  71. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/docs/backlog/completed/001_runtime_kernel.md +0 -0
  72. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
  73. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/docs/backlog/completed/003_wait_primitives.md +0 -0
  74. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/docs/backlog/completed/004_scheduler_driver.md +0 -0
  75. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
  76. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
  77. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
  78. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/docs/backlog/completed/009_artifact_store.md +0 -0
  79. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/docs/backlog/completed/010_examples_and_composition.md +0 -0
  80. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/docs/backlog/completed/011_subworkflow_support.md +0 -0
  81. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
  82. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
  83. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
  84. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
  85. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
  86. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
  87. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
  88. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
  89. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
  90. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
  91. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/docs/backlog/deprecated/004_tests.md +0 -0
  92. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/docs/backlog/deprecated/005_docs_updates.md +0 -0
  93. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
  94. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
  95. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
  96. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/docs/backlog/deprecated/README.md +0 -0
  97. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
  98. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/docs/evidence.md +0 -0
  99. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/docs/limits.md +0 -0
  100. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/docs/manual_testing.md +0 -0
  101. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/docs/mcp-worker.md +0 -0
  102. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/docs/proposal.md +0 -0
  103. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/docs/provenance.md +0 -0
  104. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/docs/snapshots.md +0 -0
  105. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/docs/tools-comms.md +0 -0
  106. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/docs/workflow-bundles.md +0 -0
  107. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/emails.config.example.yaml +0 -0
  108. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/examples/01_hello_world.py +0 -0
  109. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/examples/02_ask_user.py +0 -0
  110. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/examples/03_wait_until.py +0 -0
  111. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/examples/04_multi_step.py +0 -0
  112. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/examples/05_persistence.py +0 -0
  113. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/examples/06_llm_integration.py +0 -0
  114. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/examples/07_react_agent.py +0 -0
  115. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/examples/README.md +0 -0
  116. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/mkdocs.yml +0 -0
  117. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/pytest.ini +0 -0
  118. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/__init__.py +0 -0
  119. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/core/__init__.py +0 -0
  120. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/core/config.py +0 -0
  121. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/core/event_keys.py +0 -0
  122. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/core/policy.py +0 -0
  123. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/core/runtime.py +0 -0
  124. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/core/spec.py +0 -0
  125. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/core/vars.py +0 -0
  126. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/evidence/__init__.py +0 -0
  127. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/evidence/recorder.py +0 -0
  128. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/history_bundle.py +0 -0
  129. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/identity/__init__.py +0 -0
  130. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/identity/fingerprint.py +0 -0
  131. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/integrations/__init__.py +0 -0
  132. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
  133. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
  134. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
  135. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
  136. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
  137. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
  138. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/integrations/abstractcore/output_specs.py +0 -0
  139. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
  140. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
  141. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -0
  142. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +0 -0
  143. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
  144. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
  145. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/memory/__init__.py +0 -0
  146. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/memory/active_context.py +0 -0
  147. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/memory/active_memory.py +0 -0
  148. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/memory/compaction.py +0 -0
  149. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/memory/kg_packets.py +0 -0
  150. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/memory/memact_composer.py +0 -0
  151. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/memory/recall_levels.py +0 -0
  152. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/memory/token_budget.py +0 -0
  153. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/rendering/__init__.py +0 -0
  154. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
  155. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/rendering/json_stringify.py +0 -0
  156. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/scheduler/__init__.py +0 -0
  157. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/scheduler/convenience.py +0 -0
  158. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/scheduler/registry.py +0 -0
  159. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/scheduler/scheduler.py +0 -0
  160. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/storage/__init__.py +0 -0
  161. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/storage/artifacts.py +0 -0
  162. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/storage/base.py +0 -0
  163. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/storage/commands.py +0 -0
  164. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/storage/in_memory.py +0 -0
  165. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/storage/json_files.py +0 -0
  166. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/storage/ledger_chain.py +0 -0
  167. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/storage/observable.py +0 -0
  168. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/storage/offloading.py +0 -0
  169. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/storage/snapshots.py +0 -0
  170. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/storage/sqlite.py +0 -0
  171. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
  172. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
  173. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
  174. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
  175. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
  176. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
  177. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
  178. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
  179. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
  180. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
  181. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
  182. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
  183. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
  184. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
  185. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
  186. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
  187. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
  188. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
  189. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/workflow_bundle/models.py +0 -0
  190. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/workflow_bundle/packer.py +0 -0
  191. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/workflow_bundle/reader.py +0 -0
  192. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/src/abstractruntime/workflow_bundle/registry.py +0 -0
  193. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/README.md +0 -0
  194. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/conftest.py +0 -0
  195. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_active_context_policy.py +0 -0
  196. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_active_memory.py +0 -0
  197. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_answer_user_effect.py +0 -0
  198. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_artifacts.py +0 -0
  199. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_chat_summarizer_integration.py +0 -0
  200. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_command_store.py +0 -0
  201. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_compaction_helpers.py +0 -0
  202. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_control_adapter_while.py +0 -0
  203. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_default_tools_comms_gating.py +0 -0
  204. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_default_tools_include_skim_files.py +0 -0
  205. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_default_tools_include_skim_folders.py +0 -0
  206. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_default_tools_search_files_executor.py +0 -0
  207. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_durable_toolsets.py +0 -0
  208. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
  209. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_emit_event_without_workflow_registry.py +0 -0
  210. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_evidence_recorder.py +0 -0
  211. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
  212. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_integration_abstractcore.py +0 -0
  213. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_integrations_abstractcore.py +0 -0
  214. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_json_file_run_store_children_index.py +0 -0
  215. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_jsonl_ledger_recovery.py +0 -0
  216. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_kg_learn_and_recall_contract.py +0 -0
  217. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_ledger_chain.py +0 -0
  218. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_ledger_subscription.py +0 -0
  219. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_llm_call_media_artifact_refs.py +0 -0
  220. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
  221. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
  222. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_llm_call_requires_prompt.py +0 -0
  223. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_llm_call_response_schema_normalization.py +0 -0
  224. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_llm_call_structured_output_fallback.py +0 -0
  225. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_llm_call_truncation_retry_contract.py +0 -0
  226. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_llm_call_use_context_appends_turn.py +0 -0
  227. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
  228. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_llm_client_media_artifacts.py +0 -0
  229. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_llm_client_system_context.py +0 -0
  230. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_llm_client_tool_call_parsing.py +0 -0
  231. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
  232. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_mcp_remote_tool_executor.py +0 -0
  233. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_mcp_worker_logging.py +0 -0
  234. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_mcp_worker_security.py +0 -0
  235. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_mcp_worker_stdio.py +0 -0
  236. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_media_artifact_resolution.py +0 -0
  237. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_memact_composer_from_kg_result.py +0 -0
  238. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
  239. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_memory_kg_packets.py +0 -0
  240. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_memory_kg_predicate_aliasing.py +0 -0
  241. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_memory_kg_query_packetization_restart.py +0 -0
  242. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
  243. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
  244. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_memory_note_effect.py +0 -0
  245. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_memory_query_effect.py +0 -0
  246. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_memory_query_rich_filters.py +0 -0
  247. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
  248. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_memory_tag_effect.py +0 -0
  249. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_mlx_generation_serialization.py +0 -0
  250. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_offloading.py +0 -0
  251. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_pause_resume.py +0 -0
  252. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_prompt_cache_modules.py +0 -0
  253. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_queryable_run_store.py +0 -0
  254. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
  255. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_real_integration.py +0 -0
  256. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_recall_levels_policy.py +0 -0
  257. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_remote_llm_client.py +0 -0
  258. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_rendering_agent_trace_report.py +0 -0
  259. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_rendering_json_stringify.py +0 -0
  260. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_retry_idempotency.py +0 -0
  261. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_run_history_bundle.py +0 -0
  262. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
  263. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_runtime_install_boundary.py +0 -0
  264. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
  265. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_runtime_node_traces.py +0 -0
  266. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_runtime_start_seeds_tool_support.py +0 -0
  267. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_scheduler.py +0 -0
  268. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
  269. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_snapshots.py +0 -0
  270. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_sqlite_ledger_store.py +0 -0
  271. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_start_subworkflow_async_wait.py +0 -0
  272. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
  273. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
  274. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_structured_output_schema_enum.py +0 -0
  275. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_subworkflow.py +0 -0
  276. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_terminal_effect_completion.py +0 -0
  277. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
  278. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
  279. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_tool_approval_executor.py +0 -0
  280. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_tool_approval_resume_executes.py +0 -0
  281. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_tool_calls_idempotency_keys.py +0 -0
  282. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_tool_executor_argument_sanitization.py +0 -0
  283. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_tool_executor_error_output_detection.py +0 -0
  284. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_tool_executor_filename_alias.py +0 -0
  285. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
  286. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_tool_executor_read_file_aliases.py +0 -0
  287. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_tool_executor_timeout.py +0 -0
  288. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_tool_wait_allowlist_safety.py +0 -0
  289. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_trace_context_propagation.py +0 -0
  290. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_vars_query_effect.py +0 -0
  291. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
  292. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
  293. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
  294. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
  295. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
  296. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
  297. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_visual_memact_compose_node.py +0 -0
  298. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
  299. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
  300. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
  301. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_visualflow_add_message_builtin.py +0 -0
  302. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
  303. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_visualflow_call_tool_node.py +0 -0
  304. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_visualflow_compiler_basic.py +0 -0
  305. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
  306. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_visualflow_get_element_node.py +0 -0
  307. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_visualflow_get_random_element_node.py +0 -0
  308. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_visualflow_has_tools_builtin.py +0 -0
  309. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
  310. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
  311. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_visualflow_make_object_node.py +0 -0
  312. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_visualflow_media_nodes.py +0 -0
  313. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_visualflow_memory_effect_nodes.py +0 -0
  314. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_visualflow_memory_source_pins.py +0 -0
  315. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_visualflow_prompt_only.py +0 -0
  316. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_visualflow_random_nodes.py +0 -0
  317. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_visualflow_string_contains_replace.py +0 -0
  318. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_visualflow_tool_parameters_node.py +0 -0
  319. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_wait_event_prompt_metadata.py +0 -0
  320. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_workflow_bundle_registry.py +0 -0
  321. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_workspace_policy_allowlist_mode.py +0 -0
  322. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
  323. {abstractruntime-0.4.13 → abstractruntime-0.4.15}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
@@ -7,6 +7,26 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.4.15] - 2026-05-20
11
+
12
+ ### Added
13
+ - Public AbstractCore Runtime facades for:
14
+ - discovery/catalog snapshot queries (`get_abstractcore_discovery_facade(...)`)
15
+ - prompt-cache and model-residency host control operations (`get_abstractcore_host_facade(...)`)
16
+ - durable run-scoped child-run execution for image, TTS, STT, and direct LLM calls (`get_abstractcore_run_facade(...)`)
17
+ - `EffectType.MODEL_RESIDENCY` with AbstractCore-backed load/list/unload handling and VisualFlow lowering support for runtime-owned model residency control.
18
+
19
+ ### Changed
20
+ - Minimum optional AbstractCore dependency floor is now `abstractcore>=2.13.20`.
21
+ - Local cached-vision discovery now depends on AbstractCore's public `get_local_vision_cache_catalog()` helper instead of private server internals.
22
+ - Local media residency no-op/unsupported responses now complete truthfully with warning/degraded metadata, and media-only results distinguish runtime orchestration identity from the actual media backend identity.
23
+ - Documentation was refreshed for the current Runtime/Core boundary, including root docs, ADR/backlog references, and AI-readable `llms.txt` / `llms-full.txt`.
24
+
25
+ ## [0.4.14] - 2026-05-19
26
+
27
+ ### Fixed
28
+ - Runtime extras that pull AbstractCore provider/tool dependencies now declare current compatible OpenAI/httpx/anyio bounds directly, preventing Python 3.10 pip installs from backtracking through the full OpenAI 1.x history.
29
+
10
30
  ## [0.4.13] - 2026-05-19
11
31
 
12
32
  ### Fixed
@@ -414,7 +434,15 @@ AbstractRuntime is the durable execution substrate designed to pair with Abstrac
414
434
 
415
435
  Initial development version with basic proof-of-concept features.
416
436
 
417
- [Unreleased]: https://github.com/lpalbou/abstractruntime/compare/v0.4.7...HEAD
437
+ [Unreleased]: https://github.com/lpalbou/abstractruntime/compare/v0.4.15...HEAD
438
+ [0.4.15]: https://github.com/lpalbou/abstractruntime/compare/v0.4.14...v0.4.15
439
+ [0.4.14]: https://github.com/lpalbou/abstractruntime/compare/v0.4.13...v0.4.14
440
+ [0.4.13]: https://github.com/lpalbou/abstractruntime/compare/v0.4.12...v0.4.13
441
+ [0.4.12]: https://github.com/lpalbou/abstractruntime/compare/v0.4.11...v0.4.12
442
+ [0.4.11]: https://github.com/lpalbou/abstractruntime/compare/v0.4.10...v0.4.11
443
+ [0.4.10]: https://github.com/lpalbou/abstractruntime/compare/v0.4.9...v0.4.10
444
+ [0.4.9]: https://github.com/lpalbou/abstractruntime/compare/v0.4.8...v0.4.9
445
+ [0.4.8]: https://github.com/lpalbou/abstractruntime/compare/v0.4.7...v0.4.8
418
446
  [0.4.7]: https://github.com/lpalbou/abstractruntime/compare/v0.4.6...v0.4.7
419
447
  [0.4.6]: https://github.com/lpalbou/abstractruntime/compare/v0.4.5...v0.4.6
420
448
  [0.4.5]: https://github.com/lpalbou/abstractruntime/compare/v0.4.4...v0.4.5
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: AbstractRuntime
3
- Version: 0.4.13
3
+ Version: 0.4.15
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
@@ -23,27 +23,48 @@ Requires-Python: >=3.10
23
23
  Requires-Dist: abstractmemory>=0.2.6
24
24
  Requires-Dist: abstractsemantics>=0.0.3
25
25
  Provides-Extra: abstractcore
26
- Requires-Dist: abstractcore>=2.13.15; extra == 'abstractcore'
26
+ Requires-Dist: abstractcore>=2.13.20; extra == 'abstractcore'
27
+ Requires-Dist: anyio<5.0.0,>=4.12.1; extra == 'abstractcore'
28
+ Requires-Dist: httpx<1.0.0,>=0.28.1; extra == 'abstractcore'
29
+ Requires-Dist: openai<2.0.0,>=1.109.1; extra == 'abstractcore'
27
30
  Provides-Extra: all-apple
28
- Requires-Dist: abstractcore[all-apple]>=2.13.15; extra == 'all-apple'
31
+ Requires-Dist: abstractcore[all-apple]>=2.13.20; extra == 'all-apple'
32
+ Requires-Dist: anyio<5.0.0,>=4.12.1; extra == 'all-apple'
33
+ Requires-Dist: httpx<1.0.0,>=0.28.1; extra == 'all-apple'
34
+ Requires-Dist: openai<2.0.0,>=1.109.1; extra == 'all-apple'
29
35
  Requires-Dist: setuptools<82.0.0,>=80.10.2; extra == 'all-apple'
30
36
  Provides-Extra: all-gpu
31
- Requires-Dist: abstractcore[all-gpu]>=2.13.15; extra == 'all-gpu'
37
+ Requires-Dist: abstractcore[all-gpu]>=2.13.20; extra == 'all-gpu'
38
+ Requires-Dist: anyio<5.0.0,>=4.12.1; extra == 'all-gpu'
39
+ Requires-Dist: httpx<1.0.0,>=0.28.1; extra == 'all-gpu'
40
+ Requires-Dist: openai<2.0.0,>=1.109.1; extra == 'all-gpu'
32
41
  Requires-Dist: setuptools<82.0.0,>=80.10.2; extra == 'all-gpu'
33
42
  Provides-Extra: apple
34
- Requires-Dist: abstractcore[apple]>=2.13.15; extra == 'apple'
43
+ Requires-Dist: abstractcore[apple]>=2.13.20; extra == 'apple'
44
+ Requires-Dist: anyio<5.0.0,>=4.12.1; extra == 'apple'
45
+ Requires-Dist: httpx<1.0.0,>=0.28.1; extra == 'apple'
46
+ Requires-Dist: openai<2.0.0,>=1.109.1; extra == 'apple'
35
47
  Requires-Dist: setuptools<82.0.0,>=80.10.2; extra == 'apple'
36
48
  Provides-Extra: docs
37
49
  Requires-Dist: mkdocs-material>=9.0.0; extra == 'docs'
38
50
  Requires-Dist: mkdocs>=1.6.0; extra == 'docs'
39
51
  Requires-Dist: pymdown-extensions>=10.0; extra == 'docs'
40
52
  Provides-Extra: gpu
41
- Requires-Dist: abstractcore[gpu]>=2.13.15; extra == 'gpu'
53
+ Requires-Dist: abstractcore[gpu]>=2.13.20; extra == 'gpu'
54
+ Requires-Dist: anyio<5.0.0,>=4.12.1; extra == 'gpu'
55
+ Requires-Dist: httpx<1.0.0,>=0.28.1; extra == 'gpu'
56
+ Requires-Dist: openai<2.0.0,>=1.109.1; extra == 'gpu'
42
57
  Requires-Dist: setuptools<82.0.0,>=80.10.2; extra == 'gpu'
43
58
  Provides-Extra: mcp-worker
44
- Requires-Dist: abstractcore[tools]>=2.13.15; extra == 'mcp-worker'
59
+ Requires-Dist: abstractcore[tools]>=2.13.20; extra == 'mcp-worker'
60
+ Requires-Dist: anyio<5.0.0,>=4.12.1; extra == 'mcp-worker'
61
+ Requires-Dist: httpx<1.0.0,>=0.28.1; extra == 'mcp-worker'
62
+ Requires-Dist: openai<2.0.0,>=1.109.1; extra == 'mcp-worker'
45
63
  Provides-Extra: multimodal
46
- Requires-Dist: abstractcore[audio,remote,vision,voice]>=2.13.15; extra == 'multimodal'
64
+ Requires-Dist: abstractcore[audio,remote,vision,voice]>=2.13.20; extra == 'multimodal'
65
+ Requires-Dist: anyio<5.0.0,>=4.12.1; extra == 'multimodal'
66
+ Requires-Dist: httpx<1.0.0,>=0.28.1; extra == 'multimodal'
67
+ Requires-Dist: openai<2.0.0,>=1.109.1; extra == 'multimodal'
47
68
  Requires-Dist: pandas<3.0.0,>=1.0.0; extra == 'multimodal'
48
69
  Requires-Dist: pillow<13.0.0,>=10.0.0; extra == 'multimodal'
49
70
  Requires-Dist: pymupdf-layout<2.0.0,>=1.26.6; extra == 'multimodal'
@@ -60,7 +81,7 @@ Description-Content-Type: text/markdown
60
81
 
61
82
  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.
62
83
 
63
- **Version:** 0.4.10 • **Python:** 3.10+
84
+ **Version:** 0.4.15 • **Python:** 3.10+
64
85
 
65
86
  **Status:** pre-1.0 (API may evolve). For production use, pin versions and follow `CHANGELOG.md`.
66
87
 
@@ -94,7 +115,7 @@ AbstractCore integration (LLM + tools):
94
115
  pip install "abstractruntime[abstractcore]"
95
116
  ```
96
117
 
97
- The `abstractcore` extra installs AbstractCore 2.13.13 or newer so the hardened server auth model, provider-key header routing, generated-media contracts, capability catalog, prompt-cache control plane, current tool catalog, public output-selector contract, and async/sync text-generation output-selector parity are available. Use `abstractruntime[multimodal]` when you need common media, vision, voice, and audio dependencies.
118
+ The `abstractcore` extra installs AbstractCore 2.13.20 or newer so the hardened server auth model, provider-key header routing, generated-media contracts, capability catalog, prompt-cache control plane, public output-selector contract, async/sync text-generation output-selector parity, and the public local vision-cache catalog helper used by Runtime discovery are available. Use `abstractruntime[multimodal]` when you need common media, vision, voice, and audio dependencies.
98
119
 
99
120
  Hardware profile cascades are available for native Python installs:
100
121
  `abstractruntime[apple]`, `abstractruntime[gpu]`, `abstractruntime[all-apple]`,
@@ -148,7 +169,7 @@ state = rt.resume(
148
169
  assert state.status.value == "completed"
149
170
  ```
150
171
 
151
- ## What’s included (v0.4.10)
172
+ ## What’s included (v0.4.15)
152
173
 
153
174
  Kernel (dependency-light):
154
175
  - workflow graphs: `WorkflowSpec` (`src/abstractruntime/core/spec.py`)
@@ -172,7 +193,7 @@ Drivers + distribution:
172
193
  - run history export: `export_run_history_bundle(...)` (`src/abstractruntime/history_bundle.py`)
173
194
 
174
195
  Optional integrations:
175
- - AbstractCore (LLM + tools, cached sessions/prompt cache, media inputs, generated media, tool approval waits): `docs/integrations/abstractcore.md`
196
+ - AbstractCore (LLM + tools, `MODEL_RESIDENCY`, public discovery/host/run facades, cached sessions/prompt cache, media inputs, generated media, tool approval waits): `docs/integrations/abstractcore.md`
176
197
  - AbstractMemory TripleStore integration for `MEMORY_KG_*` effects. Runtime
177
198
  depends on the light AbstractMemory contract; hosts choose storage backends
178
199
  such as LanceDB, SQLite, or in-memory stores.
@@ -4,7 +4,7 @@
4
4
 
5
5
  It is designed for long-running workflows that must survive restarts and explicitly model blocking (human input, timers, external events, subworkflows) without keeping Python stacks alive.
6
6
 
7
- **Version:** 0.4.10 • **Python:** 3.10+
7
+ **Version:** 0.4.15 • **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
 
@@ -38,7 +38,7 @@ AbstractCore integration (LLM + tools):
38
38
  pip install "abstractruntime[abstractcore]"
39
39
  ```
40
40
 
41
- The `abstractcore` extra installs AbstractCore 2.13.13 or newer so the hardened server auth model, provider-key header routing, generated-media contracts, capability catalog, prompt-cache control plane, current tool catalog, public output-selector contract, and async/sync text-generation output-selector parity are available. Use `abstractruntime[multimodal]` when you need common media, vision, voice, and audio dependencies.
41
+ The `abstractcore` extra installs AbstractCore 2.13.20 or newer so the hardened server auth model, provider-key header routing, generated-media contracts, capability catalog, prompt-cache control plane, public output-selector contract, async/sync text-generation output-selector parity, and the public local vision-cache catalog helper used by Runtime discovery are available. Use `abstractruntime[multimodal]` when you need common media, vision, voice, and audio dependencies.
42
42
 
43
43
  Hardware profile cascades are available for native Python installs:
44
44
  `abstractruntime[apple]`, `abstractruntime[gpu]`, `abstractruntime[all-apple]`,
@@ -92,7 +92,7 @@ state = rt.resume(
92
92
  assert state.status.value == "completed"
93
93
  ```
94
94
 
95
- ## What’s included (v0.4.10)
95
+ ## What’s included (v0.4.15)
96
96
 
97
97
  Kernel (dependency-light):
98
98
  - workflow graphs: `WorkflowSpec` (`src/abstractruntime/core/spec.py`)
@@ -116,7 +116,7 @@ Drivers + distribution:
116
116
  - run history export: `export_run_history_bundle(...)` (`src/abstractruntime/history_bundle.py`)
117
117
 
118
118
  Optional integrations:
119
- - AbstractCore (LLM + tools, cached sessions/prompt cache, media inputs, generated media, tool approval waits): `docs/integrations/abstractcore.md`
119
+ - AbstractCore (LLM + tools, `MODEL_RESIDENCY`, public discovery/host/run facades, cached sessions/prompt cache, media inputs, generated media, tool approval waits): `docs/integrations/abstractcore.md`
120
120
  - AbstractMemory TripleStore integration for `MEMORY_KG_*` effects. Runtime
121
121
  depends on the light AbstractMemory contract; hosts choose storage backends
122
122
  such as LanceDB, SQLite, or in-memory stores.
@@ -34,6 +34,6 @@ effect payloads, client construction arguments, or Runtime-owned environment var
34
34
  ### See Also
35
35
  - Implementation: [`backlog/completed/005_abstractcore_integration.md`](../backlog/completed/005_abstractcore_integration.md)
36
36
  - Integration guide: [`integrations/abstractcore.md`](../integrations/abstractcore.md)
37
- - Gateway install boundary: [`backlog/proposed/2026-05-08_runtime_gateway_install_boundary.md`](../backlog/proposed/2026-05-08_runtime_gateway_install_boundary.md)
37
+ - Gateway install boundary: [`backlog/completed/020_runtime_gateway_install_boundary.md`](../backlog/completed/020_runtime_gateway_install_boundary.md)
38
38
  - Code: `src/abstractruntime/integrations/abstractcore/factory.py`
39
39
  - Framework ADR: `../../../docs/adr/0033-install-profiles-config-entrypoints-and-server-boundaries.md`
@@ -0,0 +1,44 @@
1
+ ## ADR 0004: Runtime owns run-scoped media execution truth
2
+
3
+ ### Status
4
+ Accepted (2026-05-20)
5
+
6
+ ### Context
7
+ Hosts sometimes need to trigger image generation, TTS, or STT for an existing run after the main workflow was already created.
8
+
9
+ If a host executes that media work directly and only appends ledger-like records afterward, Runtime is no longer the
10
+ source of truth for:
11
+
12
+ - what was requested;
13
+ - what provider/model path actually executed;
14
+ - which artifacts were produced;
15
+ - how replay should represent the step.
16
+
17
+ We also observed that local media residency can be misunderstood as successful warmup even when the local execution mode
18
+ is a one-shot subprocess boundary that cannot reuse the previous warm state.
19
+
20
+ ### Decision
21
+ AbstractRuntime owns run-scoped media execution truth.
22
+
23
+ Specifically:
24
+
25
+ - Hosts must route run-scoped image/TTS/STT work through Runtime, not execute it out-of-band.
26
+ - The integration provides a public durable run facade that creates Runtime-owned child runs for these operations.
27
+ - Operator/control-plane prompt-cache and model-residency controls remain separate host-oriented helpers and do not
28
+ create durable run history by themselves.
29
+ - Local unsupported media residency must be reported explicitly with machine-readable fields such as
30
+ `execution_mode`, `requires_long_lived_server`, and `config_hint`.
31
+ - Media-only normalized results must separate orchestration identity from actual media backend identity via
32
+ `runtime_provider` / `runtime_model` and `media_provider` / `media_model`.
33
+
34
+ ### Consequences
35
+ - Gateway/other hosts have a clean migration target for run-scoped media routes without synthesizing history after the
36
+ fact.
37
+ - Ledger and artifact truth stay Runtime-authored and replay-friendly.
38
+ - Optional local media warmup can remain non-fatal while still rendering honestly as a warning/no-op.
39
+ - Consumers can distinguish the runtime orchestration model from the media backend that produced the output.
40
+
41
+ ### See Also
42
+ - Implementation: [`../backlog/completed/023_truthful_local_media_residency_boundaries.md`](../backlog/completed/023_truthful_local_media_residency_boundaries.md)
43
+ - Implementation: [`../backlog/completed/024_runtime_owned_run_scoped_media_execution.md`](../backlog/completed/024_runtime_owned_run_scoped_media_execution.md)
44
+ - Integration guide: [`../integrations/abstractcore.md`](../integrations/abstractcore.md)
@@ -0,0 +1,55 @@
1
+ ## ADR 0005: Runtime owns AbstractCore host discovery queries
2
+
3
+ ### Status
4
+ Accepted (2026-05-20)
5
+
6
+ ### Context
7
+ Gateway and other hosts still need to answer operator and thin-client discovery questions such as:
8
+
9
+ - which providers are available;
10
+ - which models a provider exposes;
11
+ - what a model's capabilities are;
12
+ - which voice, TTS, STT, and vision catalogs are currently visible;
13
+ - which local vision models are cached.
14
+
15
+ Before this decision, those reads were often handled outside Runtime by:
16
+
17
+ - raw HTTP proxying from Gateway to AbstractCore server routes;
18
+ - direct imports of public `abstractcore.*` registries and helpers from Gateway;
19
+ - in at least one case, direct import of a Core-server route implementation.
20
+
21
+ That creates an inconsistent boundary: execution and some controls go through Runtime, but discovery reads bypass it entirely.
22
+
23
+ These discovery reads are not durable run truth in the same sense as `LLM_CALL`, `TOOL_CALLS`, or run-scoped media child runs. They are current-environment snapshots that may change between the original query and a later replay.
24
+
25
+ ### Decision
26
+ AbstractRuntime owns the host-facing AbstractCore discovery/query boundary.
27
+
28
+ Specifically:
29
+
30
+ - Hosts should ask Runtime for AbstractCore discovery and catalog queries rather than importing Core registries or proxying Core server routes directly.
31
+ - Runtime provides a public discovery facade for host-oriented snapshot queries.
32
+ - These discovery methods are query/snapshot oriented, not durable run effects.
33
+ - Replay or audit consumers should treat discovery results as recorded snapshots when they are persisted by hosts, not as work that should be re-executed automatically.
34
+ - Gateway-local liveness, auth, install diagnostics, and non-Core helper projections may remain host-local.
35
+
36
+ ### Consequences
37
+ - Runtime becomes the single Python integration boundary for AbstractCore execution, control, and discovery surfaces.
38
+ - Gateway can shrink into an HTTP projection layer rather than a second Core integration layer.
39
+ - Discovery results remain semantically distinct from durable run execution truth.
40
+ - Some local discovery implementations may still require Runtime integration code to adapt Core capability helpers or server-backed routes until Core exposes cleaner public helpers.
41
+
42
+ ### Enforcement
43
+ - New Gateway or host adoption work should prefer Runtime facades over direct `abstractcore.*` imports for discovery/catalog routes.
44
+ - Runtime docs should distinguish durable run work, operator controls, and snapshot discovery queries.
45
+ - Direct Gateway reach-through to `runtime._abstractcore_llm_client` remains prohibited when a public facade exists.
46
+
47
+ ### Validation
48
+ - Runtime tests should cover local and remote discovery facade behavior.
49
+ - Documentation should show the public discovery facade entrypoint and its scope.
50
+ - Follow-up backlog work in hosts should remove direct Core discovery bypasses where the facade now covers them.
51
+
52
+ ### See Also
53
+ - Implementation: [`../backlog/planned/026_runtime_host_discovery_facade_for_core_catalogs.md`](../backlog/planned/026_runtime_host_discovery_facade_for_core_catalogs.md)
54
+ - Existing operator controls: [`0004_runtime_owns_run_scoped_media_execution_truth.md`](0004_runtime_owns_run_scoped_media_execution_truth.md)
55
+ - Integration guide: [`../integrations/abstractcore.md`](../integrations/abstractcore.md)
@@ -16,6 +16,8 @@ When you ask "why is it designed this way?", the answer is in an ADR. ADRs are:
16
16
  | 0001 | [Layered Coupling with AbstractCore](0001_layered_coupling_with_abstractcore.md) | Accepted | 2025-12-11 | Kernel stays dependency-light; AbstractCore integration is opt-in |
17
17
  | 0002 | [Execution Modes](0002_execution_modes_local_remote_hybrid.md) | Accepted | 2025-12-11 | Support local, remote, and hybrid execution topologies |
18
18
  | 0003 | [Provenance Hash Chain](0003_provenance_tamper_evident_hash_chain.md) | Accepted | 2025-12-11 | Tamper-evident ledger first; cryptographic signatures deferred |
19
+ | 0004 | [Runtime Owns Run-Scoped Media Execution Truth](0004_runtime_owns_run_scoped_media_execution_truth.md) | Accepted | 2026-05-20 | Hosts must route run-scoped media execution through Runtime |
20
+ | 0005 | [Runtime Owns AbstractCore Host Discovery Queries](0005_runtime_owns_abstractcore_host_discovery_queries.md) | Accepted | 2026-05-20 | Hosts should ask Runtime for Core discovery/catalog snapshots |
19
21
 
20
22
  ## Relationship to Backlog
21
23
 
@@ -26,6 +28,8 @@ ADRs explain *why*. Backlog items explain *what* and *how*.
26
28
  | 0001 | `backlog/completed/005_abstractcore_integration.md` |
27
29
  | 0002 | `backlog/completed/005_abstractcore_integration.md` |
28
30
  | 0003 | `backlog/completed/007_provenance_hash_chain.md`, `backlog/planned/008_signatures_and_keys.md` |
31
+ | 0004 | `backlog/completed/023_truthful_local_media_residency_boundaries.md`, `backlog/completed/024_runtime_owned_run_scoped_media_execution.md` |
32
+ | 0005 | `backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md` |
29
33
 
30
34
  ## Adding New ADRs
31
35
 
@@ -34,4 +38,3 @@ When making a significant architectural decision:
34
38
  2. Use the template: Status, Context, Decision, Consequences
35
39
  3. Set status to "Accepted" once the decision is final
36
40
  4. If superseding an old ADR, update the old one's status to "Superseded by NNNN"
37
-
@@ -176,15 +176,20 @@ This produces a portable record of a run’s state + ledger + artifacts suitable
176
176
 
177
177
  ### AbstractCore (LLM + tools)
178
178
 
179
- Requires: `pip install "abstractruntime[abstractcore]"` (AbstractCore 2.13.12 or newer).
179
+ Requires: `pip install "abstractruntime[abstractcore]"` (AbstractCore 2.13.20 or newer).
180
180
 
181
181
  Implementation: `src/abstractruntime/integrations/abstractcore/*`.
182
182
 
183
183
  Entry points:
184
184
  - `create_local_runtime(...)`, `create_remote_runtime(...)`, `create_hybrid_runtime(...)` (`src/abstractruntime/integrations/abstractcore/factory.py`)
185
+ - public discovery facade: `AbstractCoreDiscoveryFacade`, `get_abstractcore_discovery_facade(...)` (`src/abstractruntime/integrations/abstractcore/discovery_facade.py`)
186
+ - public host facade: `AbstractCoreHostFacade`, `get_abstractcore_host_facade(...)` (`src/abstractruntime/integrations/abstractcore/host_facade.py`)
187
+ - public durable run facade: `AbstractCoreRunFacade`, `get_abstractcore_run_facade(...)` (`src/abstractruntime/integrations/abstractcore/run_facade.py`)
185
188
  - effect handler wiring: `build_effect_handlers(...)` (`src/abstractruntime/integrations/abstractcore/effect_handlers.py`)
186
189
  - tool executors: `MappingToolExecutor`, `AbstractCoreToolExecutor`, `PassthroughToolExecutor`, `ApprovalToolExecutor`, `ToolApprovalPolicy` (`src/abstractruntime/integrations/abstractcore/tool_executor.py`)
187
- - prompt-cache control methods on the configured LLM client: `get_prompt_cache_capabilities`, `get_prompt_cache_stats`, `prompt_cache_set`, `prompt_cache_update`, `prompt_cache_fork`, `prompt_cache_clear`, `prompt_cache_prepare_modules` (`src/abstractruntime/integrations/abstractcore/llm_client.py`)
190
+ - discovery-facade delegation is implemented by the configured AbstractCore LLM clients in `src/abstractruntime/integrations/abstractcore/llm_client.py` (`list_providers`, `list_provider_models`, `get_voice_catalog`, `list_tts_models`, `list_stt_models`, `list_vision_provider_models`, `list_cached_vision_models`)
191
+ - host-facade delegation is implemented by the configured AbstractCore LLM clients in `src/abstractruntime/integrations/abstractcore/llm_client.py` (`get_prompt_cache_capabilities`, `get_prompt_cache_stats`, `prompt_cache_set`, `prompt_cache_update`, `prompt_cache_fork`, `prompt_cache_clear`, `prompt_cache_prepare_modules`, `list_model_residency`, `load_model_residency`, `unload_model_residency`)
192
+ - run-facade helpers create durable child runs for existing runs (`execute_llm_call`, `generate_image`, `generate_voice`, `transcribe_audio`)
188
193
 
189
194
  `LLM_CALL` payloads are JSON-safe effect payloads. Common fields:
190
195
  - `prompt`, `messages`, `system_prompt`, and convenience `text`
@@ -198,6 +203,8 @@ Multimodal support:
198
203
  - remote and hybrid clients support AbstractCore Server chat media content arrays plus image generation, speech, and transcription endpoints; pass an output-specific `model` for remote media provider routing, otherwise the server endpoint can use its configured capability default
199
204
  - remote transcription requires one audio media item that resolves to a local file path or artifact-backed temporary file
200
205
  - generated image/voice/audio bytes require a runtime `ArtifactStore`; the result contains `artifact_id` / `artifact_ref` instead of inline bytes
206
+ - media-only normalized results expose `runtime_provider` / `runtime_model` separately from `media_provider` / `media_model`
207
+ - optional local media residency failures complete with `status_hint="warning"` and `degraded=true`, while unsupported local media warmup also reports `execution_mode="local_one_shot_subprocess"` and `requires_long_lived_server=true`
201
208
  - Gateway/hosts remain responsible for explicit Core server URLs, Core server auth headers, provider/model defaults, selected Core/capability install profiles, and translation of Gateway-owned env/config into explicit Runtime inputs; Runtime persists only JSON-safe routing metadata and artifact refs
202
209
 
203
210
  Prompt cache / cached sessions:
@@ -1,7 +1,7 @@
1
1
  # AbstractRuntime — Architecture
2
2
 
3
- > Updated: 2026-05-08
4
- > Version: 0.4.9
3
+ > Updated: 2026-05-20
4
+ > Version: 0.4.15
5
5
  > Scope: this describes **what is implemented in this repository**.
6
6
 
7
7
  AbstractRuntime is a **durable workflow runtime**: it executes workflow graphs as a persisted state machine with explicit waits (user, time, events, jobs, subworkflows). A run can pause for hours/days and resume **without** keeping Python stacks/coroutines alive.
@@ -36,6 +36,7 @@ The boundary is intentionally narrow:
36
36
  - Generated binary outputs are written to `ArtifactStore` and returned as `artifact_id` / `artifact_ref`, keeping `RunState.vars` and ledger records bounded and JSON-safe.
37
37
  - Remote chat media is sent to AbstractCore Server as provider-ready content arrays, but persisted provider-request metadata redacts data URLs so checkpoints and ledgers do not embed media bytes.
38
38
  - Provider sessions and prompt-cache objects are not runtime state. Runtime may carry stable cache keys, while AbstractCore clients/servers manage warm caches.
39
+ - Hosts should use Runtime-owned AbstractCore facades for discovery snapshots, prompt-cache/model-residency control operations, and durable run-scoped media child runs instead of reaching through private runtime attachments or importing Core internals directly.
39
40
  - Local execution can use richer AbstractCore capability plugins. Remote and hybrid execution map the common media cases to AbstractCore Server endpoints and OpenAI-compatible content arrays, while hybrid keeps tool execution local.
40
41
  - Gateway and other hosts compose Runtime with the desired Core/capability/memory profile. Runtime's base package includes the AbstractMemory contract but not backend extras such as LanceDB; hosts choose storage, embeddings, and readiness policy. Hardware profile extras such as `apple`, `gpu`, `all-apple`, and `all-gpu` cascade through AbstractCore when a host selects them.
41
42
  - Remote and hybrid clients use explicit Core server URLs and auth headers supplied by the host. Runtime does not read Gateway auth environment variables for provider/model/auth decisions or treat Gateway bearer tokens as Core server/provider credentials.
@@ -168,7 +169,7 @@ Registered in `Runtime._register_builtin_handlers()` (`src/abstractruntime/core/
168
169
 
169
170
  ### Host-wired effects
170
171
  The kernel defines the protocol; concrete integrations provide handlers:
171
- - `LLM_CALL`, `TOOL_CALLS`: provided by AbstractCore integration (`src/abstractruntime/integrations/abstractcore/effect_handlers.py`). The integration supports local/remote/hybrid execution, cached sessions/prompt-cache control, media inputs, generated media outputs, provider-key header routing for remote servers, passthrough tools, and approval-gated local tool execution.
172
+ - `LLM_CALL`, `TOOL_CALLS`, `MODEL_RESIDENCY`: provided by AbstractCore integration (`src/abstractruntime/integrations/abstractcore/effect_handlers.py`). The integration supports local/remote/hybrid execution, cached sessions/prompt-cache control, discovery/catalog snapshots, model residency, durable run-scoped media child runs, media inputs, generated media outputs, provider-key header routing for remote servers, passthrough tools, and approval-gated local tool execution.
172
173
  - `MEMORY_KG_*`: provided by the AbstractMemory bridge (`src/abstractruntime/integrations/abstractmemory/effect_handlers.py`)
173
174
 
174
175
  ### Reliability: retries + idempotency
@@ -1,8 +1,11 @@
1
1
  # Backlog (maintainers)
2
2
 
3
+ This README currently serves as the backlog overview for this repository.
4
+
3
5
  This folder contains a structured backlog used during development. Items are grouped as:
4
6
  - `completed/` — implemented work items (what shipped, with implementation pointers)
5
- - `planned/` — future work proposals
7
+ - `planned/` — committed future work items that still match current runtime reality
8
+ - `proposed/` — uncommitted ideas and follow-on risks worth preserving
6
9
  - `deprecated/` — historical backlog notes (superseded)
7
10
 
8
11
  If you are new to the project, start with `../README.md` and `../architecture.md` instead.
@@ -24,6 +27,13 @@ If you are new to the project, start with `../README.md` and `../architecture.md
24
27
  | 012 | `completed/012_run_store_query_and_scheduler_support.md` |
25
28
  | 013 | `completed/013_effect_retries_and_idempotency.md` |
26
29
  | 016 | `completed/016_runtime_aware_parameters.md` |
30
+ | 019 | `completed/019_runtime_host_facade_for_core_operator_surfaces.md` |
31
+ | 020 | `completed/020_runtime_gateway_install_boundary.md` |
32
+ | 021 | `completed/021_runtime_gateway_env_namespace_cleanup.md` |
33
+ | 022 | `completed/022_model_residency_control_plane.md` |
34
+ | 023 | `completed/023_truthful_local_media_residency_boundaries.md` |
35
+ | 024 | `completed/024_runtime_owned_run_scoped_media_execution.md` |
36
+ | 026 | `completed/026_runtime_host_discovery_facade_for_core_catalogs.md` |
27
37
 
28
38
  ## Planned
29
39
 
@@ -31,9 +41,16 @@ If you are new to the project, start with `../README.md` and `../architecture.md
31
41
  |----|------|
32
42
  | 008 | `planned/008_signatures_and_keys.md` |
33
43
  | 014 | `planned/014_remote_tool_worker_executor.md` |
34
- | 015 | `planned/015_agent_integration_improvements.md` |
35
44
  | 017 | `planned/017_limit_warnings_and_observability.md` |
36
45
  | 018 | `planned/018_workspace_access_policy_for_media_and_tools.md` |
46
+ | 025 | `planned/025_runtime_retention_and_purge_contract.md` |
47
+
48
+ ## Proposed
49
+
50
+ | Date | Item |
51
+ |------|------|
52
+ | 2026-05-20 | `proposed/2026-05-20_agent_runtime_convenience_constructor.md` |
53
+ | 2026-05-20 | `proposed/2026-05-20_runtime_local_admin_prompt_cache_save_load.md` |
37
54
 
38
55
  ## Deprecated
39
56
 
@@ -0,0 +1,181 @@
1
+ # Runtime Host Facade For Core Operator Surfaces
2
+
3
+ ## Metadata
4
+ - Created: 2026-05-20
5
+ - Status: Completed
6
+ - Completed: 2026-05-20
7
+ - Origin: promoted directly from `docs/backlog/proposed/2026-05-20_runtime_host_facade_for_core_operator_surfaces.md`
8
+
9
+ ## Context
10
+
11
+ `abstractruntime.integrations.abstractcore` already owned the real control-plane behavior for:
12
+
13
+ - prompt-cache operations
14
+ - model-residency operations
15
+ - local/remote/hybrid runtime topology normalization
16
+
17
+ But hosts had no stable public Runtime-facing contract for those surfaces. In practice, they either:
18
+
19
+ 1. reached through `runtime._abstractcore_llm_client`, or
20
+ 2. rebuilt control-plane behavior outside Runtime
21
+
22
+ That was inconsistent with the broader Runtime mission: keep execution topology and control semantics inside Runtime so
23
+ hosts request work from Runtime rather than re-deriving integration behavior themselves.
24
+
25
+ ## Current Code Reality At Implementation Time
26
+
27
+ Already implemented before this item was completed:
28
+
29
+ - prompt-cache control methods on local, multi-local, and remote AbstractCore clients
30
+ - `MODEL_RESIDENCY` as a Runtime effect
31
+ - truthful local media-residency constraints
32
+
33
+ Missing or incomplete before this item:
34
+
35
+ - a public facade/export path for host code
36
+ - documentation telling hosts to use that public path
37
+ - tests proving the public facade works across local, remote, and hybrid runtime factories
38
+
39
+ ## Problem
40
+
41
+ Hosts needed a narrow, documented control-plane surface for prompt-cache and model-residency operations without:
42
+
43
+ - hard-coupling `Runtime` itself to an AbstractCore-specific public accessor
44
+ - normalizing too much Gateway/product-level readiness logic into Runtime
45
+ - implying that operator actions are durable run truth
46
+
47
+ ## What We Implemented
48
+
49
+ Phase 1 shipped the narrow public host facade proposed in the backlog review:
50
+
51
+ - `AbstractCoreHostFacade`
52
+ - `get_abstractcore_host_facade(...)`
53
+
54
+ Scope kept intentionally narrow:
55
+
56
+ - prompt-cache operations
57
+ - model-residency operations
58
+
59
+ Explicit non-goals preserved:
60
+
61
+ - no media/TTS/STT helper methods in this item
62
+ - no discovery/catalog/readiness aggregation in this item
63
+ - no provider-private prompt-cache save/load promotion in this item
64
+ - no change to the rule that durable run truth must still flow through Runtime effects/commands
65
+
66
+ ## Files And Symbols Touched
67
+
68
+ Implementation:
69
+
70
+ - `src/abstractruntime/integrations/abstractcore/host_facade.py`
71
+ - `src/abstractruntime/integrations/abstractcore/__init__.py`
72
+ - `src/abstractruntime/integrations/abstractcore/factory.py`
73
+
74
+ Tests:
75
+
76
+ - `tests/test_abstractcore_host_facade.py`
77
+
78
+ Docs:
79
+
80
+ - `docs/integrations/abstractcore.md`
81
+ - `docs/api.md`
82
+ - `docs/faq.md`
83
+ - `llms-full.txt`
84
+ - `docs/backlog/README.md`
85
+
86
+ ## Expected Outcomes
87
+
88
+ The following are now true:
89
+
90
+ - hosts have a documented public facade for prompt-cache and model-residency controls
91
+ - the facade delegates to the real AbstractCore-backed Runtime topology instead of duplicating logic
92
+ - local, remote, and hybrid runtime factories all expose the same host-facade entrypoint
93
+ - docs now point hosts at the public facade instead of instructing them to use the private runtime attachment directly
94
+ - factory attachment failures fail fast instead of surfacing as a later opaque facade error
95
+
96
+ ## Validation
97
+
98
+ Primary validation:
99
+
100
+ - `pytest -q tests/test_abstractcore_host_facade.py`
101
+ - `pytest -q tests/test_abstractcore_host_facade.py tests/test_prompt_cache_modules.py tests/test_model_residency_control_plane.py`
102
+
103
+ Example proof run:
104
+
105
+ - `PYTHONPATH=src python` example using `create_remote_runtime(...)` + `get_abstractcore_host_facade(...)` with a stub request sender
106
+
107
+ ## Completion Report
108
+
109
+ ### Date
110
+
111
+ 2026-05-20
112
+
113
+ ### Summary
114
+
115
+ Implemented a public, integration-scoped host facade for AbstractCore prompt-cache and model-residency control
116
+ operations. The facade is exported from `abstractruntime.integrations.abstractcore`, documented as the host entrypoint,
117
+ and validated across local, remote, and hybrid runtime construction paths.
118
+
119
+ ### Behavior Changes
120
+
121
+ - Added `AbstractCoreHostFacade` as the public host-control surface for prompt-cache and model-residency operations.
122
+ - Added `get_abstractcore_host_facade(runtime)` as the documented integration-scoped helper.
123
+ - Exported the facade from `abstractruntime.integrations.abstractcore`.
124
+ - Kept the underlying runtime attachment private, but made factory attachment fail fast if it cannot be installed.
125
+ - Replaced public docs guidance that previously told hosts to access `_abstractcore_llm_client` directly.
126
+
127
+ ### Tests
128
+
129
+ Local validation run in this completion pass:
130
+
131
+ - `tests/test_abstractcore_host_facade.py`: `12 passed in 0.20s`
132
+ - `tests/test_abstractcore_host_facade.py tests/test_prompt_cache_modules.py tests/test_model_residency_control_plane.py`: `32 passed in 0.25s`
133
+
134
+ Independent test-agent validation:
135
+
136
+ - `tests/test_abstractcore_host_facade.py`: `12 passed`
137
+ - `tests/test_prompt_cache_modules.py`: `10 passed`
138
+ - `tests/test_model_residency_control_plane.py`: `10 passed`
139
+ - aggregate: `32 passed`, `0 failed`, `0 skipped`, `3.00s` aggregate wall time
140
+
141
+ ### Example Evidence
142
+
143
+ The example proof run used a factory-created remote runtime plus the public facade and produced:
144
+
145
+ - prompt-cache capabilities response with `mode=keyed`
146
+ - model-residency load response with `runtime_id=rid-42`
147
+ - provider API key forwarded as `X-AbstractCore-Provider-API-Key`
148
+ - correct root-level control URLs:
149
+ - `http://core.example/acore/prompt_cache/capabilities?...`
150
+ - `http://core.example/acore/models/load`
151
+ - combined example execution time: `0.056 ms` with an in-memory stub sender
152
+
153
+ ### Docs Updated
154
+
155
+ - integration guide now shows `get_abstractcore_host_facade(...)`
156
+ - API reference lists the public host facade entrypoint
157
+ - FAQ points hosts at the facade rather than the private runtime attachment
158
+ - `llms-full.txt` reflects the new public contract
159
+
160
+ ### Residual Risks
161
+
162
+ - The facade still depends internally on the private `_abstractcore_llm_client` runtime attachment; that coupling is
163
+ now explicit and fail-fast, but it remains an internal integration detail worth revisiting in future refactors.
164
+ - The remote-runtime proof path swaps the underlying client's private `_sender` in tests/example setup, so that one
165
+ validation path is not purely black-box from the public facade surface.
166
+ - There is no dedicated test for the exceptional attach-failure path in `factory.py`; success-path wiring is covered.
167
+ - The docs snippets are not yet executed as tests.
168
+
169
+ ### Backlog / Code Drift Found
170
+
171
+ - During this completion pass, the stranded residency proposal was cleaned up separately into
172
+ `docs/backlog/completed/022_model_residency_control_plane.md`.
173
+ - No `docs/backlog/overview.md` exists in this repository; `docs/backlog/README.md` currently serves as the effective
174
+ backlog overview and was updated accordingly.
175
+ - No `docs/backlog/recurrent/` directory exists here, so there were no recurrent-task files to scan in this pass.
176
+
177
+ ### Follow-Up Impact
178
+
179
+ - This completion narrows and stabilizes the Runtime-owned control plane for host code.
180
+ - The remaining adjacent boundary work is still represented by the separate local media truthfulness proposal and the
181
+ sibling Gateway run-truth item discussed in backlog review.