AbstractRuntime 0.13.1__tar.gz → 0.15.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (858) hide show
  1. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/CHANGELOG.md +127 -0
  2. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/PKG-INFO +30 -3
  3. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/README.md +28 -1
  4. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/README.md +3 -1
  5. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/adr/0008_integration_facades_are_the_complete_host_surface.md +6 -0
  6. abstractruntime-0.15.0/docs/adr/0010_one_replay_many_views.md +104 -0
  7. abstractruntime-0.15.0/docs/adr/0011_memory_facade_is_the_complete_host_surface_for_abstractmemory.md +131 -0
  8. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/adr/README.md +5 -1
  9. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/api.md +48 -1
  10. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/README.md +6 -2
  11. abstractruntime-0.15.0/docs/backlog/completed/0855_prefix_stability_contract_of_consecutive_llm_calls.md +36 -0
  12. abstractruntime-0.15.0/docs/backlog/completed/0856_memory_facade_and_ledger_provenance.md +167 -0
  13. abstractruntime-0.15.0/docs/backlog/planned/0853_session_tool_policy_before_the_approval_wait.md +59 -0
  14. abstractruntime-0.15.0/docs/backlog/planned/0854_replay_view.md +576 -0
  15. abstractruntime-0.15.0/docs/backlog/planned/0857_entity_direct_memory_writes_provenance.md +38 -0
  16. abstractruntime-0.15.0/docs/integrations/abstractmemory.md +195 -0
  17. abstractruntime-0.15.0/docs/replay.md +113 -0
  18. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/tool-approval.md +58 -0
  19. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/llms-full.txt +464 -4
  20. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/llms.txt +4 -2
  21. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/pyproject.toml +5 -2
  22. abstractruntime-0.15.0/release-notes.md +54 -0
  23. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/scripts/generate_llms_full.py +2 -0
  24. abstractruntime-0.15.0/scripts/regen_replay_conformance.py +73 -0
  25. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/core/models.py +4 -0
  26. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/core/runtime.py +148 -8
  27. abstractruntime-0.15.0/src/abstractruntime/core/step_context.py +107 -0
  28. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/identity/diary.py +9 -2
  29. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +196 -8
  30. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractmemory/__init__.py +3 -0
  31. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +256 -4
  32. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractmemory/identity_support.py +13 -0
  33. abstractruntime-0.15.0/src/abstractruntime/integrations/abstractmemory/memory_facade.py +755 -0
  34. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractmemory/seam_handlers.py +16 -0
  35. abstractruntime-0.15.0/src/abstractruntime/replay/__init__.py +30 -0
  36. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/__init__.py +51 -0
  37. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/a2_delegated_approval_completed/expected_view.json +842 -0
  38. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/a2_delegated_approval_completed/manifest.json +38 -0
  39. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/a2_delegated_approval_completed/records.json +2962 -0
  40. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/a2_delegated_approval_completed/runs.json +294 -0
  41. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/a_delegated_child_approval/expected_view.json +537 -0
  42. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/a_delegated_child_approval/manifest.json +34 -0
  43. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/a_delegated_child_approval/records.json +1052 -0
  44. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/a_delegated_child_approval/runs.json +149 -0
  45. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/b_timer_without_resume/expected_view.json +151 -0
  46. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/b_timer_without_resume/manifest.json +22 -0
  47. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/b_timer_without_resume/records.json +186 -0
  48. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/b_timer_without_resume/runs.json +26 -0
  49. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/c_parallel_tool_batch/expected_view.json +451 -0
  50. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/c_parallel_tool_batch/manifest.json +38 -0
  51. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/c_parallel_tool_batch/records.json +1171 -0
  52. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/c_parallel_tool_batch/runs.json +170 -0
  53. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/d_cancellation/expected_view.json +252 -0
  54. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/d_cancellation/manifest.json +32 -0
  55. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/d_cancellation/records.json +672 -0
  56. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/d_cancellation/runs.json +63 -0
  57. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/e2_structured_repeated_node/expected_view.json +521 -0
  58. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/e2_structured_repeated_node/manifest.json +28 -0
  59. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/e2_structured_repeated_node/records.json +1512 -0
  60. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/e2_structured_repeated_node/runs.json +162 -0
  61. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/e_structured_output_agents/expected_view.json +320 -0
  62. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/e_structured_output_agents/manifest.json +38 -0
  63. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/e_structured_output_agents/records.json +955 -0
  64. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/e_structured_output_agents/runs.json +132 -0
  65. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/f_windowed_slim/expected_view.json +293 -0
  66. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/f_windowed_slim/manifest.json +28 -0
  67. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/f_windowed_slim/records.json +194 -0
  68. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/f_windowed_slim/runs.json +131 -0
  69. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/g_ask_user/expected_view.json +248 -0
  70. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/g_ask_user/manifest.json +20 -0
  71. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/g_ask_user/records.json +428 -0
  72. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/g_ask_user/runs.json +134 -0
  73. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/h_denied_approval/expected_view.json +297 -0
  74. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/h_denied_approval/manifest.json +26 -0
  75. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/h_denied_approval/records.json +886 -0
  76. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/h_denied_approval/runs.json +155 -0
  77. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/i_wait_kinds/expected_view.json +498 -0
  78. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/i_wait_kinds/manifest.json +7 -0
  79. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/i_wait_kinds/records.json +487 -0
  80. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/i_wait_kinds/runs.json +124 -0
  81. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/j_event_answered_then_pause/expected_view.json +199 -0
  82. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/j_event_answered_then_pause/manifest.json +7 -0
  83. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/j_event_answered_then_pause/records.json +211 -0
  84. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/j_event_answered_then_pause/runs.json +31 -0
  85. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/k_nested_delegation/expected_view.json +267 -0
  86. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/k_nested_delegation/manifest.json +7 -0
  87. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/k_nested_delegation/records.json +404 -0
  88. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/k_nested_delegation/runs.json +72 -0
  89. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/l_answer_then_completion/expected_view.json +174 -0
  90. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/l_answer_then_completion/manifest.json +7 -0
  91. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/l_answer_then_completion/records.json +141 -0
  92. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/l_answer_then_completion/runs.json +22 -0
  93. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/m_session_tool_policy/expected_view.json +444 -0
  94. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/m_session_tool_policy/manifest.json +7 -0
  95. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/m_session_tool_policy/records.json +672 -0
  96. abstractruntime-0.15.0/src/abstractruntime/replay/conformance/m_session_tool_policy/runs.json +34 -0
  97. abstractruntime-0.15.0/src/abstractruntime/replay/delta.py +136 -0
  98. abstractruntime-0.15.0/src/abstractruntime/replay/executions.py +125 -0
  99. abstractruntime-0.15.0/src/abstractruntime/replay/view.py +1332 -0
  100. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/storage/__init__.py +10 -0
  101. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/storage/base.py +133 -3
  102. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/storage/in_memory.py +6 -2
  103. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/storage/json_files.py +497 -8
  104. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/storage/ledger_chain.py +20 -5
  105. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/storage/ledger_slim.py +53 -0
  106. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/storage/observable.py +17 -3
  107. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/storage/offloading.py +27 -2
  108. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/storage/serialize.py +18 -1
  109. abstractruntime-0.15.0/src/abstractruntime/storage/session_tool_policy.py +443 -0
  110. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/storage/sqlite.py +118 -17
  111. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +54 -0
  112. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/compiler.py +24 -0
  113. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/visual/executor.py +12 -0
  114. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_durable_write_discipline.py +2 -1
  115. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_jsonl_ledger_recovery.py +6 -2
  116. abstractruntime-0.15.0/tests/test_jsonl_ledger_seq_cross_process.py +88 -0
  117. abstractruntime-0.15.0/tests/test_jsonl_row_index.py +228 -0
  118. abstractruntime-0.15.0/tests/test_ledger_cursor_invariants.py +318 -0
  119. abstractruntime-0.15.0/tests/test_ledger_get_record.py +210 -0
  120. abstractruntime-0.15.0/tests/test_llm_call_prefix_stability_contract.py +179 -0
  121. abstractruntime-0.15.0/tests/test_memory_facade.py +555 -0
  122. abstractruntime-0.15.0/tests/test_memory_revise.py +376 -0
  123. abstractruntime-0.15.0/tests/test_memory_step_provenance.py +270 -0
  124. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_packaging_extras.py +1 -1
  125. abstractruntime-0.15.0/tests/test_replay_conformance.py +373 -0
  126. abstractruntime-0.15.0/tests/test_replay_conformance_package.py +25 -0
  127. abstractruntime-0.15.0/tests/test_replay_cursor_token.py +41 -0
  128. abstractruntime-0.15.0/tests/test_replay_delta_cost.py +48 -0
  129. abstractruntime-0.15.0/tests/test_replay_invariants.py +210 -0
  130. abstractruntime-0.15.0/tests/test_replay_review_findings.py +96 -0
  131. abstractruntime-0.15.0/tests/test_replay_tool_policy.py +88 -0
  132. abstractruntime-0.15.0/tests/test_session_tool_policy.py +376 -0
  133. abstractruntime-0.15.0/tests/test_step_context.py +229 -0
  134. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_trigger_webhook.py +4 -2
  135. abstractruntime-0.13.1/release-notes.md +0 -4
  136. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/.github/workflows/ci.yml +0 -0
  137. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/.github/workflows/release.yml +0 -0
  138. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/.gitignore +0 -0
  139. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/ACKNOWLEDGMENTS.md +0 -0
  140. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/CODE_OF_CONDUCT.md +0 -0
  141. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/CONTRIBUTING.md +0 -0
  142. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/LICENSE +0 -0
  143. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/ROADMAP.md +0 -0
  144. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/SECURITY.md +0 -0
  145. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
  146. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
  147. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
  148. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/adr/0004_runtime_owns_run_scoped_media_execution_truth.md +0 -0
  149. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/adr/0005_runtime_owns_abstractcore_host_discovery_queries.md +0 -0
  150. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/adr/0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md +0 -0
  151. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/adr/0007_runtime_relays_core_owned_model_residency_truth.md +0 -0
  152. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/architecture.md +0 -0
  153. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/artifacts.md +0 -0
  154. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/automations.md +0 -0
  155. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/001_runtime_kernel.md +0 -0
  156. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
  157. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/0030_runtime_host_facades_for_comms_telegram_and_tool_specs.md +0 -0
  158. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/0032_runtime_durable_outbound_comms_truth.md +0 -0
  159. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/0033_runtime_host_local_prompt_cache_export_import_surface.md +0 -0
  160. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/0035_model_residency_provider_truth_for_local_http_clients.md +0 -0
  161. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/0037_visualflow_generate_music_node_compiler_parity.md +0 -0
  162. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/0039_runtime_music_structure_prompt_bool_contract.md +0 -0
  163. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/003_wait_primitives.md +0 -0
  164. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/0040_task_agnostic_local_residency_listing.md +0 -0
  165. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/0041_runtime_hardware_extras_avoid_nonpermissive_document_stacks.md +0 -0
  166. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/0042_core_vision_upscale_and_parameter_surface.md +0 -0
  167. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/0043_runtime_vision_adapter_and_batch_surface.md +0 -0
  168. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/004_scheduler_driver.md +0 -0
  169. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
  170. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
  171. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
  172. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/009_artifact_store.md +0 -0
  173. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/010_examples_and_composition.md +0 -0
  174. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/011_subworkflow_support.md +0 -0
  175. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
  176. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
  177. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
  178. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/019_runtime_host_facade_for_core_operator_surfaces.md +0 -0
  179. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/020_runtime_gateway_install_boundary.md +0 -0
  180. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/021_runtime_gateway_env_namespace_cleanup.md +0 -0
  181. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/022_model_residency_control_plane.md +0 -0
  182. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/023_truthful_local_media_residency_boundaries.md +0 -0
  183. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/024_runtime_owned_run_scoped_media_execution.md +0 -0
  184. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md +0 -0
  185. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md +0 -0
  186. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/028_runtime_bloc_kv_lifecycle_and_pruning.md +0 -0
  187. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/029_runtime_music_generation_and_discovery_via_abstractcore.md +0 -0
  188. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/0846_mlx_instance_scheduling_and_execution_controls.md +0 -0
  189. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/0847_automations_v1_controller_contracts_occurrences_triggers.md +0 -0
  190. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/0851_per_account_voice_stores.md +0 -0
  191. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/completed/0852_capability_refusals_are_not_retried.md +0 -0
  192. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
  193. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
  194. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
  195. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
  196. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/deprecated/0034_agent_runtime_convenience_constructor.md +0 -0
  197. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
  198. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
  199. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
  200. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/deprecated/004_tests.md +0 -0
  201. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/deprecated/005_docs_updates.md +0 -0
  202. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
  203. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
  204. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
  205. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/deprecated/README.md +0 -0
  206. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
  207. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/0070_standalone_wui_browser_session_security_contract.md +0 -0
  208. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
  209. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
  210. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
  211. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
  212. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/0233_real_run_cancellation.md +0 -0
  213. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/025_runtime_retention_and_purge_contract.md +0 -0
  214. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/026_context_checkpoint_self_compression.md +0 -0
  215. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/027_quote_provenance_discipline.md +0 -0
  216. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/028_selective_artifact_rehydration.md +0 -0
  217. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/0845_session_prompt_cache_resume_and_purge_contract.md +0 -0
  218. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/0848_automations_v2_external_event_inbox_and_run_triggers.md +0 -0
  219. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_portability/0065_portable_process_and_lock_layer.md +0 -0
  220. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_portability/0066_portable_io_and_media_reader.md +0 -0
  221. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_portability/README.md +0 -0
  222. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/0044_meta_analysis_record.md +0 -0
  223. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/0045_crash_replay_harness_and_ordering_invariant.md +0 -0
  224. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/0046_per_run_driver_exclusion.md +0 -0
  225. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/0047_indexed_idempotency_lookup.md +0 -0
  226. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/0048_durable_io_unification.md +0 -0
  227. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/0049_llm_client_mechanical_split.md +0 -0
  228. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/0050_control_sidecar_all_writers.md +0 -0
  229. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/0051_runtime_owned_durable_event_mailbox.md +0 -0
  230. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/0052_sync_store_event_loop_tripwire.md +0 -0
  231. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/0053_bounded_run_vars_growth.md +0 -0
  232. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/0054_runtime_health_counters.md +0 -0
  233. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/0055_jsonl_store_honesty.md +0 -0
  234. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/0064_prompt_cache_fingerprint_stability.md +0 -0
  235. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/0067_durable_write_discipline.md +0 -0
  236. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/0068_hot_path_store_reads.md +0 -0
  237. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/planned/runtime_systemic_reliability/README.md +0 -0
  238. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/proposed/0031_runtime_tool_spec_adapters_for_gateway_and_mcp.md +0 -0
  239. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/proposed/0036_local_media_residency_bridge_to_core_residency.md +0 -0
  240. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/proposed/0038_core_server_pool_residency_affinity.md +0 -0
  241. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/proposed/0069_document_renderer_professional_figures.md +0 -0
  242. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/proposed/0849_conversation_search_tool_usage_outputs_and_thinking.md +0 -0
  243. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/proposed/0850_growing_automation_history_out_of_the_controller_ledger.md +0 -0
  244. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/proposed/runtime_systemic_reliability/0056_schema_version_and_quarantine_loading.md +0 -0
  245. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/proposed/runtime_systemic_reliability/0057_trust_boundary_stamp_registry.md +0 -0
  246. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/proposed/runtime_systemic_reliability/0058_terminal_run_archival_helper.md +0 -0
  247. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/proposed/runtime_systemic_reliability/0059_memory_span_handler_extraction.md +0 -0
  248. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/proposed/runtime_systemic_reliability/0060_visualflow_compiler_decomposition.md +0 -0
  249. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/proposed/runtime_systemic_reliability/0061_root_api_deprecation_machinery.md +0 -0
  250. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/proposed/runtime_systemic_reliability/0062_dependency_honesty_extras.md +0 -0
  251. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/proposed/runtime_systemic_reliability/0063_b3_envelope_lane_unification.md +0 -0
  252. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/backlog/proposed/runtime_systemic_reliability/README.md +0 -0
  253. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/email.md +0 -0
  254. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/entity-runtime.md +0 -0
  255. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/evidence.md +0 -0
  256. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/faq.md +0 -0
  257. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/getting-started.md +0 -0
  258. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/integrations/abstractcore.md +0 -0
  259. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/limits.md +0 -0
  260. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/manual_testing.md +0 -0
  261. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/mcp-worker.md +0 -0
  262. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/proposal.md +0 -0
  263. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/provenance.md +0 -0
  264. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/snapshots.md +0 -0
  265. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/tools-comms.md +0 -0
  266. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/troubleshooting.md +0 -0
  267. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/docs/workflow-bundles.md +0 -0
  268. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/examples/01_hello_world.py +0 -0
  269. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/examples/02_ask_user.py +0 -0
  270. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/examples/03_wait_until.py +0 -0
  271. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/examples/04_multi_step.py +0 -0
  272. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/examples/05_persistence.py +0 -0
  273. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/examples/06_llm_integration.py +0 -0
  274. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/examples/07_react_agent.py +0 -0
  275. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/examples/README.md +0 -0
  276. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/mkdocs.yml +0 -0
  277. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/pytest.ini +0 -0
  278. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/scripts/backfill_diary_edges.py +0 -0
  279. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/__init__.py +0 -0
  280. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/automation_queries.py +0 -0
  281. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/automations/__init__.py +0 -0
  282. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/automations/adapters.py +0 -0
  283. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/automations/attention.py +0 -0
  284. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/automations/bundle.py +0 -0
  285. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/automations/bundles/automation-controller/flows/controller.json +0 -0
  286. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/automations/bundles/automation-controller/manifest.json +0 -0
  287. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/automations/commands.py +0 -0
  288. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/automations/consumers.py +0 -0
  289. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/automations/controller.py +0 -0
  290. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/automations/ledger.py +0 -0
  291. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/automations/models.py +0 -0
  292. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/automations/samples.py +0 -0
  293. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/automations/service.py +0 -0
  294. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/automations/wakes.py +0 -0
  295. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/conversation_search.py +0 -0
  296. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/core/__init__.py +0 -0
  297. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/core/config.py +0 -0
  298. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/core/effect_cancellation.py +0 -0
  299. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/core/event_keys.py +0 -0
  300. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/core/health.py +0 -0
  301. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/core/live_deltas.py +0 -0
  302. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/core/policy.py +0 -0
  303. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/core/progress_channel.py +0 -0
  304. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/core/publish.py +0 -0
  305. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/core/run_attribution.py +0 -0
  306. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/core/run_identity.py +0 -0
  307. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/core/run_lifecycle.py +0 -0
  308. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/core/run_origin.py +0 -0
  309. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/core/spec.py +0 -0
  310. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/core/tool_scope.py +0 -0
  311. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/core/vars.py +0 -0
  312. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/documents/__init__.py +0 -0
  313. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/documents/charts.py +0 -0
  314. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/documents/docx.py +0 -0
  315. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/documents/pdf.py +0 -0
  316. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/email/__init__.py +0 -0
  317. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/email/actions.py +0 -0
  318. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/email/automations.py +0 -0
  319. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/email/binding.py +0 -0
  320. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/email/feeder.py +0 -0
  321. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/email/frame.py +0 -0
  322. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/email/inbox.py +0 -0
  323. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/evidence/__init__.py +0 -0
  324. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/evidence/recorder.py +0 -0
  325. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/history_bundle.py +0 -0
  326. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/identity/__init__.py +0 -0
  327. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/identity/act_only.py +0 -0
  328. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/identity/chat.py +0 -0
  329. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/identity/communities.py +0 -0
  330. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/identity/digest.py +0 -0
  331. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/identity/entity_runtime.py +0 -0
  332. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/identity/fingerprint.py +0 -0
  333. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/identity/lease.py +0 -0
  334. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/identity/life.py +0 -0
  335. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/identity/memory_reader.py +0 -0
  336. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/identity/night_voice.py +0 -0
  337. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/identity/phase_graph.py +0 -0
  338. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/identity/phase_spec.py +0 -0
  339. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/identity/prelude.py +0 -0
  340. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/identity/prompt_overlay.py +0 -0
  341. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/identity/reflection.py +0 -0
  342. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/identity/spec/entity_phases.vendored.json +0 -0
  343. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/identity/substrate.py +0 -0
  344. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/identity/tool_effects.py +0 -0
  345. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/identity/tool_policy.py +0 -0
  346. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/identity/tools.py +0 -0
  347. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/identity/visit_workflow.py +0 -0
  348. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/__init__.py +0 -0
  349. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/__init__.py +0 -0
  350. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/agora_tools.py +0 -0
  351. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/command_sandbox_host.py +0 -0
  352. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/comms_facade.py +0 -0
  353. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/config_facade.py +0 -0
  354. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
  355. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/data_registry_facade.py +0 -0
  356. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
  357. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/discovery_facade.py +0 -0
  358. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/discovery_queries.py +0 -0
  359. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/email_facade.py +0 -0
  360. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
  361. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/factory.py +0 -0
  362. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/host_facade.py +0 -0
  363. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/llm_client.py +0 -0
  364. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/local_helper_tools.py +0 -0
  365. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
  366. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/mcp_facade.py +0 -0
  367. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
  368. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/media_subprocess.py +0 -0
  369. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
  370. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/output_specs.py +0 -0
  371. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/run_facade.py +0 -0
  372. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/server_facade.py +0 -0
  373. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
  374. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/structured_facade.py +0 -0
  375. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
  376. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/telegram_facade.py +0 -0
  377. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/tool_effects.py +0 -0
  378. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -0
  379. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/tool_inventory_facade.py +0 -0
  380. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/voice_facade.py +0 -0
  381. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/voice_library.py +0 -0
  382. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +0 -0
  383. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/integrations/abstractmemory/brain_handlers.py +0 -0
  384. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/mail_verbs.py +0 -0
  385. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/memory/__init__.py +0 -0
  386. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/memory/active_context.py +0 -0
  387. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/memory/active_memory.py +0 -0
  388. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/memory/compaction.py +0 -0
  389. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/memory/kg_packets.py +0 -0
  390. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/memory/memact_composer.py +0 -0
  391. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/memory/recall_levels.py +0 -0
  392. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/memory/token_budget.py +0 -0
  393. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/rendering/__init__.py +0 -0
  394. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
  395. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/rendering/json_stringify.py +0 -0
  396. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/scheduler/__init__.py +0 -0
  397. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/scheduler/convenience.py +0 -0
  398. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/scheduler/multi_store.py +0 -0
  399. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/scheduler/registry.py +0 -0
  400. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/scheduler/scheduler.py +0 -0
  401. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/session_history.py +0 -0
  402. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/session_turns.py +0 -0
  403. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/storage/artifacts.py +0 -0
  404. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/storage/change_ring.py +0 -0
  405. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/storage/commands.py +0 -0
  406. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/storage/lease.py +0 -0
  407. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/storage/snapshots.py +0 -0
  408. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/storage/steer_sidecar.py +0 -0
  409. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/triggers/__init__.py +0 -0
  410. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/triggers/cloudevents.py +0 -0
  411. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/triggers/connection_events.py +0 -0
  412. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/triggers/connections.py +0 -0
  413. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/triggers/email_received.py +0 -0
  414. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/triggers/event_frame.py +0 -0
  415. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/triggers/feed.py +0 -0
  416. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/triggers/manual.py +0 -0
  417. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/triggers/protocol.py +0 -0
  418. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/triggers/registry.py +0 -0
  419. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/triggers/schedule.py +0 -0
  420. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/triggers/webhook.py +0 -0
  421. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/turn_grounding.py +0 -0
  422. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/utils/__init__.py +0 -0
  423. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/utils/atomic_files.py +0 -0
  424. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/utils/file_filters.py +0 -0
  425. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/utils/workspace_paths.py +0 -0
  426. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
  427. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
  428. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
  429. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
  430. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
  431. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
  432. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
  433. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
  434. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
  435. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
  436. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
  437. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
  438. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
  439. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
  440. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
  441. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/visual/execution_metrics.py +0 -0
  442. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/visual/function_library.py +0 -0
  443. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/visual/loop_back_check.py +0 -0
  444. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/visual/loop_limit_lowering.py +0 -0
  445. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
  446. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
  447. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/visual/pin_expressions.py +0 -0
  448. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/visualflow_compiler/visual/reroute_lowering.py +0 -0
  449. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
  450. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/workflow_bundle/models.py +0 -0
  451. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/workflow_bundle/packer.py +0 -0
  452. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/workflow_bundle/reader.py +0 -0
  453. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/src/abstractruntime/workflow_bundle/registry.py +0 -0
  454. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/README.md +0 -0
  455. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/automation_harness.py +0 -0
  456. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/conftest.py +0 -0
  457. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/email_wp2_support.py +0 -0
  458. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/fixtures/feeds/atom.xml +0 -0
  459. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/fixtures/feeds/rdf-not-a-feed.xml +0 -0
  460. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/fixtures/feeds/rss1-malformed.xml +0 -0
  461. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/fixtures/feeds/rss1.xml +0 -0
  462. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/fixtures/feeds/rss2.xml +0 -0
  463. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/fixtures/schedule_v1_corpus.json +0 -0
  464. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/live_email/conftest.py +0 -0
  465. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/live_email/live_email_support.py +0 -0
  466. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/live_email/test_email_live_runtime.py +0 -0
  467. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/media_endpoint_profile_probe.py +0 -0
  468. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_abstractcore_comms_facade.py +0 -0
  469. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_abstractcore_discovery_facade.py +0 -0
  470. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_abstractcore_host_facade.py +0 -0
  471. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_abstractcore_run_facade.py +0 -0
  472. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_abstractcore_server_facade.py +0 -0
  473. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_abstractcore_structured_facade.py +0 -0
  474. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_abstractcore_telegram_facade.py +0 -0
  475. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_active_consumers_index.py +0 -0
  476. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_active_context_policy.py +0 -0
  477. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_active_index.py +0 -0
  478. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_active_memory.py +0 -0
  479. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_agora_agent_alias_identity.py +0 -0
  480. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_agora_tools_http.py +0 -0
  481. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_analyze_media_addressing_and_walling.py +0 -0
  482. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_answer_user_effect.py +0 -0
  483. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_artifact_session_candidates.py +0 -0
  484. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_artifacts.py +0 -0
  485. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_automation_calendar_schedule.py +0 -0
  486. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_automation_commands.py +0 -0
  487. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_automation_controller.py +0 -0
  488. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_automation_controller_recovery.py +0 -0
  489. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_automation_definition.py +0 -0
  490. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_automation_discussion_isolation.py +0 -0
  491. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_automation_email_results.py +0 -0
  492. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_automation_growing_context.py +0 -0
  493. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_automation_index.py +0 -0
  494. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_automation_list_reads.py +0 -0
  495. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_automation_named_policy_compiler.py +0 -0
  496. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_automation_next_fire.py +0 -0
  497. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_automation_occurrence_input_resolver.py +0 -0
  498. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_automation_occurrence_recovery.py +0 -0
  499. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_automation_replay_read_only.py +0 -0
  500. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_automation_retry.py +0 -0
  501. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_automation_session_turns.py +0 -0
  502. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_automation_status.py +0 -0
  503. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_automation_tool_approval.py +0 -0
  504. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_browser_probe_target_walling.py +0 -0
  505. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_budget_law_no_unrequested_caps.py +0 -0
  506. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_capability_default_reasoning.py +0 -0
  507. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_chat_summarizer_integration.py +0 -0
  508. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_code_node_imports.py +0 -0
  509. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_code_node_restricted_python.py +0 -0
  510. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_command_sandbox_host_facade.py +0 -0
  511. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_command_store.py +0 -0
  512. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_compaction_helpers.py +0 -0
  513. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_compaction_summarizer_route.py +0 -0
  514. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_config_facade_models_engines.py +0 -0
  515. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_config_facade_voice_input_hint.py +0 -0
  516. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_control_adapter_while.py +0 -0
  517. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_controller_bundle_packaged.py +0 -0
  518. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_conversation_search.py +0 -0
  519. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_crash_ordering_inversions.py +0 -0
  520. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_create_if_absent.py +0 -0
  521. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_data_registry_facade.py +0 -0
  522. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_default_model_warmup_switch.py +0 -0
  523. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_default_tools_camera_gating.py +0 -0
  524. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_default_tools_comms_gating.py +0 -0
  525. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_default_tools_include_skim_files.py +0 -0
  526. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_default_tools_include_skim_folders.py +0 -0
  527. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_default_tools_include_skim_web.py +0 -0
  528. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_default_tools_search_files_executor.py +0 -0
  529. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_diary_capture.py +0 -0
  530. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_diary_write_rescue.py +0 -0
  531. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_directory_lease.py +0 -0
  532. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_disabled_toolsets_seam.py +0 -0
  533. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_discovery_survives_unbuildable_default.py +0 -0
  534. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_discovery_tts_unavailable_reason.py +0 -0
  535. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_discovery_voice_openai_api_key.py +0 -0
  536. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_discussion_session_anchor.py +0 -0
  537. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_document_markdown_tables.py +0 -0
  538. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_document_renderers_hr_quote.py +0 -0
  539. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_durable_toolsets.py +0 -0
  540. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
  541. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_effect_cancellation.py +0 -0
  542. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_effect_issuance_idempotency.py +0 -0
  543. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_effect_payload_stays_json_serializable.py +0 -0
  544. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_election_consequence_teaching.py +0 -0
  545. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_email_binding_and_refiner.py +0 -0
  546. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_email_feeder_batched.py +0 -0
  547. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_email_feeder_flags.py +0 -0
  548. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_email_gate_fixes.py +0 -0
  549. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_email_inbox_and_trigger.py +0 -0
  550. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_email_received_mailbox_id.py +0 -0
  551. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_email_regate_fixes.py +0 -0
  552. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_email_review_fixes.py +0 -0
  553. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_email_self_trigger_loop.py +0 -0
  554. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_email_stream_consumers.py +0 -0
  555. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_email_toolset_and_walls.py +0 -0
  556. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_emergence_experiment.py +0 -0
  557. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_emit_event_uses_wait_index.py +0 -0
  558. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_emit_event_without_workflow_registry.py +0 -0
  559. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_endpoint_profile_media_end_to_end.py +0 -0
  560. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_endpoint_profile_media_in_process.py +0 -0
  561. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_endpoint_profile_media_specs_keep_provider.py +0 -0
  562. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_endpoint_profile_route_context.py +0 -0
  563. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_entity_awake_memory_fixes.py +0 -0
  564. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_entity_brain_effects.py +0 -0
  565. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_entity_chat_driver.py +0 -0
  566. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_entity_chat_tools_reflection.py +0 -0
  567. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_entity_diary.py +0 -0
  568. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_entity_execute_tool.py +0 -0
  569. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_entity_fetch_url_tool.py +0 -0
  570. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_entity_history_window.py +0 -0
  571. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_entity_life_loop.py +0 -0
  572. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_entity_memory_richness.py +0 -0
  573. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_entity_phase_graph_conformance.py +0 -0
  574. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_entity_react_visit_window.py +0 -0
  575. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_entity_recent_memories.py +0 -0
  576. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_entity_runtime.py +0 -0
  577. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_entity_search_memory.py +0 -0
  578. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_entity_sleep_bound_and_yield_attribution.py +0 -0
  579. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_entity_substrate_resolution.py +0 -0
  580. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_entity_visit_honesty.py +0 -0
  581. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_entity_workspace_cap.py +0 -0
  582. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_entity_workspace_tools.py +0 -0
  583. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_event_index_cross_process.py +0 -0
  584. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_event_wait_index.py +0 -0
  585. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_every_path_bearing_tool_is_walled.py +0 -0
  586. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_evidence_recorder.py +0 -0
  587. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_evidence_recorder_post_policy_envelope.py +0 -0
  588. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_execute_command_output_offload.py +0 -0
  589. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_execution_capability_discovery.py +0 -0
  590. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_explicit_eject_other_clients.py +0 -0
  591. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_factory_default_retry_policy.py +0 -0
  592. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
  593. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_format_repair_nudge.py +0 -0
  594. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_fresh_install_no_provider.py +0 -0
  595. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_gateway_facades_c4899.py +0 -0
  596. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_git_read_only_refiner.py +0 -0
  597. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_hf_process_residency_merge.py +0 -0
  598. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_history_window_multimodal.py +0 -0
  599. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_hot_path_store_reads.py +0 -0
  600. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_indexed_idempotency_lookup.py +0 -0
  601. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_integration_abstractcore.py +0 -0
  602. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_integrations_abstractcore.py +0 -0
  603. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_json_file_run_store_children_index.py +0 -0
  604. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_json_run_cache_bound.py +0 -0
  605. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_json_store_scan_memo.py +0 -0
  606. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_kg_learn_and_recall_contract.py +0 -0
  607. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_ledger_chain.py +0 -0
  608. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_ledger_record_slimming.py +0 -0
  609. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_ledger_subscription.py +0 -0
  610. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_live_token_deltas.py +0 -0
  611. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_llm_call_media_artifact_refs.py +0 -0
  612. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
  613. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
  614. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_llm_call_payload_shape_refusal.py +0 -0
  615. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_llm_call_requires_prompt.py +0 -0
  616. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_llm_call_response_schema_normalization.py +0 -0
  617. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_llm_call_structured_output_fallback.py +0 -0
  618. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_llm_call_text_phase_progress.py +0 -0
  619. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_llm_call_truncation_retry_contract.py +0 -0
  620. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_llm_call_use_context_appends_turn.py +0 -0
  621. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
  622. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_llm_client_grounding_tail.py +0 -0
  623. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_llm_client_media_artifacts.py +0 -0
  624. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_llm_client_system_context.py +0 -0
  625. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_llm_client_tool_call_parsing.py +0 -0
  626. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_llm_retry_classification.py +0 -0
  627. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_llm_streaming_on_token.py +0 -0
  628. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_local_helper_tool_exposure.py +0 -0
  629. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_local_residency_host_sweep.py +0 -0
  630. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
  631. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_mail_verbs.py +0 -0
  632. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_mailbox_index.py +0 -0
  633. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_max_iterations_ceiling.py +0 -0
  634. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_mcp_remote_tool_executor.py +0 -0
  635. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_mcp_runs_untrusted_and_facade.py +0 -0
  636. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_mcp_worker_logging.py +0 -0
  637. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_mcp_worker_security.py +0 -0
  638. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_mcp_worker_stdio.py +0 -0
  639. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_media_artifact_resolution.py +0 -0
  640. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_media_capability_default_routing.py +0 -0
  641. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_media_host_endpoint_resolver.py +0 -0
  642. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_media_only_requests_skip_text_client.py +0 -0
  643. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_media_subprocess.py +0 -0
  644. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_memact_composer_from_kg_result.py +0 -0
  645. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_memory_appraise_handler.py +0 -0
  646. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_memory_communities.py +0 -0
  647. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
  648. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_memory_kg_packets.py +0 -0
  649. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_memory_kg_predicate_aliasing.py +0 -0
  650. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_memory_kg_query_packetization_restart.py +0 -0
  651. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
  652. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
  653. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_memory_note_effect.py +0 -0
  654. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_memory_query_effect.py +0 -0
  655. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_memory_query_rich_filters.py +0 -0
  656. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
  657. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_memory_seam_handlers.py +0 -0
  658. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_memory_seam_sqlite_durability.py +0 -0
  659. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_memory_tag_effect.py +0 -0
  660. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_mlx_generation_serialization.py +0 -0
  661. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_mlx_process_residency_merge.py +0 -0
  662. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_model_eject_cancel.py +0 -0
  663. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_model_residency_clean_switch.py +0 -0
  664. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_model_residency_control_plane.py +0 -0
  665. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_model_residency_lock_and_context_estimate.py +0 -0
  666. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_multi_store_scheduler.py +0 -0
  667. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_multimodal_abstractcore_integration.py +0 -0
  668. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_native_mlx_application_wiring.py +0 -0
  669. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_native_mlx_execution_controls_live.py +0 -0
  670. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_native_tool_channel.py +0 -0
  671. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_night_voice.py +0 -0
  672. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_no_default_provider_refusal_ux.py +0 -0
  673. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_occurrence_named_inputs.py +0 -0
  674. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_occurrence_samples.py +0 -0
  675. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_offload_answer_chain_c4978.py +0 -0
  676. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_offloaded_node_traces_report_unknown_not_zero.py +0 -0
  677. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_offloading.py +0 -0
  678. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_parallel_readonly_tool_execution.py +0 -0
  679. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_pause_resume.py +0 -0
  680. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_pdf_unicode_rendering.py +0 -0
  681. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_personal_cycle.py +0 -0
  682. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_phantom_attachment_index.py +0 -0
  683. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_phase_graph_artifact_control.py +0 -0
  684. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_phase_graph_obedience.py +0 -0
  685. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_phase_vocabulary_migration.py +0 -0
  686. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_pooled_client_strips_construction_cache_key.py +0 -0
  687. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_prompt_cache_export_import.py +0 -0
  688. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_prompt_cache_fingerprint_stability.py +0 -0
  689. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_prompt_cache_modules.py +0 -0
  690. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_prompt_cache_posture_inheritance.py +0 -0
  691. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_prompt_cache_thinking_and_prompt_only.py +0 -0
  692. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_prompt_overlay.py +0 -0
  693. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_provider_endpoint_profile_resolution.py +0 -0
  694. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_provider_pin_routing_isolation.py +0 -0
  695. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_publish_event.py +0 -0
  696. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_queryable_run_store.py +0 -0
  697. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_r12_workspace_sandbox.py +0 -0
  698. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
  699. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_read_idle_threading.py +0 -0
  700. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_readoption_experiment.py +0 -0
  701. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_real_integration.py +0 -0
  702. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_realize_election.py +0 -0
  703. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_recall_levels_policy.py +0 -0
  704. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_remote_client_cancel.py +0 -0
  705. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_remote_llm_client.py +0 -0
  706. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_remote_speculation_defaults.py +0 -0
  707. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_rendering_agent_trace_report.py +0 -0
  708. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_rendering_json_stringify.py +0 -0
  709. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_report_branding.py +0 -0
  710. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_resident_media_generation.py +0 -0
  711. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_resume_concurrent_same_wait.py +0 -0
  712. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_retry_idempotency.py +0 -0
  713. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_run_history_bundle.py +0 -0
  714. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_run_index_workspace_root.py +0 -0
  715. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_run_mutation_lock.py +0 -0
  716. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_run_origin.py +0 -0
  717. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_run_scoped_tool_policy.py +0 -0
  718. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_run_store_change_token.py +0 -0
  719. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_run_tool_scope_ceiling.py +0 -0
  720. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_runtime_browser_session_boundary.py +0 -0
  721. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
  722. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_runtime_default_provider_model_refresh.py +0 -0
  723. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_runtime_effect_invocation_trace.py +0 -0
  724. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_runtime_health_and_bounded_vars.py +0 -0
  725. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_runtime_install_boundary.py +0 -0
  726. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
  727. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_runtime_node_traces.py +0 -0
  728. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_runtime_start_seeds_tool_support.py +0 -0
  729. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_runtime_tick_step_gate.py +0 -0
  730. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_schedule_run.py +0 -0
  731. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_schedule_v1_corpus.py +0 -0
  732. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_schedule_v2_calendar.py +0 -0
  733. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_scheduler.py +0 -0
  734. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_send_email_refiner.py +0 -0
  735. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_send_email_self_default_policy.py +0 -0
  736. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
  737. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_session_history.py +0 -0
  738. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_session_prompt_cache_attribution.py +0 -0
  739. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_session_prompt_cache_visibility.py +0 -0
  740. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_session_route_stamp.py +0 -0
  741. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_session_start_cost.py +0 -0
  742. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_shell_tool_exposure.py +0 -0
  743. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_snapshots.py +0 -0
  744. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_speculation_inheritance.py +0 -0
  745. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_speculation_reaches_provider_construction.py +0 -0
  746. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_sqlite_ledger_store.py +0 -0
  747. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_start_subworkflow_async_wait.py +0 -0
  748. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
  749. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
  750. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_steer_sidecar.py +0 -0
  751. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_storage_deletion.py +0 -0
  752. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_streamed_voice_namespace.py +0 -0
  753. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_structured_output_schema_enum.py +0 -0
  754. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_subworkflow.py +0 -0
  755. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_terminal_effect_completion.py +0 -0
  756. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
  757. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_thinking_inheritance.py +0 -0
  758. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
  759. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_tool_approval_executor.py +0 -0
  760. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_tool_approval_resume_executes.py +0 -0
  761. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_tool_approval_wait_key_identity.py +0 -0
  762. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_tool_calls_idempotency_keys.py +0 -0
  763. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_tool_catalog.py +0 -0
  764. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_tool_descriptor_registry.py +0 -0
  765. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_tool_executor_argument_sanitization.py +0 -0
  766. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_tool_executor_error_output_detection.py +0 -0
  767. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_tool_executor_filename_alias.py +0 -0
  768. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
  769. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_tool_executor_read_file_aliases.py +0 -0
  770. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_tool_executor_timeout.py +0 -0
  771. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_tool_inventory_facade.py +0 -0
  772. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_tool_invoke_effect.py +0 -0
  773. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_tool_policy_and_mounts.py +0 -0
  774. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_tool_wait_allowlist_safety.py +0 -0
  775. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_topic_election_world_model.py +0 -0
  776. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_trace_context_propagation.py +0 -0
  777. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_trigger_cloudevents.py +0 -0
  778. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_trigger_connection_listening.py +0 -0
  779. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_trigger_connections.py +0 -0
  780. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_trigger_feed.py +0 -0
  781. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_trigger_registry.py +0 -0
  782. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_trigger_schedule_math.py +0 -0
  783. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_trusted_run_index.py +0 -0
  784. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_turn_grounding_byte_stability.py +0 -0
  785. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_turn_grounding_carriers_a3.py +0 -0
  786. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_vars_query_effect.py +0 -0
  787. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visit_ab_fixture.py +0 -0
  788. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visit_midturn_elections.py +0 -0
  789. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visit_midturn_resume.py +0 -0
  790. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visit_workflow.py +0 -0
  791. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
  792. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visual_agent_skills_block_passthrough.py +0 -0
  793. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
  794. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
  795. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
  796. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
  797. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visual_entity_memory_nodes.py +0 -0
  798. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visual_flow_end_effect_only_persistence.py +0 -0
  799. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visual_llm_call_partial_override.py +0 -0
  800. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
  801. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visual_loop_back_out_of_body.py +0 -0
  802. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visual_loop_limit_and_list_nodes.py +0 -0
  803. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visual_loop_limit_on_wire.py +0 -0
  804. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visual_memact_compose_node.py +0 -0
  805. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
  806. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
  807. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
  808. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visual_reroute_lowering.py +0 -0
  809. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visual_set_vars_pins.py +0 -0
  810. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visual_unknown_node_type_refuses.py +0 -0
  811. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visual_wait_event_deadline_passthrough.py +0 -0
  812. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_add_message_builtin.py +0 -0
  813. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
  814. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_agora_react_agent.py +0 -0
  815. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_call_tool_node.py +0 -0
  816. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_capability_routes_and_thinking.py +0 -0
  817. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_compiler_basic.py +0 -0
  818. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
  819. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_continue_on_error.py +0 -0
  820. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_edit_json_schema_node.py +0 -0
  821. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_event_inbox_react_agent.py +0 -0
  822. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_file_nodes_workspace.py +0 -0
  823. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_function_library.py +0 -0
  824. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_get_element_node.py +0 -0
  825. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_get_random_element_node.py +0 -0
  826. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_get_var_node.py +0 -0
  827. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_has_tools_builtin.py +0 -0
  828. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
  829. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
  830. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_make_object_node.py +0 -0
  831. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_media_nodes.py +0 -0
  832. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_memory_effect_nodes.py +0 -0
  833. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_memory_source_pins.py +0 -0
  834. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_pin_expressions.py +0 -0
  835. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_prompt_only.py +0 -0
  836. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_random_nodes.py +0 -0
  837. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_schema_enum_switch.py +0 -0
  838. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_string_contains_replace.py +0 -0
  839. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_visualflow_tool_parameters_node.py +0 -0
  840. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_voice_library_facade.py +0 -0
  841. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_voice_openai_api_key_path.py +0 -0
  842. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_voice_stream_is_not_a_wait.py +0 -0
  843. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_w4_feelings_lens.py +0 -0
  844. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_wait_event_deadline.py +0 -0
  845. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_wait_event_prompt_metadata.py +0 -0
  846. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_wait_until_streak.py +0 -0
  847. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_wait_until_utc_normalization.py +0 -0
  848. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_workflow_bundle_registry.py +0 -0
  849. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_workspace_builtin_deny.py +0 -0
  850. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_workspace_context_allowed_workspaces.py +0 -0
  851. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_workspace_policy_absolute_reanchor.py +0 -0
  852. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_workspace_policy_allowlist_mode.py +0 -0
  853. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
  854. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
  855. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_workspace_prompt_context.py +0 -0
  856. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_workspace_read_only.py +0 -0
  857. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_workspace_writable_paths.py +0 -0
  858. {abstractruntime-0.13.1 → abstractruntime-0.15.0}/tests/test_write_chart.py +0 -0
@@ -7,6 +7,133 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.15.0] - 2026-10-28
11
+
12
+ Requires AbstractMemory 0.4.0 or newer (`abstractmemory.graph`). ADR 0011, backlog 0856.
13
+
14
+ ### Upgrade notes (one-way)
15
+
16
+ - AbstractMemory 0.4.0 rewrites a SQLite home's JSON-text vectors as float32 BLOBs on first write; a 0.3.x reader then
17
+ finds no vectors (zero semantic hits, no error). Every process sharing a home or a plane moves to AbstractMemory 0.4.0
18
+ (and so AbstractRuntime 0.15.0) together. See the AbstractMemory 0.4.0 changelog.
19
+ - The JSON-file ledger writes a `ledger_<run_id>.idx` row index beside each ledger; older readers ignore it, and a
20
+ missing or stale index is rebuilt from the ledger.
21
+
22
+ ### Added
23
+
24
+ - **Ledger row address** (on 0.14.0's per-run `seq`, ADR 0010): `LedgerStore.get_record(run_id, seq)` returns one
25
+ record ready to read (a terminal row's `$slim` markers resolved against its STARTED row, offloaded leaves
26
+ rehydrated); `find_started_record(run_id, step_id, before_seq=)`. SQLite reads by primary key; the JSON-file backend
27
+ keeps a per-run line-offset index and checks the seq persisted on the line, so a point read is a seek and one line
28
+ parse (0.05 ms at 10,000 rows instead of a 58 ms full parse), and a rewritten file is read by persisted seq, never
29
+ by position.
30
+ - **Step context**: an effect handler reads its own step with
31
+ `abstractruntime.core.step_context.current_step_context(run.run_id)`: `run_id`, `step_id`, `seq` of the attempt's
32
+ STARTED row, `node_id`, `attempt`, `effect_type`. Out of band like the progress callback; `None` outside a runtime
33
+ step; a nested runtime shadows it.
34
+ - **Memory facade** (`abstractruntime.integrations.abstractmemory.memory_facade`): `MemoryFacade` (`open_mind`, `stamp`,
35
+ `stamp_current_step`, `reconstruct_source`, `history`, `sources_of`, `derived_from_source`, `apply_revision`),
36
+ `is_real_run`, and the AbstractMemory names hosts use re-exported unchanged (`GATEWAY_NAMES`). Hosts no longer import
37
+ `abstractmemory`. `reconstruct_source` answers `ok`, `source_gone` or `unsupported`, never raises for a missing
38
+ source. See [AbstractMemory integration](docs/integrations/abstractmemory.md).
39
+ - **Provenance stamping**: `MEMORY_FORM`, `MEMORY_KG_ASSERT` and the `DIARY_WRITE` graph projection add a `sources`
40
+ list to the provenance they write: the `step` ref `(run_id, seq, step_id)` of the writing effect, an `artifact` ref
41
+ for the verbatim / `span_id`, a `diary_entry` ref for a projection. The legacy flat keys stay. A synthetic run id
42
+ (`chat-<session_id>`, `diary:<entity_id>`, ...) is never a `run`/`step` ref: the home-direct chat path carries
43
+ artifact or diary-entry refs only.
44
+ - **`MEMORY_REVISE`** (`EffectType.MEMORY_REVISE`, VisualFlow node `memory_revise`): one revision of a mind (assert /
45
+ close / narrow ops) applied atomically through `MemoryGraph.apply_revision` as a workflow step, its provenance
46
+ stamped with the step that applied it. Handler from `build_memory_kg_effect_handlers` (new optional `journal=`); a
47
+ store that is not a graph home answers a failed outcome naming AbstractMemory backlog 0057; an ungrounded revision
48
+ fails with `ProvenanceRequired`.
49
+
50
+ - **Source integrity** (architect pass): every ref the runtime stamps carries a `digest` (step: sha256 of the STARTED
51
+ record as written, also on the step context; artifact: the sha256 of its bytes; diary entry: the chain
52
+ `record_hash`), and `reconstruct_source` verifies it: new statuses `mismatch` (the bytes changed since the memory
53
+ named them) and `partial` (a `$slim` marker or an `{"$artifact": id}` leaf whose artifact is gone or uncheckable;
54
+ never `ok` with a hole). A step ref resolves only to its STARTED row (a rewritten JSON-file ledger answers
55
+ `source_gone`, never another row).
56
+ - **Owner partitions**: `MEMORY_REVISE` and `MEMORY_KG_ASSERT` write only the run's own owners (its run, its session,
57
+ the global owner); `MEMORY_REVISE` refuses `recorded_at` (record time is the store's); a replayed revision reports
58
+ the memory's sources, not the retry's step.
59
+ - **Persisted JSON-file row index** (`ledger_<run_id>.idx` beside the ledger): a fresh process reads a 100,000-row
60
+ ledger's row in 39 ms instead of 320 ms.
61
+
62
+ ### Changed
63
+
64
+ - `AbstractMemory>=0.4.0` (was `>=0.3.2`).
65
+ - SQLite `find_started_record` reads newest-first with `LIMIT 1` (0.01 ms at 10,000 rows instead of 3.5 ms).
66
+
67
+ ## [0.14.0] - 2026-10-27
68
+
69
+ Two features: the replay view with a durable per-run ledger cursor, and the session tool policy.
70
+ Upgrade note (one way): hash-chained JSONL ledgers written by 0.14.0 carry `seq` on each line, and
71
+ an older `verify_ledger_chain` reports those lines as tampered. Upgrade writers and verifiers together.
72
+
73
+ ### Added
74
+
75
+ - **Replay view** (`abstractruntime.replay`, ADR 0010, backlog 0854; framework root 0993). One
76
+ pure, deterministic reducer turns a run tree's ledger records and snapshots into the view every
77
+ client renders (`replay_view_v1`).
78
+ - What the view holds:
79
+ - the run tree through delegation waits, with the workflow each run executes (bundle,
80
+ version, flow, the root's entrypoint);
81
+ - the status;
82
+ - the person-facing interaction: a delegated child's approval, a question, or a prompted
83
+ event, with the resume command to send;
84
+ - verbatim messages with their provenance (run, steps, seqs, artifacts);
85
+ - one activity per node execution (AbstractFlow's `executionIdFor` rules), with tool calls
86
+ matched to results;
87
+ - artifacts and usage.
88
+ - `$slim` pointers are resolved, and a windowed history is named in `warnings`.
89
+ - A wait is over when a resume OR a later step of the same run exists.
90
+ - `ReplayView.apply` folds newer records and returns a delta. `apply_delta` and `diff_views`
91
+ are the client side. `replay(all)` equals the fold of any chunking.
92
+ - Wait kinds agree with `automations.attention`. The person-facing kinds are tool_approval,
93
+ ask_user, and an event that carries a prompt. The non-person-facing kinds are delegation,
94
+ timer, job, pause, automation_wake and signal. The interaction carries `answer_payload`.
95
+ - A session tool policy's `abstract.tool_policy_decision` record is an activity
96
+ (`tool_policy`: allowed or denied by the conversation's policy, its revision and who set it),
97
+ never an interaction. The tool rows it names carry `decided_by: "session_policy"`.
98
+ - Every delta carries typed `changes` (status, interaction opened or closed, run, message,
99
+ activity, artifact, each with its run and seq), for push dispatch.
100
+ - Cursor tokens name each run by a collision-free prefix that is safe in a header.
101
+ `resolve_cursor_token` maps a token back.
102
+ - The conformance cases ship with the package (`abstractruntime.replay.conformance`), so a host
103
+ or a client port can run them. Guide: `docs/replay.md`.
104
+ - **Durable ledger cursor** (gateway backlog 0082). A JSONL append after a torn last line (a
105
+ crash mid-write) now starts a new line; before, the fragment and the whole new record were
106
+ dropped together:
107
+ - Every ledger store numbers a run's records (`seq`). `JsonlLedgerStore` persists the number
108
+ on each line, allocated under an advisory file lock, so two processes never take the same
109
+ seq. Lines written before the field existed read as their position.
110
+ - `LedgerStore.list_after(run_id=, after=, limit=)` works on every store: an indexed read on
111
+ SQLite, a byte-offset seek on JSONL. `append()` returns the seq.
112
+ - `ObservableLedgerStore` passes `seq` to subscribers.
113
+ - `SqliteLedgerStore.import_records` copies a ledger in and keeps its `seq` values (migration).
114
+
115
+ - **Session tool policy**: a conversation's standing "approve / deny without asking", applied before any approval
116
+ wait. `abstractruntime.storage.session_tool_policy` (`SqliteSessionToolPolicyStore`,
117
+ `InMemorySessionToolPolicyStore`, `session_policy_names`), `Runtime(session_tool_policy_store=...)` /
118
+ `Runtime.set_session_tool_policy_store()`. The TOOL_CALLS handler reads the run's session row once per batch: an
119
+ approved call runs with no wait, a denied call is refused with no wait, and each decision writes an
120
+ `abstract.tool_policy_decision` ledger record (who set the policy, when, which selector matched). It applies to
121
+ every run of the session (the run tree's root session: delegated children, resumes, restarts); approvals never
122
+ reach untrusted-input runs or automation occurrences (a deny does, and also wins over an approval that was shown
123
+ before it); never beyond the run's `allowed_tools`. Before this, "approve all" lived in each
124
+ client, which answered the wait after it arrived: the gate flashed in every app and in the ledger. See
125
+ [tool-approval.md](docs/tool-approval.md#session-tool-policy-a-conversations-standing-word).
126
+
127
+ ### Changed
128
+
129
+ - Hash-chained ledgers: `seq` is persisted on each JSONL line and excluded from the hash by this
130
+ version's `compute_record_hash`. A verifier from an older version includes it, so it reports
131
+ every line written by this version as tampered. Upgrade every process that verifies a chain
132
+ (`verify_ledger_chain`) together with the writers.
133
+ - `LedgerStore.list()` records carry `seq`. A consumer that compared records to `asdict(record)`
134
+ sees one more key. The hash chain excludes `seq` (it is the store's position, assigned after
135
+ the hash).
136
+
10
137
  ## [0.13.1] - 2026-10-27
11
138
 
12
139
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: AbstractRuntime
3
- Version: 0.13.1
3
+ Version: 0.15.0
4
4
  Summary: AbstractRuntime: a durable graph runner designed to pair with AbstractCore.
5
5
  Project-URL: AbstractCore (website), https://www.abstractcore.ai/
6
6
  Project-URL: AbstractRuntime (GitHub), https://github.com/lpalbou/abstractruntime
@@ -21,7 +21,7 @@ Classifier: Programming Language :: Python :: 3.12
21
21
  Classifier: Programming Language :: Python :: 3.13
22
22
  Requires-Python: >=3.10
23
23
  Requires-Dist: abstractcore>=2.30.0
24
- Requires-Dist: abstractmemory>=0.3.2
24
+ Requires-Dist: abstractmemory>=0.4.0
25
25
  Requires-Dist: abstractsemantics>=0.0.5
26
26
  Requires-Dist: anyio<5.0.0,>=4.12.1
27
27
  Requires-Dist: httpx<1.0.0,>=0.28.1
@@ -55,10 +55,37 @@ Description-Content-Type: text/markdown
55
55
 
56
56
  It is designed for long-running workflows that must survive restarts and explicitly model blocking (human input, timers, external events, subworkflows) without keeping Python stacks alive.
57
57
 
58
- **Version:** 0.8.2 • **Python:** 3.10+
58
+ **Version:** 0.15.0 • **Python:** 3.10+
59
59
 
60
60
  **Status:** pre-1.0 (API may evolve). For production use, pin versions and follow `CHANGELOG.md`.
61
61
 
62
+ ## What's new in 0.15.0
63
+
64
+ - **Memory facade** (`abstractruntime.integrations.abstractmemory.memory_facade.MemoryFacade`): the one
65
+ host surface for AbstractMemory 0.4.0's memory graph (open a mind, stamp provenance, reconstruct a
66
+ source, history, revisions); hosts no longer import `abstractmemory`. ADR 0011. See
67
+ [docs/integrations/abstractmemory.md](docs/integrations/abstractmemory.md).
68
+ - **`MEMORY_REVISE`** effect and `memory_revise` VisualFlow node: one atomic revision of a mind
69
+ (assert / close / narrow) as a workflow step, stamped with the step that applied it.
70
+ - **Ledger provenance**: `LedgerStore.get_record(run_id, seq)` point reads, a step context for
71
+ effect handlers, and a digested `step` / `artifact` / `diary_entry` source ref on every memory
72
+ write the runtime performs (`reconstruct_source` answers `ok`, `partial`, `mismatch`,
73
+ `source_gone` or `unsupported`).
74
+ - Upgrade note: requires AbstractMemory 0.4.0, whose vector re-encoding is one-way; move every
75
+ process sharing a memory home together.
76
+
77
+ ## What's new in 0.14.0
78
+
79
+ - **Replay view** (`abstractruntime.replay`): one deterministic reducer turns a run tree's ledger
80
+ into the view every client renders (status, the interaction to answer, messages, activities,
81
+ artifacts), with incremental deltas. Every ledger store now numbers records with a durable
82
+ per-run `seq` cursor (`list_after`). See [docs/replay.md](docs/replay.md).
83
+ - **Session tool policy**: a conversation's standing approve/deny is applied before any approval
84
+ wait, with an `abstract.tool_policy_decision` audit record. See
85
+ [docs/tool-approval.md](docs/tool-approval.md#session-tool-policy-a-conversations-standing-word).
86
+ - Upgrade note: hash-chained JSONL ledgers written by 0.14.0 fail an older `verify_ledger_chain`;
87
+ upgrade writers and verifiers together.
88
+
62
89
  ## AbstractFramework ecosystem
63
90
 
64
91
  AbstractRuntime is one component of the wider [AbstractFramework](https://github.com/lpalbou/AbstractFramework) ecosystem:
@@ -4,10 +4,37 @@
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.8.2 • **Python:** 3.10+
7
+ **Version:** 0.15.0 • **Python:** 3.10+
8
8
 
9
9
  **Status:** pre-1.0 (API may evolve). For production use, pin versions and follow `CHANGELOG.md`.
10
10
 
11
+ ## What's new in 0.15.0
12
+
13
+ - **Memory facade** (`abstractruntime.integrations.abstractmemory.memory_facade.MemoryFacade`): the one
14
+ host surface for AbstractMemory 0.4.0's memory graph (open a mind, stamp provenance, reconstruct a
15
+ source, history, revisions); hosts no longer import `abstractmemory`. ADR 0011. See
16
+ [docs/integrations/abstractmemory.md](docs/integrations/abstractmemory.md).
17
+ - **`MEMORY_REVISE`** effect and `memory_revise` VisualFlow node: one atomic revision of a mind
18
+ (assert / close / narrow) as a workflow step, stamped with the step that applied it.
19
+ - **Ledger provenance**: `LedgerStore.get_record(run_id, seq)` point reads, a step context for
20
+ effect handlers, and a digested `step` / `artifact` / `diary_entry` source ref on every memory
21
+ write the runtime performs (`reconstruct_source` answers `ok`, `partial`, `mismatch`,
22
+ `source_gone` or `unsupported`).
23
+ - Upgrade note: requires AbstractMemory 0.4.0, whose vector re-encoding is one-way; move every
24
+ process sharing a memory home together.
25
+
26
+ ## What's new in 0.14.0
27
+
28
+ - **Replay view** (`abstractruntime.replay`): one deterministic reducer turns a run tree's ledger
29
+ into the view every client renders (status, the interaction to answer, messages, activities,
30
+ artifacts), with incremental deltas. Every ledger store now numbers records with a durable
31
+ per-run `seq` cursor (`list_after`). See [docs/replay.md](docs/replay.md).
32
+ - **Session tool policy**: a conversation's standing approve/deny is applied before any approval
33
+ wait, with an `abstract.tool_policy_decision` audit record. See
34
+ [docs/tool-approval.md](docs/tool-approval.md#session-tool-policy-a-conversations-standing-word).
35
+ - Upgrade note: hash-chained JSONL ledgers written by 0.14.0 fail an older `verify_ledger_chain`;
36
+ upgrade writers and verifiers together.
37
+
11
38
  ## AbstractFramework ecosystem
12
39
 
13
40
  AbstractRuntime is one component of the wider [AbstractFramework](https://github.com/lpalbou/AbstractFramework) ecosystem:
@@ -27,9 +27,10 @@ In this repo, the AbstractCore wiring lives under `src/abstractruntime/integrati
27
27
  - `manual_testing.md` — manual smoke tests and how to run the test suite
28
28
  - `artifacts.md` — Runtime artifact identity, descriptors, provenance, catalog search, and access stats
29
29
  - `integrations/abstractcore.md` — wiring `LLM_CALL` / `TOOL_CALLS`, the `config_facade` models/engines/host-jobs passthroughs for hosts, the `structured_facade` response_format check for hosts, cached sessions with per-session prompt-cache listing/clearing, host memory snapshots, model-residency listings, locks and model switching, live token streaming, workspace-scoped tools, durable bloc prompt-cache control, media inputs, generated media outputs, video progress events, and tool approval waits via AbstractCore
30
+ - `integrations/abstractmemory.md` — the AbstractMemory memory facade (ADR 0011): open a mind, stamp provenance from the step context, reconstruct a source from the ledger (`get_record`), history and revisions, and the `MEMORY_REVISE` effect / `memory_revise` node
30
31
  - `tools-comms.md` — enabling the optional comms toolset (email/WhatsApp/Telegram)
31
32
  - `email.md` — email for each user: run-scoped account binding and the host resolver, sending without asking (self and pre-authorised recipients), the durable event inbox and mail feeder, the `email.received@1` trigger on the primary or any other mailbox of the user, mail verbs for flows (changes and sends only on a Read and write mailbox: `email_mailbox_read_only`, `email_mailbox_cannot_send`), and the send-email action
32
- - `tool-approval.md` — tool risk tiers, the run-policy rank ceiling, and per-call refiners (the `send_email` recipient rule: self and pre-authorised recipients)
33
+ - `tool-approval.md` — tool risk tiers, the run-policy rank ceiling, the session tool policy (a conversation's standing approve/deny, applied before any approval wait), and per-call refiners (the `send_email` recipient rule: self and pre-authorised recipients)
33
34
  - `api.md#workflowbundles-flow-and-visualflow-distribution` — VisualFlow compiler APIs, media nodes, and document nodes (`read_pdf` / `write_pdf` / `write_docx`)
34
35
  - `api.md#sessions-and-history` — session history replay: one window, the most recent 50,000 tokens of whole turns (`HISTORY_REPLAY_MAX_TOKENS`), returned as a `ReplayedHistory` whose `.report` records what was replayed and dropped
35
36
  - `api.md#conversation-search` — keyword search over a plane's conversations (`ConversationSearch`): questions, answers and the turn's artifacts, one SQLite FTS5 trigram index per plane, incremental `sync` with a time budget, exact then fuzzy matching
@@ -41,6 +42,7 @@ In this repo, the AbstractCore wiring lives under `src/abstractruntime/integrati
41
42
  - `entity-runtime.md` — per-entity runtimes for summoned entities: homes, the one-writer lease, act-only diary privacy (`$act_only` refs), durable visit waits with deadlines
42
43
  - `evidence.md` — artifact-backed evidence capture for external-boundary tools
43
44
  - `mcp-worker.md` — MCP worker CLI (`abstractruntime-mcp-worker`)
45
+ - `replay.md` — the replay view: one reconstruction of a run tree (status, the interaction to answer, messages, one activity per execution, artifacts, usage, the workflow it executes) that every client renders; the durable cursor (`seq`, `list_after`); conformance fixtures
44
46
  - `snapshots.md` — snapshot/bookmark model and stores
45
47
  - `provenance.md` — tamper-evident hash-chained ledger
46
48
  - `limits.md` — runtime-aware `_limits` namespace and APIs
@@ -24,6 +24,12 @@ host needed, with no rule saying whose job it was to close the gap.
24
24
  2. A host never works around a missing name by importing `abstractcore` directly, vendoring the
25
25
  code, or guessing a replacement. It raises the gap to the runtime (backlog item or PR) and
26
26
  pins the runtime floor that carries the fix.
27
+ The same holds one level down and for whole capabilities, not only names: when a host finds
28
+ a FEATURE or CAPABILITY missing (a voice operation, a mail verb, a media task, a lookup), the
29
+ runtime, which does the integration, surfaces it through a facade, a typed refusal
30
+ (`CapabilityUnavailableError`, a 501 with the install hint) or a backlog item. A missing
31
+ capability is never a reason for a host to import a lower-level package (AbstractCore,
32
+ AbstractVoice, AbstractMemory, their dependencies) directly.
27
33
  3. A re-export is unchanged in identity (`facade.name is abstractcore.module.name`) and listed in
28
34
  the facade's `__all__`; the facade documents which AbstractCore version introduced the name.
29
35
  4. The facades are additive within a minor line: a name, once exported, is not removed without
@@ -0,0 +1,104 @@
1
+ # ADR 0010: One replay of the ledger, many views
2
+
3
+ Status: Accepted.
4
+ Date: 2026-10-27
5
+
6
+ ## Context
7
+
8
+ The run ledger is the record of a run. Every client that shows a run needs the same few facts
9
+ about it: its status, the approval or question it is waiting on, the replies, the tool calls and
10
+ the steps. Until this decision, each client worked those facts out for itself from raw ledger
11
+ records, run snapshots and its own memory. Panel-chat, the AbstractCode terminal client, the
12
+ desktop Assistant, the iPhone and watch apps, the Observer, AbstractFlow and both gateway
13
+ consoles each had their own reconstruction. The inventory, with file:line anchors, is in
14
+ [backlog 0854](../backlog/planned/0854_replay_view.md). The reconstructions disagreed on the same
15
+ run:
16
+
17
+ - 2026-09-29: a delegated child's tool approval showed as "Approval needed" on one client and as
18
+ "Running a tool" on another. A delegation wait displaced the person-facing wait, and a `$slim`
19
+ dedup pointer was left unresolved.
20
+ - 2026-10-04: a `wait_until` timer with no resume record left 182 of 3,278 runs showing "Waiting
21
+ for you" after they had completed.
22
+ - 2026-10-11: one Agent node execution showed as two steps, because nothing in the records names
23
+ the execution.
24
+
25
+ The operator's ruling (framework root backlog 0993,
26
+ `abstractframework/docs/backlog/planned/0993_one_ledger_replay_many_views.md`): "there should be
27
+ only one unified way to replay the ledger, on top of which we could have different views", and
28
+ "logic should not be in the thin client". Each client decides what to show and how to forward
29
+ the requests of the users and entities it serves.
30
+
31
+ Durability had a gap of its own. The SQLite ledger had a per-run `seq` and the JSONL ledger had
32
+ none. The gateway's cursor was a list position, and the file-to-SQLite migration renumbered
33
+ records (gateway backlog 0082).
34
+
35
+ ## Decision
36
+
37
+ 1. **One reducer, in the runtime.** `abstractruntime.replay` is the only code that turns ledger
38
+ records into run state for display:
39
+ - `replay(records_by_run, runs_by_id)` folds a run tree's records and durable snapshots into a
40
+ `ReplayView`.
41
+ - `ReplayView.apply(records)` folds newer records into it and returns the delta.
42
+ - `replay(all)` is `apply` over every record, so it equals folding the same records in chunks.
43
+
44
+ The reducer is pure and deterministic: no I/O and no clock, and its input is records plus
45
+ snapshots. Its JSON is versioned (`replay_view_v1`). A change in meaning is a new version,
46
+ never a silent change.
47
+ 2. **The reducer owns these rules.** Each rule below was a divergence between clients:
48
+ - The run tree comes from delegation waits (`subworkflow:<id>`), `start_subworkflow` results
49
+ and the snapshots' `parent_run_id`. When the two disagree, the ledger's link wins.
50
+ - A wait is over when its run records a `resume` for its key OR any later step of the same run
51
+ exists. Observability events are not steps.
52
+ - The person-facing interaction is the newest open approval, question or prompted event
53
+ anywhere in the tree. A delegation, a timer or a pause never is one.
54
+ - Status precedence: a terminal snapshot, then the ledger's terminal record, then an open wait,
55
+ then running.
56
+ - `$slim` pointers are resolved against the STARTED record. A pointer that cannot be resolved
57
+ is dropped and named in `warnings`.
58
+ - Executions follow AbstractFlow's `executionIdFor` rules.
59
+ - Each run names the workflow it executes (`bundle_id@version:flow_id`; the root's flow is its
60
+ entrypoint). Workflows are the framework's native unit.
61
+ 3. **The durable cursor is the per-run ledger `seq`.**
62
+ - Every ledger store numbers records 1, 2, 3, … per run. JSONL persists the number on append,
63
+ allocated under an advisory file lock. A line written before the field existed is numbered
64
+ by its position.
65
+ - Every store answers `list_after(run_id, after, limit)`.
66
+ - `SqliteLedgerStore.import_records` keeps `seq` across a migration.
67
+ - A view's cursor is the seq of each run in its tree. Its token `<run id prefix>:<seq>.…` is
68
+ the view's ETag and the SSE event id.
69
+ 4. **Hosts serve the view, and clients render it.**
70
+ - AbstractGateway serves `GET /runs/{id}/view` (ETag, 304, `?at=<token>`) and
71
+ `GET /runs/{id}/view/stream` (one `view`, then `delta` events, `Last-Event-ID`). There is
72
+ one cached view per run tree, folded once per appended record and fanned out to every
73
+ subscriber, with no timed re-parse.
74
+ - Clients act through the host's commands. The view's `interaction.command` is the resume to
75
+ send. Clients hold no run state that the server could replay.
76
+ - A client may keep a local view only as a cache of these deltas (`apply_delta`). It never
77
+ builds one from raw records.
78
+
79
+ ## Enforcement
80
+
81
+ - A client or host change that derives status, waits, tool rows or messages from raw ledger
82
+ records, outside `abstractruntime.replay`, conflicts with this ADR. The fix is a reducer change
83
+ with a fixture, or a view field.
84
+ - A reducer change that alters an existing fixture's expected view needs one of two things: the
85
+ fixture's diff in the PR and its reason, or a new `replay_view_vN` when the meaning of a field
86
+ changes.
87
+ - A new ledger store implements `list_after`, and its records carry `seq`. A migration between
88
+ stores preserves `seq`.
89
+
90
+ ## Validation
91
+
92
+ - `tests/test_replay_conformance.py`: the conformance cases shipped in
93
+ `abstractruntime.replay.conformance` (redacted real ledgers and synthetic cases), each with its
94
+ expected view and hand-written semantic checks.
95
+ - `tests/test_replay_invariants.py`: replay equals fold over any chunking and interleaving,
96
+ idempotence, delta round trips, and header-safe cursor tokens.
97
+ - `tests/test_ledger_cursor_invariants.py` and `tests/test_jsonl_ledger_seq_cross_process.py`:
98
+ the invariants of gateway backlog 0082 at store level (completeness, `list_after` equals a
99
+ replay from the same cursor, cursor stability across reopen and migration, recovery), and dense
100
+ seqs under concurrent processes.
101
+ - AbstractGateway `tests/test_gateway_replay_view.py`, `tests/test_migrate_preserves_ledger_seq.py`
102
+ and the principal isolation matrix: the routes through the real app.
103
+ - Every client that renders runs runs the conformance fixtures in its CI once it migrates
104
+ (backlog 0854).
@@ -0,0 +1,131 @@
1
+ # ADR 0011: The memory facade is the complete host surface for AbstractMemory
2
+
3
+ Status: Accepted.
4
+ Date: 2026-10-27
5
+
6
+ ## Context
7
+
8
+ AbstractMemory ADR 0003 (one semantic temporal graph, every memory tied to the ledger, every change a revision)
9
+ rules that every memory a mind holds names the ledger sources it came from, and that the verbatim of any source can
10
+ be reconstructed. AbstractMemory returns references; it never reads a ledger. The ledger, the artifacts, the diary
11
+ chain and the event inbox belong to this package, so two jobs land here:
12
+
13
+ - **Stamping.** The runtime performs memory writes for hosts (`MEMORY_FORM`, `MEMORY_KG_ASSERT`, the `DIARY_WRITE`
14
+ projection). The audit of 2026-10-27 (`abstractframework/untracked/memory-transition/audit/abstractruntime_entity.md`)
15
+ found that none of them wrote a ledger row address: they wrote `run_id`/`turn_id` (`writer_run_id` on the KG lane),
16
+ and on the home-direct entity path the `run_id` is a synthetic `chat-<session_id>` that no store can load. The
17
+ handlers could not do better: an effect handler received `(run, effect, default_next_node)` and nothing told it
18
+ which ledger row its own step had.
19
+ - **Reconstruction.** The only addressable ledger unit is `(run_id, seq)` (`step_id` is shared by a STARTED row and
20
+ its terminal row). `LedgerStore` had no read by address, `list()` did not return `seq`, terminal rows hold `$slim`
21
+ markers instead of payload bytes the STARTED row already holds, and oversized leaves may be offloaded to the
22
+ artifact store. Runs, ledgers, artifacts and inbox payloads are deletable.
23
+
24
+ And one boundary: ADR 0008 decision 2 already names AbstractMemory as a package a host must not import, yet no
25
+ AbstractMemory facade existed, so AbstractGateway imports `abstractmemory` directly (34 lines across 8 files in the
26
+ audit). The hole is the same as the one ADR 0008 closed for AbstractCore: a facade that lags what hosts need, with
27
+ no rule saying whose job it is to close the gap.
28
+
29
+ ## Decision
30
+
31
+ 1. **One host surface.** `abstractruntime.integrations.abstractmemory.memory_facade` (`MemoryFacade`) and the existing
32
+ effect-handler builders of `abstractruntime.integrations.abstractmemory` (`build_memory_kg_effect_handlers`,
33
+ `build_memory_seam_effect_handlers`, `build_entity_brain_effect_handlers`) are the ONLY surface through which a
34
+ host reaches AbstractMemory. The facade opens a mind (`MemoryFacade.open_mind(path)`: the SQLite triple store,
35
+ journal and `abstractmemory.graph.MemoryGraph` of one home), exposes the graph reads (`history`, `sources_of`,
36
+ `derived_from_source`), stamps provenance (`stamp`) and reconstructs sources (`reconstruct_source`). It is
37
+ complete by contract: a name or capability a host needs and cannot reach through it is a runtime defect, fixed by
38
+ adding it here and cutting a patch release. A host never imports `abstractmemory` to work around a gap (ADR 0008
39
+ decision 2 applies unchanged).
40
+ 2. **The ledger row address is `(run_id, seq)`.** `LedgerStore.get_record(run_id, seq)` returns one record with its
41
+ `$slim` markers resolved against the STARTED row of the same `step_id` and, under `OffloadingLedgerStore`, its
42
+ offloaded `{"$artifact": id}` leaves rehydrated; `list(run_id)` records carry `"seq"`. `seq` is the per-run
43
+ record number of ADR 0010 (runtime 0.14.0): SQLite's key, persisted on each JSON-file line (lines written before
44
+ it read as their position), excluded from the hash chain. `append()` returns the seq of the row it wrote.
45
+ 3. **The runtime stamps every memory write it performs.** The runtime publishes the current step to the handler it is
46
+ executing (`abstractruntime.core.step_context`: `run_id`, `seq` of the step's STARTED row, `step_id`, `node_id`,
47
+ `attempt`, `effect_type`). The memory writers stamp through `MemoryFacade.stamp`: a `step` ref `(run_id, seq,
48
+ step_id)` for the writing effect, an `artifact` ref for each verbatim artifact (`payload_ref`, `span_id`), a
49
+ `diary_entry` ref for a diary projection. The new `sources` list is additive; the legacy flat keys (`run_id`,
50
+ `turn_id`, `writer_run_id`, ...) stay so existing readers keep working.
51
+ 4. **A synthetic run id is never a source.** A run id that no store can load (`chat-<sid>`, `diary:<eid>` used as a
52
+ run, `global_memory`) is never stamped as a `run` or `step` ref; a `seq` is never guessed. When the runtime cannot
53
+ name a ledger source, the stamp carries what is real (an artifact, a diary entry) or nothing new, and the graph
54
+ write path (`MemoryGraph.apply_revision`, `ProvenanceRequired`) refuses an ungrounded write. That refusal is the
55
+ intended outcome; fabricating a ref to pass it is a defect.
56
+ 5. **Reconstruction never raises for a missing source.** `MemoryFacade.reconstruct_source(ref)` answers
57
+ `{"status": "ok", "kind", "content", "metadata"}`, `{"status": "source_gone", "reason"}` when the run, ledger row,
58
+ artifact, diary entry or event no longer exists, or `{"status": "unsupported", "reason"}` for a kind the host did
59
+ not give the facade a store for (or one with no indexed path, `message` today).
60
+ 6. **The facade is additive within a minor line**, like ADR 0008 decision 4: a name, once exported, is not removed
61
+ without a deprecation note and a major or minor bump.
62
+
63
+ ## Consequences
64
+
65
+ ### Positive
66
+ - Every memory the runtime forms in a real run can be traced to the exact ledger row (and artifact) it came from,
67
+ and that row reads back verbatim with one call.
68
+ - A host's import-boundary test for AbstractMemory becomes a true gate, as it is for AbstractCore.
69
+ - Deleted sources are a typed answer, so a reader can say "the source of this memory is gone" instead of failing.
70
+
71
+ ### Negative
72
+ - The facade needs AbstractMemory's graph package (`abstractmemory.graph`, AbstractMemory 0.4.0) for `open_mind`,
73
+ `stamp` and the graph reads; the memory writers stamp through it, so the runtime's AbstractMemory floor moves to
74
+ 0.4.0 with the release that carries this ADR. `get_record` and the reconstruction of steps and artifacts need no
75
+ AbstractMemory at all.
76
+ - Memory written on the home-direct entity path (synthetic `chat-<sid>` runs) carries artifact refs only until that
77
+ path runs as real runs; derived writes outside any effect (world models, tending, the night passes) carry no
78
+ ledger source until backlog 0857 lands.
79
+
80
+ ### Neutral
81
+ - `seq` is ADR 0010's per-run record number (persisted on JSON-file lines, excluded from hashes); the diary chain and
82
+ the record digests a memory stamps exclude it.
83
+ - The step context is out of band (a `ContextVar`, like the progress callback): effect payloads stay JSON and a
84
+ handler called directly, outside a runtime step, sees no step.
85
+
86
+ ### Open decisions (operator)
87
+ - **Durability of a JSON-file row address: decided, option (a).** Of the two options (a) persist `seq` inside each
88
+ JSON-file record at append, (b) SQLite plane ledgers, runtime 0.14.0 shipped (a) with ADR 0010 (the per-run `seq`
89
+ is the durable cursor, persisted on each JSONL line under a file lock, excluded from the hash chain; lines written
90
+ before it read as their position). The row address therefore survives a rewrite: `get_record` and the JSON-file
91
+ row index find a record by its persisted `seq` (never by line position), and a step ref whose row was dropped
92
+ answers `source_gone`.
93
+ - **Memory ownership.** `owner_id` is a partition string derived from the run (`run`: the run id, `session`:
94
+ `session_memory_<sid>`, `global`: the plane's global owner). The runtime refuses a payload `owner_id` the run does
95
+ not derive, but a session id is still caller-chosen upstream. The full fix (owner = the principal, scope = the
96
+ kind of memory) is an operator decision (AbstractMemory ADR 0003 decisions 2/13 as amended).
97
+
98
+ ## Enforcement
99
+ - Code review: a runtime memory write site that does not stamp through `MemoryFacade.stamp`, or that builds a
100
+ `run`/`step` ref from a run id it cannot load or a seq it did not get from the step context, is rejected.
101
+ - A host need that the facade does not cover becomes a runtime backlog item or PR before the host ships; the host's
102
+ changelog names the runtime version that closes it.
103
+ - The kernel import boundary (`tests/test_runtime_install_boundary.py`) stays green: AbstractMemory is imported
104
+ lazily, inside functions, everywhere in this package, the facade included; the facade imports no AbstractCore.
105
+ - AbstractGateway burns its direct `abstractmemory` imports down onto this facade (its boundary test, never an
106
+ exemption for a name the facade could carry).
107
+
108
+ ## Validation
109
+ - `tests/test_ledger_get_record.py`: `get_record` on the SQLite and JSON-file backends (and under
110
+ `OffloadingLedgerStore`) returns the terminal row of a slimmed step with its payload rebuilt from the STARTED row;
111
+ `list()` carries `seq`; the diary hash chain still verifies.
112
+ - `tests/test_memory_facade.py`: `reconstruct_source` for a step whose terminal row was slimmed, an artifact, a
113
+ deleted artifact (`source_gone`), a run, a diary entry, an event, a message (`unsupported`); `stamp` adds a step
114
+ ref for a real run and none for a synthetic one; facade re-exports keep identity.
115
+ - `tests/test_memory_step_provenance.py`: an episode formed by `MEMORY_FORM` in a real run carries a `step` ref whose
116
+ `(run_id, seq)` resolves through `get_record` to that `MEMORY_FORM` step; a diary projection carries a
117
+ `diary_entry` ref; the synthetic chat path carries artifact refs only; `MEMORY_KG_ASSERT` carries the step ref.
118
+
119
+ ## Backlog links
120
+ - Implementation: [0856](../backlog/completed/0856_memory_facade_and_ledger_provenance.md) (memory facade, ledger row
121
+ address, step context, stamping).
122
+ - Follow-up: [0857](../backlog/planned/0857_entity_direct_memory_writes_provenance.md) (entity writes outside any
123
+ effect: world models, tending, the night passes).
124
+ - AbstractMemory backlog 0056 (`abstractmemory.graph`: `SourceRef`, `Provenance`, `MemoryGraph`).
125
+
126
+ ## Related
127
+ - ADR 0003 (tamper-evident hash chain: `seq` is excluded from the record hash), ADR 0008 (integration facades are the
128
+ complete host surface; this ADR is its AbstractMemory counterpart).
129
+ - AbstractMemory ADR 0002 (AbstractMemory owns the graph), ADR 0003 (one graph, ledger provenance, revisions).
130
+ - Root ADR 0007 (active context vs stored memory), ADR 0011 (`span_id` = `artifact_id`).
131
+ - AbstractGateway ADR 0001 (lower-level access through runtime facades).
@@ -20,7 +20,9 @@ When you ask "why is it designed this way?", the answer is in an ADR. ADRs are:
20
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 |
21
21
  | 0006 | [Runtime Owns Durable AbstractCore Bloc Prompt-Cache Control](0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md) | Accepted | 2026-05-20 | Hosts should use Runtime for durable bloc/KV controls and binding-aware execution |
22
22
  | 0007 | [Runtime Relays Core-Owned Model Residency Truth](0007_runtime_relays_core_owned_model_residency_truth.md) | Accepted | 2026-05-21 | Runtime reports loaded state only from AbstractCore residency truth |
23
- | 0008 | [Integration Facades Are the Complete Host Surface](0008_integration_facades_are_the_complete_host_surface.md) | Accepted | 2026-10-27 | Every AbstractCore name a host needs is a runtime facade re-export; a gap is a runtime patch, never a host import |
23
+ | 0008 | [Integration Facades Are the Complete Host Surface](0008_integration_facades_are_the_complete_host_surface.md) | Accepted | 2026-10-27 | Every AbstractCore name or capability a host needs is surfaced by the runtime (facade re-export, typed refusal, backlog); a gap is a runtime patch, never a host import of a lower-level package |
24
+ | 0010 | [One Replay of the Ledger, Many Views](0010_one_replay_many_views.md) | Accepted | 2026-10-27 | `abstractruntime.replay` is the only reconstruction of run state from the ledger; hosts serve its view, clients render it; the per-run ledger `seq` is the durable cursor |
25
+ | 0011 | [The Memory Facade Is the Complete Host Surface for AbstractMemory](0011_memory_facade_is_the_complete_host_surface_for_abstractmemory.md) | Accepted | 2026-10-27 | Hosts reach AbstractMemory only through `memory_facade` and the effect-handler builders; the runtime stamps ledger provenance (step `(run_id, seq)`, artifact, diary entry) on every memory write it performs, never from a synthetic run id; reconstructing a deleted source answers `source_gone`, never raises |
24
26
 
25
27
  ## Relationship to Backlog
26
28
 
@@ -36,6 +38,8 @@ ADRs explain *why*. Backlog items explain *what* and *how*.
36
38
  | 0006 | `backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md` |
37
39
  | 0007 | `backlog/completed/0035_model_residency_provider_truth_for_local_http_clients.md`, `backlog/proposed/0036_local_media_residency_bridge_to_core_residency.md` |
38
40
  | 0008 | AbstractGateway backlog 1044 (mailbox access) and `tests/test_gateway_import_boundary.py`; runtime 0.13.1 `email_facade.resolve_srv_default` |
41
+ | 0010 | `backlog/planned/0854_replay_view.md`; AbstractGateway backlog 0943 (view routes), 0082 (durable cursor); framework root 0993 |
42
+ | 0011 | `backlog/completed/0856_memory_facade_and_ledger_provenance.md`, `backlog/planned/0857_entity_direct_memory_writes_provenance.md`; AbstractMemory backlog 0056 |
39
43
 
40
44
  ## Adding New ADRs
41
45
 
@@ -133,6 +133,12 @@ Run index and creation (all built-in run stores, including the offloading wrappe
133
133
  - `JsonFileRunStore` event-wait and mailbox indexes (`list_event_waiters`, `list_event_waiters_by_prefix`, `list_mailbox_runs`) see what another process saved on the same folder (a split gateway: API process + runner process). Before each lookup the store reads its change signal (the creation log's size and the folder's mtime): when either moved, or at least every `EVENT_INDEX_REFRESH_S` (2 s), it stats each running or waiting run and re-reads the ones whose file changed since it last filed them. An idle store pays two stats per lookup; its own saves are never re-read. `event_index_stats()` returns `{refreshes, refiled, tracked}`.
134
134
  - `JsonFileRunStore.change_token()` answers "did any run of this folder change?" with one stat: `(creation-log size, active-index counter)`. Every save, create and delete through the store moves the counter; another process's create, delete or became-active line moves the log size. Not seen: another process re-saving a run that stays active (one ticking process per folder); ending a run, or re-saving a finished one, writes `=<run_id>`. `changed_run_ids(token)` names the runs this store changed since `token`, or `None` when that is unknown (the log moved, or more than 8,192 changes ago). `ObservableLedgerStore.change_token()` / `changed_run_ids(token)` do the same for ledger appends (process-local). The gateway runner's scan gate and its mail notification check compare these tokens instead of reading the directory.
135
135
 
136
+ The durable cursor (ADR 0010):
137
+ - Every ledger store numbers a run's records 1, 2, 3, … and `list()` returns each record with its `seq`. `JsonlLedgerStore` writes it on each line, allocated under an advisory file lock that spans the head read and the write, so another process appending to the same run never takes the same number. A line written before the field existed is numbered by its position. `append()` returns the seq.
138
+ - `LedgerStore.list_after(*, run_id, after, limit=1000) -> (records, last_seq)`: the records after a seq. SQLite does an indexed read; JSONL seeks to the byte offset where the previous read ended; the default implementation filters `list()`. The decorators (observable, hash-chained, offloading) delegate it.
139
+ - `ObservableLedgerStore` hands subscribers the record with its `seq`.
140
+ - `SqliteLedgerStore.import_records(run_id, records)` copies a run's ledger in, keeping each `seq`. A migration from files to SQLite therefore keeps every cursor valid. It refuses a run that already has records.
141
+
136
142
  Common decorators:
137
143
  - `ObservableLedgerStore` for subscriptions (`src/abstractruntime/storage/observable.py`)
138
144
  - `HashChainedLedgerStore` + `verify_ledger_chain(...)` for tamper-evidence (`src/abstractruntime/storage/ledger_chain.py`)
@@ -326,6 +332,25 @@ This produces a portable record of a run’s state + ledger + artifacts suitable
326
332
  When available, it also includes `resolved_actions`: bounded capability/action summaries derived
327
333
  from Core route resolution and persisted from `LLM_CALL` results.
328
334
 
335
+ ## Replay view (one reconstruction of a run, every client)
336
+
337
+ Implementation: `src/abstractruntime/replay/` (ADR 0010). Guide: [replay.md](replay.md).
338
+
339
+ - `replay(records_by_run, runs_by_id=None, *, root_run_id=None) -> ReplayView`: folds a run
340
+ tree's ledger records (`{run_id: [records in ledger order]}`) and durable snapshots
341
+ (`RunState` or dicts) into a view. Pure and deterministic.
342
+ - `ReplayView.apply(records, *, runs_by_id=None) -> delta`: folds newer records and snapshots.
343
+ The same delta is kept as `view.last_delta`. `apply(view, records)` is the module-level form.
344
+ - `ReplayView.to_json()`: the view, `replay_view_v1` (status, `interaction`, `open_waits`,
345
+ `runs`, `messages`, `activities`, `artifacts`, `usage`, `workflow`, `cursor`, `warnings`).
346
+ Other reads: `cursor`, `run_ids`, `last_seq(run_id)`, `status()`, `run_statuses()` and
347
+ `is_terminal()`.
348
+ - `apply_delta(view_json, delta)`, `diff_views(old, new)` and `parse_cursor_token(token)`: the
349
+ client side of a delta, the delta between two views, and a cursor token as `{run id prefix:
350
+ seq}`.
351
+ - `wait_kind(wait)`, `workflow_ref(workflow_id)`, `PERSON_FACING_KINDS`,
352
+ `TERMINAL_STATUSES`, `REPLAY_VIEW_VERSION`.
353
+
329
354
  ## Runtime-owned integrations
330
355
 
331
356
  ### AbstractCore (LLM + tools)
@@ -410,7 +435,28 @@ Docs: `integrations/abstractcore.md`.
410
435
 
411
436
  Implementation: `src/abstractruntime/integrations/abstractmemory/effect_handlers.py`.
412
437
 
413
- This provides handlers for `MEMORY_KG_*` effects (opt-in wiring layer).
438
+ This provides handlers for `MEMORY_KG_*` effects and `MEMORY_REVISE` (opt-in wiring layer):
439
+ `build_memory_kg_effect_handlers(store=, run_store=, now_iso=, journal=None)`. `MEMORY_REVISE` applies one revision of
440
+ a mind (assert / close / narrow ops) through `abstractmemory.graph.MemoryGraph`, stamped with the step that applied it;
441
+ VisualFlow node type `memory_revise`. Payload and result: [MEMORY_REVISE](integrations/abstractmemory.md#memory_revise-memory-reconsideration-as-a-workflow-step).
442
+
443
+ ### AbstractMemory facade (host surface)
444
+
445
+ `abstractruntime.integrations.abstractmemory.memory_facade` is the only way a host reaches AbstractMemory (ADR 0011;
446
+ AbstractMemory 0.4.0+):
447
+
448
+ - `MemoryFacade.open_mind(path, *, embedder=None, **stores)`; `MemoryFacade(graph=, ledger_store=, run_store=,
449
+ artifact_store=, diary_store=, event_inbox=, runtime_id=)`; `.graph`, `.store`, `.journal`
450
+ - `stamp(provenance, *, run_id, seq=None, step_id=None, artifact_ids=(), runtime_id=None) -> dict` and
451
+ `stamp_current_step(provenance, *, run_id, artifact_ids=())`: add `step` / `run` / `artifact` SourceRefs, never for a
452
+ synthetic run id (`is_real_run`), never a guessed seq
453
+ - `reconstruct_source(ref) -> {"status": "ok" | "source_gone" | "unsupported", ...}`; never raises for a missing source
454
+ - `history(memory_id)`, `sources_of(memory_id)`, `derived_from_source(ref)`, `apply_revision(revision)`
455
+ - `GATEWAY_NAMES`: AbstractMemory names re-exported unchanged (`memory_facade.X is abstractmemory.X`), resolved lazily
456
+
457
+ Ledger row address: `LedgerStore.get_record(run_id, seq)` (slim markers resolved, offloaded leaves rehydrated),
458
+ `list()` records carry `"seq"`, `append()` returns it. Step context: `abstractruntime.core.step_context.current_step_context(run_id)`
459
+ inside an effect handler. Details: [integrations/abstractmemory.md](integrations/abstractmemory.md).
414
460
 
415
461
  ## Utilities (host UX)
416
462
 
@@ -424,6 +470,7 @@ This provides handlers for `MEMORY_KG_*` effects (opt-in wiring layer).
424
470
  - `architecture.md` — component map + durability invariants
425
471
  - `faq.md` — common questions and gotchas
426
472
  - `integrations/abstractcore.md` — `LLM_CALL` / `TOOL_CALLS` wiring
473
+ - `integrations/abstractmemory.md` — memory facade, provenance stamping, `MEMORY_REVISE`
427
474
 
428
475
  ### Host ASGI serving
429
476