AbstractRuntime 0.4.6__tar.gz → 0.4.7__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 (296) hide show
  1. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/CHANGELOG.md +16 -1
  2. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/PKG-INFO +7 -7
  3. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/README.md +3 -3
  4. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/adr/0002_execution_modes_local_remote_hybrid.md +9 -2
  5. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/api.md +6 -2
  6. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/architecture.md +4 -2
  7. abstractruntime-0.4.7/docs/backlog/proposed/2026-05-08_runtime_gateway_env_namespace_cleanup.md +163 -0
  8. abstractruntime-0.4.7/docs/backlog/proposed/2026-05-08_runtime_gateway_install_boundary.md +117 -0
  9. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/faq.md +3 -1
  10. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/getting-started.md +1 -1
  11. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/integrations/abstractcore.md +17 -2
  12. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/limits.md +1 -1
  13. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/proposal.md +1 -1
  14. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/provenance.md +1 -1
  15. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/workflow-bundles.md +2 -0
  16. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/llms-full.txt +8 -4
  17. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/llms.txt +6 -4
  18. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/pyproject.toml +4 -4
  19. abstractruntime-0.4.7/release-notes.md +11 -0
  20. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +25 -10
  21. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/integrations/abstractcore/output_specs.py +4 -3
  22. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/workflow_bundle/registry.py +4 -6
  23. abstractruntime-0.4.7/tests/test_packaging_extras.py +65 -0
  24. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_prompt_cache_modules.py +57 -0
  25. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_remote_llm_client.py +22 -0
  26. abstractruntime-0.4.7/tests/test_runtime_install_boundary.py +77 -0
  27. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_session_attachments_registry_and_open_tool.py +72 -0
  28. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_workflow_bundle_registry.py +18 -0
  29. abstractruntime-0.4.6/release-notes.md +0 -5
  30. abstractruntime-0.4.6/tests/test_packaging_extras.py +0 -34
  31. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/.github/workflows/ci.yml +0 -0
  32. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/.github/workflows/release.yml +0 -0
  33. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/.gitignore +0 -0
  34. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/ACKNOWLEDGMENTS.md +0 -0
  35. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/CONTRIBUTING.md +0 -0
  36. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/LICENSE +0 -0
  37. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/ROADMAP.md +0 -0
  38. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/SECURITY.md +0 -0
  39. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/README.md +0 -0
  40. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
  41. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
  42. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/adr/README.md +0 -0
  43. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/backlog/README.md +0 -0
  44. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/backlog/completed/001_runtime_kernel.md +0 -0
  45. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
  46. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/backlog/completed/003_wait_primitives.md +0 -0
  47. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/backlog/completed/004_scheduler_driver.md +0 -0
  48. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
  49. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
  50. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
  51. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/backlog/completed/009_artifact_store.md +0 -0
  52. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/backlog/completed/010_examples_and_composition.md +0 -0
  53. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/backlog/completed/011_subworkflow_support.md +0 -0
  54. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
  55. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
  56. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
  57. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
  58. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
  59. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
  60. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
  61. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
  62. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
  63. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
  64. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/backlog/deprecated/004_tests.md +0 -0
  65. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/backlog/deprecated/005_docs_updates.md +0 -0
  66. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
  67. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
  68. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
  69. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/backlog/deprecated/README.md +0 -0
  70. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
  71. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
  72. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
  73. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/backlog/planned/015_agent_integration_improvements.md +0 -0
  74. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
  75. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
  76. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/evidence.md +0 -0
  77. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/manual_testing.md +0 -0
  78. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/mcp-worker.md +0 -0
  79. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/snapshots.md +0 -0
  80. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/docs/tools-comms.md +0 -0
  81. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/emails.config.example.yaml +0 -0
  82. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/examples/01_hello_world.py +0 -0
  83. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/examples/02_ask_user.py +0 -0
  84. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/examples/03_wait_until.py +0 -0
  85. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/examples/04_multi_step.py +0 -0
  86. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/examples/05_persistence.py +0 -0
  87. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/examples/06_llm_integration.py +0 -0
  88. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/examples/07_react_agent.py +0 -0
  89. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/examples/README.md +0 -0
  90. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/mkdocs.yml +0 -0
  91. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/pytest.ini +0 -0
  92. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/__init__.py +0 -0
  93. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/core/__init__.py +0 -0
  94. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/core/config.py +0 -0
  95. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/core/event_keys.py +0 -0
  96. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/core/models.py +0 -0
  97. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/core/policy.py +0 -0
  98. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/core/runtime.py +0 -0
  99. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/core/spec.py +0 -0
  100. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/core/vars.py +0 -0
  101. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/evidence/__init__.py +0 -0
  102. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/evidence/recorder.py +0 -0
  103. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/history_bundle.py +0 -0
  104. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/identity/__init__.py +0 -0
  105. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/identity/fingerprint.py +0 -0
  106. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/integrations/__init__.py +0 -0
  107. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/integrations/abstractcore/__init__.py +0 -0
  108. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
  109. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
  110. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
  111. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/integrations/abstractcore/factory.py +0 -0
  112. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/integrations/abstractcore/llm_client.py +0 -0
  113. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
  114. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
  115. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
  116. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
  117. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
  118. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -0
  119. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +0 -0
  120. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
  121. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
  122. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/memory/__init__.py +0 -0
  123. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/memory/active_context.py +0 -0
  124. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/memory/active_memory.py +0 -0
  125. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/memory/compaction.py +0 -0
  126. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/memory/kg_packets.py +0 -0
  127. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/memory/memact_composer.py +0 -0
  128. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/memory/recall_levels.py +0 -0
  129. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/memory/token_budget.py +0 -0
  130. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/rendering/__init__.py +0 -0
  131. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
  132. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/rendering/json_stringify.py +0 -0
  133. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/scheduler/__init__.py +0 -0
  134. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/scheduler/convenience.py +0 -0
  135. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/scheduler/registry.py +0 -0
  136. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/scheduler/scheduler.py +0 -0
  137. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/storage/__init__.py +0 -0
  138. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/storage/artifacts.py +0 -0
  139. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/storage/base.py +0 -0
  140. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/storage/commands.py +0 -0
  141. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/storage/in_memory.py +0 -0
  142. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/storage/json_files.py +0 -0
  143. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/storage/ledger_chain.py +0 -0
  144. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/storage/observable.py +0 -0
  145. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/storage/offloading.py +0 -0
  146. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/storage/snapshots.py +0 -0
  147. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/storage/sqlite.py +0 -0
  148. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
  149. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
  150. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
  151. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
  152. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
  153. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
  154. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
  155. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
  156. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
  157. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
  158. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
  159. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/visualflow_compiler/compiler.py +0 -0
  160. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
  161. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
  162. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
  163. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
  164. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
  165. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/visualflow_compiler/visual/executor.py +0 -0
  166. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
  167. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
  168. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
  169. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/workflow_bundle/models.py +0 -0
  170. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/workflow_bundle/packer.py +0 -0
  171. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/src/abstractruntime/workflow_bundle/reader.py +0 -0
  172. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/README.md +0 -0
  173. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/conftest.py +0 -0
  174. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_active_context_policy.py +0 -0
  175. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_active_memory.py +0 -0
  176. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_answer_user_effect.py +0 -0
  177. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_artifacts.py +0 -0
  178. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_chat_summarizer_integration.py +0 -0
  179. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_command_store.py +0 -0
  180. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_compaction_helpers.py +0 -0
  181. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_control_adapter_while.py +0 -0
  182. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_default_tools_comms_gating.py +0 -0
  183. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_default_tools_include_skim_files.py +0 -0
  184. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_default_tools_include_skim_folders.py +0 -0
  185. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_default_tools_search_files_executor.py +0 -0
  186. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_durable_toolsets.py +0 -0
  187. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
  188. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_emit_event_without_workflow_registry.py +0 -0
  189. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_evidence_recorder.py +0 -0
  190. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
  191. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_integration_abstractcore.py +0 -0
  192. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_integrations_abstractcore.py +0 -0
  193. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_json_file_run_store_children_index.py +0 -0
  194. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_jsonl_ledger_recovery.py +0 -0
  195. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_kg_learn_and_recall_contract.py +0 -0
  196. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_ledger_chain.py +0 -0
  197. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_ledger_subscription.py +0 -0
  198. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_llm_call_media_artifact_refs.py +0 -0
  199. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
  200. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
  201. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_llm_call_requires_prompt.py +0 -0
  202. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_llm_call_response_schema_normalization.py +0 -0
  203. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_llm_call_structured_output_fallback.py +0 -0
  204. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_llm_call_truncation_retry_contract.py +0 -0
  205. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_llm_call_use_context_appends_turn.py +0 -0
  206. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
  207. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_llm_client_media_artifacts.py +0 -0
  208. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_llm_client_system_context.py +0 -0
  209. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_llm_client_tool_call_parsing.py +0 -0
  210. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
  211. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_mcp_remote_tool_executor.py +0 -0
  212. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_mcp_worker_logging.py +0 -0
  213. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_mcp_worker_security.py +0 -0
  214. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_mcp_worker_stdio.py +0 -0
  215. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_memact_composer_from_kg_result.py +0 -0
  216. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
  217. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_memory_kg_packets.py +0 -0
  218. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_memory_kg_predicate_aliasing.py +0 -0
  219. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_memory_kg_query_packetization_restart.py +0 -0
  220. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
  221. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
  222. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_memory_note_effect.py +0 -0
  223. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_memory_query_effect.py +0 -0
  224. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_memory_query_rich_filters.py +0 -0
  225. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
  226. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_memory_tag_effect.py +0 -0
  227. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_mlx_generation_serialization.py +0 -0
  228. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_multimodal_abstractcore_integration.py +0 -0
  229. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_offloading.py +0 -0
  230. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_pause_resume.py +0 -0
  231. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_queryable_run_store.py +0 -0
  232. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
  233. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_real_integration.py +0 -0
  234. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_recall_levels_policy.py +0 -0
  235. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_rendering_agent_trace_report.py +0 -0
  236. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_rendering_json_stringify.py +0 -0
  237. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_retry_idempotency.py +0 -0
  238. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_run_history_bundle.py +0 -0
  239. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
  240. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
  241. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_runtime_node_traces.py +0 -0
  242. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_runtime_start_seeds_tool_support.py +0 -0
  243. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_scheduler.py +0 -0
  244. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_snapshots.py +0 -0
  245. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_sqlite_ledger_store.py +0 -0
  246. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_start_subworkflow_async_wait.py +0 -0
  247. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
  248. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
  249. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_structured_output_schema_enum.py +0 -0
  250. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_subworkflow.py +0 -0
  251. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_terminal_effect_completion.py +0 -0
  252. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
  253. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
  254. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_tool_approval_executor.py +0 -0
  255. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_tool_approval_resume_executes.py +0 -0
  256. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_tool_calls_idempotency_keys.py +0 -0
  257. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_tool_executor_argument_sanitization.py +0 -0
  258. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_tool_executor_error_output_detection.py +0 -0
  259. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_tool_executor_filename_alias.py +0 -0
  260. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
  261. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_tool_executor_read_file_aliases.py +0 -0
  262. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_tool_executor_timeout.py +0 -0
  263. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_tool_wait_allowlist_safety.py +0 -0
  264. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_trace_context_propagation.py +0 -0
  265. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_vars_query_effect.py +0 -0
  266. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
  267. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
  268. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
  269. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
  270. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
  271. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
  272. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_visual_memact_compose_node.py +0 -0
  273. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
  274. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
  275. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
  276. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_visualflow_add_message_builtin.py +0 -0
  277. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
  278. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_visualflow_call_tool_node.py +0 -0
  279. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_visualflow_compiler_basic.py +0 -0
  280. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
  281. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_visualflow_get_element_node.py +0 -0
  282. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_visualflow_get_random_element_node.py +0 -0
  283. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_visualflow_has_tools_builtin.py +0 -0
  284. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
  285. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
  286. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_visualflow_make_object_node.py +0 -0
  287. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_visualflow_memory_effect_nodes.py +0 -0
  288. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_visualflow_memory_source_pins.py +0 -0
  289. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_visualflow_prompt_only.py +0 -0
  290. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_visualflow_random_nodes.py +0 -0
  291. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_visualflow_string_contains_replace.py +0 -0
  292. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_visualflow_tool_parameters_node.py +0 -0
  293. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_wait_event_prompt_metadata.py +0 -0
  294. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_workspace_policy_allowlist_mode.py +0 -0
  295. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
  296. {abstractruntime-0.4.6 → abstractruntime-0.4.7}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
@@ -7,6 +7,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.4.7] - 2026-05-08
11
+
12
+ ### Changed
13
+ - Minimum `abstractcore` optional dependency increased to `>=2.13.11` for the `abstractcore`, `multimodal`, and `mcp-worker` extras so Runtime aligns with the current Core server-auth, provider-key, generated-media, and capability-catalog contracts.
14
+ - AbstractCore integration imports now fail fast when a stale local AbstractCore install is older than the 2.13.11 Gateway/Core deployment baseline.
15
+ - Documentation now makes the Gateway handoff explicit: hosts choose Runtime plus the Core/capability/memory profile, pass Core server URLs/auth headers deliberately, and keep provider clients, auth objects, model handles, and sessions out of durable runtime state.
16
+ - Runtime no longer reads Gateway-owned environment variables directly. Prompt-cache defaults use explicit Runtime state or `ABSTRACTRUNTIME_PROMPT_CACHE`, read-file attachment registration limits use explicit Runtime state/payload values or `ABSTRACTRUNTIME_MAX_ATTACHMENT_BYTES`, and workflow bundle registries use shared/framework or explicit directories.
17
+
18
+ ### Testing
19
+ - Added packaging boundary coverage proving Runtime exposes no fake hardware profile extras (`apple`, `gpu`, `all-apple`, `all-gpu`) and keeps the Core floors aligned.
20
+ - Added import-boundary coverage proving the runtime kernel and package root do not import optional Core/Vision/Voice/Memory/Music stacks.
21
+ - Added a remote client regression test proving Gateway auth/provider-key environment variables are not inherited as AbstractCore server auth or provider-key headers.
22
+ - Added regression tests proving Gateway env vars alone do not enable prompt-cache keys, shrink attachment registration limits, or select workflow bundle registry directories.
23
+
10
24
  ## [0.4.6] - 2026-05-07
11
25
 
12
26
  ### Changed
@@ -340,7 +354,8 @@ AbstractRuntime is the durable execution substrate designed to pair with Abstrac
340
354
 
341
355
  Initial development version with basic proof-of-concept features.
342
356
 
343
- [Unreleased]: https://github.com/lpalbou/abstractruntime/compare/v0.4.6...HEAD
357
+ [Unreleased]: https://github.com/lpalbou/abstractruntime/compare/v0.4.7...HEAD
358
+ [0.4.7]: https://github.com/lpalbou/abstractruntime/compare/v0.4.6...v0.4.7
344
359
  [0.4.6]: https://github.com/lpalbou/abstractruntime/compare/v0.4.5...v0.4.6
345
360
  [0.4.5]: https://github.com/lpalbou/abstractruntime/compare/v0.4.4...v0.4.5
346
361
  [0.4.4]: https://github.com/lpalbou/abstractruntime/releases/tag/v0.4.4
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: AbstractRuntime
3
- Version: 0.4.6
3
+ Version: 0.4.7
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
@@ -22,15 +22,15 @@ Classifier: Programming Language :: Python :: 3.13
22
22
  Requires-Python: >=3.10
23
23
  Requires-Dist: abstractsemantics>=0.0.2
24
24
  Provides-Extra: abstractcore
25
- Requires-Dist: abstractcore>=2.13.10; extra == 'abstractcore'
25
+ Requires-Dist: abstractcore>=2.13.11; extra == 'abstractcore'
26
26
  Provides-Extra: docs
27
27
  Requires-Dist: mkdocs-material>=9.0.0; extra == 'docs'
28
28
  Requires-Dist: mkdocs>=1.6.0; extra == 'docs'
29
29
  Requires-Dist: pymdown-extensions>=10.0; extra == 'docs'
30
30
  Provides-Extra: mcp-worker
31
- Requires-Dist: abstractcore[tools]>=2.13.10; extra == 'mcp-worker'
31
+ Requires-Dist: abstractcore[tools]>=2.13.11; extra == 'mcp-worker'
32
32
  Provides-Extra: multimodal
33
- Requires-Dist: abstractcore[audio,media,openai,vision,voice]>=2.13.10; extra == 'multimodal'
33
+ Requires-Dist: abstractcore[audio,media,openai,vision,voice]>=2.13.11; extra == 'multimodal'
34
34
  Provides-Extra: test
35
35
  Requires-Dist: pytest>=7.0.0; extra == 'test'
36
36
  Description-Content-Type: text/markdown
@@ -41,7 +41,7 @@ Description-Content-Type: text/markdown
41
41
 
42
42
  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.
43
43
 
44
- **Version:** 0.4.6 • **Python:** 3.10+
44
+ **Version:** 0.4.7 • **Python:** 3.10+
45
45
 
46
46
  **Status:** pre-1.0 (API may evolve). For production use, pin versions and follow `CHANGELOG.md`.
47
47
 
@@ -75,7 +75,7 @@ AbstractCore integration (LLM + tools):
75
75
  pip install "abstractruntime[abstractcore]"
76
76
  ```
77
77
 
78
- The `abstractcore` extra installs AbstractCore 2.13.10 or newer so the hardened server auth model, provider-key header routing, prompt-cache control plane, current tool catalog, unified multimodal generation response types, 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.
78
+ The `abstractcore` extra installs AbstractCore 2.13.11 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.
79
79
 
80
80
  MCP worker entrypoint (default toolsets over stdio):
81
81
 
@@ -124,7 +124,7 @@ state = rt.resume(
124
124
  assert state.status.value == "completed"
125
125
  ```
126
126
 
127
- ## What’s included (v0.4.6)
127
+ ## What’s included (v0.4.7)
128
128
 
129
129
  Kernel (dependency-light):
130
130
  - workflow graphs: `WorkflowSpec` (`src/abstractruntime/core/spec.py`)
@@ -4,7 +4,7 @@
4
4
 
5
5
  It is designed for long-running workflows that must survive restarts and explicitly model blocking (human input, timers, external events, subworkflows) without keeping Python stacks alive.
6
6
 
7
- **Version:** 0.4.6 • **Python:** 3.10+
7
+ **Version:** 0.4.7 • **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.10 or newer so the hardened server auth model, provider-key header routing, prompt-cache control plane, current tool catalog, unified multimodal generation response types, 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.11 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.
42
42
 
43
43
  MCP worker entrypoint (default toolsets over stdio):
44
44
 
@@ -87,7 +87,7 @@ state = rt.resume(
87
87
  assert state.status.value == "completed"
88
88
  ```
89
89
 
90
- ## What’s included (v0.4.6)
90
+ ## What’s included (v0.4.7)
91
91
 
92
92
  Kernel (dependency-light):
93
93
  - workflow graphs: `WorkflowSpec` (`src/abstractruntime/core/spec.py`)
@@ -1,7 +1,7 @@
1
1
  ## ADR 0002: Execution modes (local, remote, hybrid)
2
2
 
3
3
  ### Status
4
- Accepted (2025-12-11)
4
+ Accepted (2025-12-11); clarified 2026-05-08 by framework ADR-0033
5
5
 
6
6
  ### Context
7
7
  Agents/workflows must run in multiple deployment topologies:
@@ -20,6 +20,12 @@ AbstractRuntime supports three execution modes:
20
20
  - **Remote**: HTTP to AbstractCore server; tools default to passthrough (untrusted)
21
21
  - **Hybrid**: remote LLM + local tool execution
22
22
 
23
+ Remote AbstractCore server mode uses the Core server's own URL, auth token, base URL allowlists,
24
+ and provider-key override rules. It must not inherit Gateway bearer tokens or browser origin policy
25
+ implicitly. If Gateway is the caller, Gateway acts as an explicit Core-server client.
26
+ Gateway-specific env/config is consumed by Gateway and passed to Runtime through explicit run state,
27
+ effect payloads, client construction arguments, or Runtime-owned environment variables.
28
+
23
29
  ### Consequences
24
30
  - Thin-mode clients can run the workflow logic while delegating inference to a server.
25
31
  - Remote mode supports AbstractCore per-request `base_url` routing (dynamic endpoint selection).
@@ -28,5 +34,6 @@ AbstractRuntime supports three execution modes:
28
34
  ### See Also
29
35
  - Implementation: [`backlog/completed/005_abstractcore_integration.md`](../backlog/completed/005_abstractcore_integration.md)
30
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)
31
38
  - Code: `src/abstractruntime/integrations/abstractcore/factory.py`
32
-
39
+ - Framework ADR: `../../../docs/adr/0033-install-profiles-config-entrypoints-and-server-boundaries.md`
@@ -176,7 +176,7 @@ 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.10 or newer).
179
+ Requires: `pip install "abstractruntime[abstractcore]"` (AbstractCore 2.13.11 or newer).
180
180
 
181
181
  Implementation: `src/abstractruntime/integrations/abstractcore/*`.
182
182
 
@@ -198,12 +198,16 @@ Multimodal support:
198
198
  - 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
199
  - remote transcription requires one audio media item that resolves to a local file path or artifact-backed temporary file
200
200
  - generated image/voice/audio bytes require a runtime `ArtifactStore`; the result contains `artifact_id` / `artifact_ref` instead of inline bytes
201
+ - 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
201
202
 
202
203
  Prompt cache / cached sessions:
203
204
  - LLM clients expose cache control methods listed above for host-side preparation and inspection
204
- - `LLM_CALL.params.prompt_cache_key` selects a cache key for a call; runtime can also derive a session-scoped key from `run.vars["_runtime"]["prompt_cache"]`
205
+ - `LLM_CALL.params.prompt_cache_key` selects a cache key for a call; runtime can also derive a session-scoped key from `run.vars["_runtime"]["prompt_cache"]` or the Runtime-owned `ABSTRACTRUNTIME_PROMPT_CACHE` process default
205
206
  - provider cache/session handles are not durable runtime state and should not be stored in `RunState.vars`
206
207
 
208
+ Attachment registration limits:
209
+ - `TOOL_CALLS.payload.max_attachment_bytes`, `run.vars["_runtime"]["max_attachment_bytes"]`, or `ABSTRACTRUNTIME_MAX_ATTACHMENT_BYTES` bound the bytes Runtime stores when local `read_file` outputs are captured as session attachments
210
+
207
211
  Docs: `integrations/abstractcore.md`.
208
212
 
209
213
  ### AbstractMemory bridge (KG effects)
@@ -1,7 +1,7 @@
1
1
  # AbstractRuntime — Architecture
2
2
 
3
- > Updated: 2026-05-07
4
- > Version: 0.4.6
3
+ > Updated: 2026-05-08
4
+ > Version: 0.4.7
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.
@@ -37,6 +37,8 @@ The boundary is intentionally narrow:
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
39
  - 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
+ - Gateway and other hosts compose Runtime with the desired Core/capability/memory profile. Runtime's base package does not expose hardware profile extras such as `apple`, `gpu`, `all-apple`, or `all-gpu`; those cascade through AbstractCore when a host selects them.
41
+ - 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.
40
42
 
41
43
  This keeps the runtime usable by `../abstractgateway` and application layers such as `../abstractflow`, `../abstractassistant`, `../abstractobserver`, and `../abstractcode` without embedding provider-specific model logic in the durable kernel.
42
44
 
@@ -0,0 +1,163 @@
1
+ # Completed: Runtime Gateway Env Namespace Cleanup
2
+
3
+ ## Metadata
4
+ - Created: 2026-05-08
5
+ - Status: Completed
6
+ - Completed: 2026-05-08
7
+
8
+ ## Context
9
+
10
+ AbstractRuntime should remain a lower-level durable runner. Gateway may compose Runtime and pass
11
+ run-scoped defaults, policy, and deployment choices into Runtime, but Runtime should not learn
12
+ Gateway-specific environment variable names.
13
+
14
+ This matters for the two-entry-point design:
15
+
16
+ - developers may use Runtime/Core without Gateway;
17
+ - Gateway may deploy Runtime as one component in a larger server;
18
+ - config precedence should be explicit and testable;
19
+ - lower packages should not depend on higher-package env namespaces.
20
+
21
+ ## Current Code Reality
22
+
23
+ Runtime 0.4.7 largely carried out the install-boundary work:
24
+
25
+ - `pyproject.toml` now points Runtime AbstractCore extras at `abstractcore>=2.13.11`.
26
+ - Runtime does not expose `apple`, `gpu`, `all-apple`, or `all-gpu` extras.
27
+ - `tests/test_packaging_extras.py` verifies the Core floor and absence of fake hardware extras.
28
+ - `tests/test_runtime_install_boundary.py` verifies the package root/kernel import boundary.
29
+ - `tests/test_remote_llm_client.py` verifies remote AbstractCore clients do not inherit Gateway auth
30
+ or provider-key env vars.
31
+
32
+ Before this cleanup, Runtime still had Gateway namespace reads in implementation code:
33
+
34
+ - prompt cache auto-enable reads both `ABSTRACTRUNTIME_PROMPT_CACHE` and
35
+ `ABSTRACTGATEWAY_PROMPT_CACHE`;
36
+ - pending-media attachment limits read `ABSTRACTGATEWAY_MAX_ATTACHMENT_BYTES`.
37
+ - workflow bundle default registry resolution reads `ABSTRACTGATEWAY_FLOWS_DIR`.
38
+
39
+ Runtime also reads Runtime-owned or generic env vars such as
40
+ `ABSTRACTRUNTIME_GLOBAL_MEMORY_RUN_ID`, `ABSTRACTRUNTIME_MAX_INLINE_BYTES`, and
41
+ `ABSTRACT_WORKSPACE_BASE_DIR`. Those are not the problem; the problem is Runtime directly reading
42
+ Gateway-owned names.
43
+
44
+ ## Problem
45
+
46
+ The current behavior partially violates the desired config cascade:
47
+
48
+ 1. Gateway config/env should be consumed by Gateway.
49
+ 2. Gateway should pass Runtime-relevant values explicitly through run state, effect payloads,
50
+ constructor/config arguments, or a Runtime-owned env name.
51
+ 3. Runtime should not read `ABSTRACTGATEWAY_*` directly.
52
+
53
+ Leaving these reads in Runtime creates subtle deployment coupling:
54
+
55
+ - a standalone Runtime/Core process can change behavior because a Gateway env var happens to be set;
56
+ - Gateway cannot cleanly document its config precedence because Runtime also consumes some of it;
57
+ - tests currently cover auth/key leakage but not non-auth Gateway env leakage;
58
+ - future Gateway settings may be copied into Runtime ad hoc instead of using explicit handoff.
59
+
60
+ ## What We Want To Do
61
+
62
+ Remove Gateway-specific env reads from Runtime and make the handoff explicit.
63
+
64
+ Prompt cache:
65
+
66
+ - keep `_runtime.prompt_cache` as the preferred run-scoped control plane;
67
+ - allow a Runtime-owned process default such as `ABSTRACTRUNTIME_PROMPT_CACHE`;
68
+ - Gateway should read `ABSTRACTGATEWAY_PROMPT_CACHE` itself and write `_runtime.prompt_cache` when
69
+ it wants prompt cache enabled for a run/session.
70
+
71
+ Attachment/media limits:
72
+
73
+ - add an explicit Runtime-side control such as `_runtime.max_attachment_bytes`, effect payload
74
+ `max_attachment_bytes`, or a small typed attachment policy object;
75
+ - allow a Runtime-owned process default such as `ABSTRACTRUNTIME_MAX_ATTACHMENT_BYTES` if a process
76
+ env fallback is still needed;
77
+ - Gateway should read `ABSTRACTGATEWAY_MAX_ATTACHMENT_BYTES` itself and pass the effective limit to
78
+ Runtime explicitly.
79
+
80
+ ## Requirements
81
+
82
+ - Runtime must not read `ABSTRACTGATEWAY_*` env vars.
83
+ - Runtime may keep `ABSTRACTRUNTIME_*` env vars for Runtime-owned process defaults.
84
+ - Gateway-provided values must travel through explicit run state, effect payloads, Runtime config, or
85
+ constructor arguments.
86
+ - Existing `_runtime.prompt_cache` behavior should remain supported.
87
+ - Add regression tests proving Gateway env vars alone do not change Runtime behavior.
88
+ - Add tests proving explicit Runtime controls still work.
89
+ - Any compatibility fallback for old Gateway env names must be temporary, documented with
90
+ `#FALLBACK`, and preferably implemented in Gateway instead of Runtime.
91
+
92
+ ## Suggested Implementation
93
+
94
+ 1. Update `_maybe_inject_prompt_cache_key(...)` to remove the
95
+ `ABSTRACTGATEWAY_PROMPT_CACHE` branch.
96
+ 2. Update the pending-media attachment byte limit resolver to prefer explicit Runtime state/payload
97
+ and then `ABSTRACTRUNTIME_MAX_ATTACHMENT_BYTES`; remove `ABSTRACTGATEWAY_MAX_ATTACHMENT_BYTES`.
98
+ 3. Add focused tests in `tests/test_remote_llm_client.py` or a new effect-handler test module:
99
+ - setting `ABSTRACTGATEWAY_PROMPT_CACHE=1` alone does not inject a prompt cache key;
100
+ - setting `_runtime.prompt_cache=True` does inject a prompt cache key when session/provider/model
101
+ are present;
102
+ - setting `ABSTRACTGATEWAY_MAX_ATTACHMENT_BYTES` alone does not alter Runtime attachment limits;
103
+ - the chosen explicit Runtime limit path does alter Runtime attachment limits.
104
+ 4. Update Runtime docs that mention prompt cache or attachment limits.
105
+ 5. Update the Gateway backlog/implementation to translate Gateway config/env into Runtime handoff
106
+ values instead of relying on Runtime to read Gateway env names.
107
+
108
+ ## Implementation Notes
109
+
110
+ Runtime 0.4.7 applies this cleanup directly:
111
+
112
+ - `_maybe_inject_prompt_cache_key(...)` no longer reads `ABSTRACTGATEWAY_PROMPT_CACHE`.
113
+ - Prompt cache auto-keying still supports explicit `LLM_CALL.params.prompt_cache_key`,
114
+ `_runtime.prompt_cache`, and Runtime-owned `ABSTRACTRUNTIME_PROMPT_CACHE`.
115
+ - Read-file session attachment registration now resolves byte limits from
116
+ `TOOL_CALLS.payload.max_attachment_bytes`, `_runtime.max_attachment_bytes`,
117
+ `ABSTRACTRUNTIME_MAX_ATTACHMENT_BYTES`, then the default 25 MiB.
118
+ - `default_workflow_bundles_dir()` no longer reads `ABSTRACTGATEWAY_FLOWS_DIR`; Gateway should pass
119
+ `bundles_dir` explicitly or translate to `ABSTRACTFRAMEWORK_WORKFLOWS_DIR`.
120
+ - Regression tests cover prompt-cache env isolation, attachment-limit env isolation, explicit
121
+ Runtime namespace and effect payload attachment limits, and workflow bundle registry env
122
+ isolation.
123
+
124
+ ## Scope
125
+
126
+ Included:
127
+
128
+ - Runtime AbstractCore effect-handler config lookup cleanup.
129
+ - Runtime tests for env namespace isolation.
130
+ - Runtime docs/backlog notes required to preserve the boundary.
131
+
132
+ Excluded:
133
+
134
+ - Gateway config implementation.
135
+ - Gateway package extras.
136
+ - Gateway server route behavior.
137
+ - Provider/model/auth decisions, which are already separately covered by existing tests.
138
+
139
+ ## Promotion Criteria
140
+
141
+ Promote this before declaring Runtime fully clean for a production Gateway release if either of
142
+ these is true:
143
+
144
+ - Gateway still relies on `ABSTRACTGATEWAY_PROMPT_CACHE` or `ABSTRACTGATEWAY_MAX_ATTACHMENT_BYTES`
145
+ being read by Runtime;
146
+ - Runtime is being released as the official Gateway-aligned baseline.
147
+
148
+ If Gateway is updated first to pass explicit Runtime state and no production deployment relies on the
149
+ old env reads, this can be implemented as a small cleanup immediately after Gateway config lands.
150
+
151
+ ## Validation
152
+
153
+ - [x] `python -m pytest tests/test_runtime_install_boundary.py tests/test_packaging_extras.py`
154
+ - [x] focused prompt-cache/env isolation tests;
155
+ - [x] focused attachment-limit/env isolation tests;
156
+ - [x] `rg -n "ABSTRACTGATEWAY" src tests docs` should show no Runtime implementation reads, except
157
+ tests that assert the env name is ignored and docs/backlog references explaining the cleanup.
158
+
159
+ ## Guidance For The Implementing Agent
160
+
161
+ Re-check current Gateway behavior before deleting compatibility assumptions. The clean target is not
162
+ "no env vars"; it is "Runtime owns Runtime env vars, Gateway owns Gateway env vars, and Gateway
163
+ passes Runtime-relevant values explicitly."
@@ -0,0 +1,117 @@
1
+ # Proposed: Runtime Gateway Install Boundary
2
+
3
+ ## Metadata
4
+ - Created: 2026-05-08
5
+ - Status: Completed
6
+ - Completed: 2026-05-08
7
+
8
+ ## Context
9
+
10
+ AbstractRuntime is the durable graph runner. It persists runs, effects, waits, ledgers, artifacts,
11
+ snapshots, and resume behavior. It should remain stable and dependency-light even when Gateway
12
+ deployments pull in Core, agents, media, memory, tools, and provider SDKs.
13
+
14
+ ## Current Code Reality
15
+
16
+ - Runtime base depends on `abstractsemantics>=0.0.2`.
17
+ - AbstractCore integration is explicit through `abstractruntime[abstractcore]`.
18
+ - Multimodal helper dependencies are explicit through `abstractruntime[multimodal]`.
19
+ - Runtime does not directly depend on AbstractMemory; memory effects are integration/host-wired.
20
+ - Runtime config contains run-level defaults and limits, not deployment auth or provider secrets.
21
+ - As of the AbstractCore `2.13.11` release, Core exposes the canonical install-profile aliases
22
+ `abstractcore[apple]`, `abstractcore[gpu]`, `abstractcore[all-apple]`, and
23
+ `abstractcore[all-gpu]`, plus the released Voice/Vision catalog-capable floors
24
+ `abstractvoice>=0.9.1` and `abstractvision>=0.3.2`.
25
+ - Runtime's package metadata now points its AbstractCore extras at `abstractcore>=2.13.11`
26
+ for Gateway deployment alignment.
27
+
28
+ ## Problem
29
+
30
+ The desire for cascading Gateway installs can accidentally push Core/Vision/Voice/Memory/local
31
+ engine dependencies down into Runtime. That would weaken the clean boundary:
32
+
33
+ - Runtime should be able to execute non-LLM workflows without Core.
34
+ - Runtime should not own provider configuration.
35
+ - Runtime should not import Vision, Voice, Music, or Memory in its kernel.
36
+ - Runtime should persist artifact refs and JSON-safe results, not model/provider clients.
37
+
38
+ ## Proposed Direction
39
+
40
+ Keep Runtime base minimal.
41
+
42
+ Profile guidance:
43
+
44
+ - `abstractruntime`: durable kernel plus Semantics schema refs.
45
+ - `abstractruntime[abstractcore]`: LLM/tool integration, with a floor of
46
+ `abstractcore>=2.13.11` so Gateway receives the current Core server-auth, provider-key,
47
+ generated-media, and capability-catalog contracts.
48
+ - `abstractruntime[multimodal]`: Core media/capability helpers for generated images, voice/audio,
49
+ and media inputs, also with `abstractcore>=2.13.11`.
50
+ - Do not add `apple`, `gpu`, `all-apple`, or `all-gpu` to Runtime unless Runtime itself owns a
51
+ hardware-specific dependency, which it currently does not.
52
+
53
+ Gateway should compose Runtime with the selected Core/capability/memory profile. The cascade belongs
54
+ to Gateway, not Runtime.
55
+
56
+ ## Gateway Configuration Handoff Rules
57
+
58
+ Runtime should stay explicit about configuration handoff:
59
+
60
+ - Gateway may pass run defaults in JSON-safe run state, such as `run.vars["_runtime"]["provider"]`
61
+ and `run.vars["_runtime"]["model"]`.
62
+ - Gateway may pass effect-level overrides in LLM/media effect payloads when workflow pins or request
63
+ values require them.
64
+ - Gateway may construct local/remote/hybrid AbstractCore clients with explicit Core server URL,
65
+ Core server auth headers, provider/model defaults, tool executor, retry policy, and artifact
66
+ store.
67
+ - Runtime should not read `ABSTRACTGATEWAY_*` env vars directly; Gateway-owned config must be
68
+ translated into explicit Runtime inputs or Runtime-owned env names.
69
+ - Runtime should not reinterpret Gateway auth tokens as Core server auth tokens or provider keys.
70
+ - Runtime should keep persisted run state JSON-safe: provider names, model ids, policy flags, and
71
+ artifact refs are fine; provider clients, auth objects, downloaded model handles, and server
72
+ sessions are not.
73
+
74
+ ## Implementation Notes
75
+
76
+ Runtime was touched only for release-alignment and boundary validation.
77
+
78
+ What changed in Runtime 0.4.7:
79
+
80
+ - `abstractruntime[abstractcore]`, `abstractruntime[multimodal]`, and
81
+ `abstractruntime[mcp-worker]` now require `abstractcore>=2.13.11`.
82
+ - Runtime still exposes no `apple`, `gpu`, `all-apple`, or `all-gpu` extras.
83
+ - The AbstractCore integration version guard now fails fast on stale Core installs older than
84
+ 2.13.11.
85
+ - Runtime no longer reads Gateway-owned environment variables for prompt-cache defaults,
86
+ attachment registration limits, or workflow bundle registry paths.
87
+ - Tests now cover the optional-stack import boundary, package metadata floor, missing hardware
88
+ profile extras, Gateway env namespace isolation, and the rule that Gateway auth/provider-key
89
+ environment variables are not inherited by remote AbstractCore clients.
90
+
91
+ Related package guidance remains:
92
+
93
+ - Gateway should keep Runtime base as the dependency for minimal installs.
94
+ - Gateway server profiles may choose `AbstractRuntime[multimodal]`.
95
+ - Gateway Apple/GPU profiles should cascade through Core profile names such as
96
+ `abstractcore[all-apple]` or `abstractcore[all-gpu]`; Runtime should remain unchanged.
97
+ - Root `abstractframework` should update Runtime version floors to match the current Gateway/Core
98
+ integration baseline.
99
+ - AbstractAgent should tighten its Runtime dependency floor.
100
+
101
+ ## Promotion Criteria
102
+
103
+ Promoted because the Runtime release needed package metadata alignment, clearer install-boundary
104
+ docs, and regression tests for the Gateway handoff.
105
+
106
+ ## Validation
107
+
108
+ - [x] Subprocess import test for `abstractruntime` with Core/Vision/Voice/Memory/Music blocked.
109
+ - [x] Fresh venv import test for `abstractruntime` without AbstractCore installed.
110
+ - [x] Fresh venv import test for `abstractruntime[abstractcore]`.
111
+ - [x] Runtime LLM/media integration tests gated behind extras.
112
+ - [x] Static import checks that Runtime kernel modules do not import Core, Vision, Voice, Memory, or
113
+ Music.
114
+ - [x] Package metadata test proving Runtime exposes no fake `apple`, `gpu`, `all-apple`, or `all-gpu`
115
+ extras.
116
+ - [x] Package metadata test proving `abstractruntime[abstractcore]` and `abstractruntime[multimodal]`
117
+ depend on `abstractcore>=2.13.11`.
@@ -107,7 +107,9 @@ No. AbstractRuntime provides the durable graph runner, checkpoint/ledger model,
107
107
 
108
108
  ## Where should cached session or prompt-cache state live?
109
109
 
110
- Store stable cache keys or cache configuration in runtime-visible JSON, for example `payload.params.prompt_cache_key` or `run.vars["_runtime"]["prompt_cache"]`. Do not store provider session objects, cache handles, clients, or warm-cache state in `RunState.vars`. AbstractCore clients/servers own those objects, and runtime correctness should still hold when a cache is cold.
110
+ Store stable cache keys or cache configuration in runtime-visible JSON, for example `payload.params.prompt_cache_key` or `run.vars["_runtime"]["prompt_cache"]`. A Runtime process can also opt in with `ABSTRACTRUNTIME_PROMPT_CACHE`. Do not store provider session objects, cache handles, clients, or warm-cache state in `RunState.vars`. AbstractCore clients/servers own those objects, and runtime correctness should still hold when a cache is cold.
111
+
112
+ Gateway-specific prompt-cache environment variables should be consumed by Gateway and passed to Runtime explicitly; Runtime does not read the Gateway env namespace directly.
111
113
 
112
114
  Hosts can inspect or prepare caches through the configured `_abstractcore_llm_client` control-plane methods (`get_prompt_cache_capabilities`, `prompt_cache_prepare_modules`, and related methods).
113
115
  Docs: `integrations/abstractcore.md`. Code: `src/abstractruntime/integrations/abstractcore/llm_client.py`.
@@ -18,7 +18,7 @@ Optional (LLM + tools via AbstractCore):
18
18
  pip install "abstractruntime[abstractcore]"
19
19
  ```
20
20
 
21
- This installs AbstractCore 2.13.10 or newer, which matches the documented server auth, provider-key header routing, prompt-cache control plane, current tool behavior, unified multimodal generation response types, public output-selector contract, and async/sync text-generation output-selector parity. Use `abstractruntime[multimodal]` when your workflows need common media, vision, voice, or audio dependencies.
21
+ This installs AbstractCore 2.13.11 or newer, which matches the documented server auth, provider-key header routing, generated-media contracts, capability catalog, prompt-cache control plane, current tool behavior, public output-selector contract, and async/sync text-generation output-selector parity. Use `abstractruntime[multimodal]` when your workflows need common media, vision, voice, or audio dependencies.
22
22
 
23
23
  ## Mental model (source of truth)
24
24
 
@@ -16,7 +16,7 @@ Implementation pointers (this repo):
16
16
  pip install "abstractruntime[abstractcore]"
17
17
  ```
18
18
 
19
- This extra installs AbstractCore 2.13.10 or newer. That is the supported baseline for the current server auth split (`Authorization` for server auth, `X-AbstractCore-Provider-API-Key` for provider overrides), prompt-cache control-plane endpoints, current tool catalog, the unified multimodal `generate(..., output=...)` response types, AbstractCore's public output-selector contract, and async/sync text-generation output-selector parity.
19
+ This extra installs AbstractCore 2.13.11 or newer. That is the supported baseline for the current server auth split (`Authorization` for server auth, `X-AbstractCore-Provider-API-Key` for provider overrides), generated-media contracts, capability catalog, prompt-cache control-plane endpoints, current tool catalog, AbstractCore's public output-selector contract, and async/sync text-generation output-selector parity.
20
20
 
21
21
  For AbstractCore's multimodal `generate(..., output=...)` path, use the newer baseline and optional media packages:
22
22
 
@@ -24,7 +24,7 @@ For AbstractCore's multimodal `generate(..., output=...)` path, use the newer ba
24
24
  pip install "abstractruntime[multimodal]"
25
25
  ```
26
26
 
27
- This installs `abstractcore[media,openai,vision,voice,audio]>=2.13.10`. Local image/voice generation still depends on the configured AbstractCore capability backends (for example AbstractVision and AbstractVoice, or OpenAI/OpenAI-compatible remote engines).
27
+ This installs `abstractcore[media,openai,vision,voice,audio]>=2.13.11`. Local image/voice generation still depends on the configured AbstractCore capability backends (for example AbstractVision and AbstractVoice, or OpenAI/OpenAI-compatible remote engines).
28
28
 
29
29
  The MCP worker entrypoint uses the `mcp-worker` extra:
30
30
 
@@ -44,6 +44,8 @@ Factory functions (exported from `abstractruntime.integrations.abstractcore`):
44
44
  - `create_remote_runtime(...)`
45
45
  - `create_hybrid_runtime(...)`
46
46
 
47
+ Runtime stays explicit at the boundary: Gateway/hosts construct these clients with the Core server URL, Core server auth headers, provider/model defaults, retry policy, tool executor, and artifact store they intend to use. Runtime does not read `ABSTRACTGATEWAY_*` environment variables directly and does not reinterpret Gateway bearer tokens as Core server tokens or provider keys. Gateway-owned config should be consumed by Gateway, then passed to Runtime through explicit run state, effect payloads, constructor arguments, or Runtime-owned environment variables.
48
+
47
49
  ## Minimal LLM workflow
48
50
 
49
51
  ```python
@@ -111,6 +113,7 @@ Notes:
111
113
  - `media` accepts one item or a list. Durable artifact refs such as `{"$artifact": "...", "filename": "speech.wav"}` are materialized to temporary files for AbstractCore and never stored as raw bytes in `RunState`.
112
114
  - `output` may be top-level or inside `params`; top-level `outputs` is accepted as a runtime alias for AbstractCore's `output`.
113
115
  - `output.tags`, when present, are merged into the generated artifact metadata. Runtime metadata such as `run_id` and `tags` is used by AbstractRuntime's ArtifactStore boundary and is not forwarded as provider-specific generation kwargs.
116
+ - Host-supplied run defaults such as `run.vars["_runtime"]["provider"]` and `run.vars["_runtime"]["model"]` are persisted as JSON-safe routing metadata; provider clients, auth objects, downloaded model handles, and server sessions are not durable runtime state.
114
117
 
115
118
  ## Multimodal generation
116
119
 
@@ -282,6 +285,7 @@ Contract notes:
282
285
  - When a provider reports `mode=local_control_plane` (for example MLX, or GGUF models whose llama.cpp chat format has an exact cached renderer), the runtime can maintain a compartmentalized `system | tools | history` cache path automatically.
283
286
  - When a provider reports `mode=keyed`, the runtime still forwards stable `prompt_cache_key`s but skips module preparation/fork/update orchestration.
284
287
  - This surface is intentionally host-oriented; the runtime effect handlers still only use prompt caching during LLM execution, but gateway/CLI hosts can now manage prompt caches without reaching through to provider internals.
288
+ - Automatic per-session prompt-cache keys are enabled by `run.vars["_runtime"]["prompt_cache"]`, `LLM_CALL.params.prompt_cache_key`, or the Runtime-owned `ABSTRACTRUNTIME_PROMPT_CACHE` process default. Gateway-specific prompt-cache env vars should be translated by Gateway into `_runtime.prompt_cache`.
285
289
 
286
290
  Host-side prompt-cache example:
287
291
 
@@ -300,6 +304,17 @@ if caps.get("capabilities", {}).get("supports_prepare_modules"):
300
304
  )
301
305
  ```
302
306
 
307
+ ## Attachment registration limits
308
+
309
+ When local `read_file` tool outputs are captured as session attachments, Runtime bounds the file bytes it stores. The limit is resolved in this order:
310
+
311
+ - `TOOL_CALLS.payload.max_attachment_bytes`
312
+ - `run.vars["_runtime"]["max_attachment_bytes"]`
313
+ - `ABSTRACTRUNTIME_MAX_ATTACHMENT_BYTES`
314
+ - the default of 25 MiB
315
+
316
+ Gateway-specific attachment env vars should be translated by Gateway into one of the explicit Runtime inputs above.
317
+
303
318
  ## Default toolsets (incl. comms)
304
319
 
305
320
  `default_tools.get_default_toolsets()` provides a host-side convenience catalog of common tools:
@@ -62,7 +62,7 @@ Returns a structured dict for UI/status display. (`src/abstractruntime/core/runt
62
62
 
63
63
  Returns a list of `LimitWarning` objects for limits approaching/exceeded. (`src/abstractruntime/core/models.py`, `src/abstractruntime/core/runtime.py`)
64
64
 
65
- As of v0.4.6, warnings are computed for:
65
+ As of v0.4.7, warnings are computed for:
66
66
  - `iterations` (`current_iteration` vs `max_iterations`)
67
67
  - `tokens` (`estimated_tokens_used` vs `max_tokens`)
68
68
 
@@ -79,7 +79,7 @@ AbstractRuntime stays dependency-light at the kernel level; concrete integration
79
79
 
80
80
  ## Status (implemented in this repository)
81
81
 
82
- As of v0.4.6:
82
+ As of v0.4.7:
83
83
  - durable kernel: `RunState`, `WaitState`, `Runtime.start/tick/resume`
84
84
  - built-in waits + events: `WAIT_EVENT`, `WAIT_UNTIL`, `ASK_USER`, `EMIT_EVENT`
85
85
  - persistence backends: in-memory, JSON/JSONL, SQLite
@@ -8,7 +8,7 @@ Implementation pointers:
8
8
  - model fields: `src/abstractruntime/core/models.py` (`StepRecord.prev_hash`, `StepRecord.record_hash`, `StepRecord.signature`)
9
9
  - hash-chain decorator + verifier: `src/abstractruntime/storage/ledger_chain.py`
10
10
 
11
- ## What is implemented (v0.4.6)
11
+ ## What is implemented (v0.4.7)
12
12
 
13
13
  - `HashChainedLedgerStore(inner_store)` — wraps any `LedgerStore` to compute hashes on append
14
14
  - `verify_ledger_chain(records)` — validates the chain and returns a verification report
@@ -58,6 +58,8 @@ print([ep.flow_id for ep in b.manifest.entrypoints])
58
58
  - default directory resolution: `default_workflow_bundles_dir()` (`src/abstractruntime/workflow_bundle/registry.py`)
59
59
  - resolve `bundle_id[@version]` and entrypoints (`resolve_bundle`, `resolve_entrypoint`)
60
60
 
61
+ Default directory resolution checks `ABSTRACTFRAMEWORK_WORKFLOWS_DIR`, then AbstractFlow authoring env names, then `./flows/bundles/`, then `~/.abstractframework/workflows/`. Hosts with Gateway-specific flow settings should pass `bundles_dir` explicitly or translate them to the shared framework env name before constructing the registry.
62
+
61
63
  ## VisualFlow multi-entry fan-in
62
64
 
63
65
  Visual authoring tools may connect more than one execution edge into the same target `exec-in` pin. For example, a first prompt can enter a node from `on_flow_start`, while a later loop can re-enter the same node with a different prompt produced by the previous turn.
@@ -10,11 +10,12 @@ This file is an **agent-oriented build guide** for the AbstractRuntime *library*
10
10
 
11
11
  Quick facts:
12
12
  - Python: 3.10+ (`pyproject.toml`)
13
- - Version: 0.4.6
13
+ - Version: 0.4.7
14
14
  - Ecosystem: [AbstractFramework](https://github.com/lpalbou/AbstractFramework) umbrella; pairs with [AbstractCore](https://github.com/lpalbou/abstractcore)
15
15
  - Public export surface (source of truth): `src/abstractruntime/__init__.py`
16
- - Optional AbstractCore baseline: `abstractruntime[abstractcore]` installs `abstractcore>=2.13.10`
17
- - Multimodal extra: `abstractruntime[multimodal]` installs `abstractcore[media,openai,vision,voice,audio]>=2.13.10`
16
+ - Optional AbstractCore baseline: `abstractruntime[abstractcore]` installs `abstractcore>=2.13.11`
17
+ - Multimodal extra: `abstractruntime[multimodal]` installs `abstractcore[media,openai,vision,voice,audio]>=2.13.11`
18
+ - Config boundary: Runtime does not read `ABSTRACTGATEWAY_*`; Gateway-owned env/config should be translated into explicit Runtime inputs or Runtime-owned env names.
18
19
 
19
20
  ```mermaid
20
21
  flowchart LR
@@ -219,9 +220,11 @@ Notes:
219
220
  - Tool calls and results are durable (ledger + checkpoints). Keep secrets out of tool arguments.
220
221
  - Use `ApprovalToolExecutor(delegate=..., policy=ToolApprovalPolicy())` when a local host should auto-run safe tools but pause for user approval before write/command/unknown tools.
221
222
  - Remote `params.api_key` and `params.provider_api_key` are compatibility inputs; runtime converts them to `X-AbstractCore-Provider-API-Key` headers for current AbstractCore servers.
223
+ - Gateway/hosts choose Core server URLs, Core server auth headers, provider/model defaults, tool executors, artifact stores, and any Gateway env/config translation before Runtime sees the call.
222
224
  - Hosts can access the configured LLM client via the factory-set `_abstractcore_llm_client` attribute for prompt-cache operations such as `get_prompt_cache_capabilities()` and `prompt_cache_prepare_modules(...)`.
223
225
  - Use `pip install "abstractruntime[multimodal]"` for common AbstractCore media, vision, voice, and audio dependencies.
224
226
  - Optional comms tools (email/WhatsApp/Telegram) are gated by env vars; see `docs/tools-comms.md` and code `src/abstractruntime/integrations/abstractcore/default_tools.py`.
227
+ - Read-file session attachment registration is bounded by `TOOL_CALLS.payload.max_attachment_bytes`, `run.vars["_runtime"]["max_attachment_bytes"]`, `ABSTRACTRUNTIME_MAX_ATTACHMENT_BYTES`, then the 25 MiB default.
225
228
 
226
229
  Minimal approval executor wiring:
227
230
 
@@ -307,7 +310,8 @@ Remote multimodal guardrails:
307
310
  - provider-request metadata redacts data URLs before persistence so ledger/checkpoints do not embed media bytes
308
311
 
309
312
  Cached sessions / prompt cache:
310
- - Prefer stable `params.prompt_cache_key` values or `run.vars["_runtime"]["prompt_cache"]` config to select cache namespaces.
313
+ - Prefer stable `params.prompt_cache_key` values or `run.vars["_runtime"]["prompt_cache"]` config to select cache namespaces; Runtime-owned `ABSTRACTRUNTIME_PROMPT_CACHE` is the process-wide opt-in.
314
+ - Gateway prompt-cache env vars should be consumed by Gateway and translated into `_runtime.prompt_cache`; Runtime does not read Gateway env names directly.
311
315
  - Keep provider cache handles, session objects, and warm-cache state inside AbstractCore clients or servers.
312
316
  - Runtime correctness must not depend on a warm cache; a cold cache may be slower but should produce the same durable graph behavior.
313
317
  - Use `_abstractcore_llm_client` only as a host-side control-plane escape hatch for cache inspection/preparation, not as data stored in `RunState.vars`.