AbstractRuntime 0.15.0__tar.gz → 0.15.2__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 (867) hide show
  1. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/CHANGELOG.md +20 -0
  2. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/PKG-INFO +13 -2
  3. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/README.md +12 -1
  4. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/README.md +13 -3
  5. abstractruntime-0.15.2/docs/backlog/completed/0862_is_empty_accepts_lists.md +29 -0
  6. abstractruntime-0.15.2/docs/backlog/completed/0863_index_build_never_loses_a_run_created_during_it.md +48 -0
  7. abstractruntime-0.15.2/docs/backlog/planned/0858_typed_runs_run_type_stamped_at_start.md +41 -0
  8. abstractruntime-0.15.2/docs/backlog/planned/0859_replay_view_ephemeral_text_deltas.md +27 -0
  9. abstractruntime-0.15.2/docs/backlog/proposed/0860_replay_view_stop_wording_from_the_ledger.md +34 -0
  10. abstractruntime-0.15.2/docs/backlog/proposed/0861_replay_view_activity_tool_sandbox_and_call_timings.md +34 -0
  11. abstractruntime-0.15.2/docs/backlog/proposed/0862_replay_view_message_artifacts_exclude_bookkeeping.md +48 -0
  12. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/llms-full.txt +12 -1
  13. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/llms.txt +1 -1
  14. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/pyproject.toml +1 -1
  15. abstractruntime-0.15.2/release-notes.md +11 -0
  16. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/storage/json_files.py +42 -1
  17. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/visual/builtins.py +9 -4
  18. abstractruntime-0.15.2/tests/test_json_file_run_store_index_build_race.py +93 -0
  19. abstractruntime-0.15.2/tests/test_visualflow_string_contains_replace.py +102 -0
  20. abstractruntime-0.15.0/release-notes.md +0 -54
  21. abstractruntime-0.15.0/tests/test_visualflow_string_contains_replace.py +0 -43
  22. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/.github/workflows/ci.yml +0 -0
  23. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/.github/workflows/release.yml +0 -0
  24. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/.gitignore +0 -0
  25. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/ACKNOWLEDGMENTS.md +0 -0
  26. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/CODE_OF_CONDUCT.md +0 -0
  27. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/CONTRIBUTING.md +0 -0
  28. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/LICENSE +0 -0
  29. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/ROADMAP.md +0 -0
  30. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/SECURITY.md +0 -0
  31. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/README.md +0 -0
  32. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
  33. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
  34. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
  35. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/adr/0004_runtime_owns_run_scoped_media_execution_truth.md +0 -0
  36. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/adr/0005_runtime_owns_abstractcore_host_discovery_queries.md +0 -0
  37. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/adr/0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md +0 -0
  38. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/adr/0007_runtime_relays_core_owned_model_residency_truth.md +0 -0
  39. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/adr/0008_integration_facades_are_the_complete_host_surface.md +0 -0
  40. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/adr/0010_one_replay_many_views.md +0 -0
  41. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/adr/0011_memory_facade_is_the_complete_host_surface_for_abstractmemory.md +0 -0
  42. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/adr/README.md +0 -0
  43. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/api.md +0 -0
  44. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/architecture.md +0 -0
  45. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/artifacts.md +0 -0
  46. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/automations.md +0 -0
  47. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/completed/001_runtime_kernel.md +0 -0
  48. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
  49. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/completed/0030_runtime_host_facades_for_comms_telegram_and_tool_specs.md +0 -0
  50. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/completed/0032_runtime_durable_outbound_comms_truth.md +0 -0
  51. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/completed/0033_runtime_host_local_prompt_cache_export_import_surface.md +0 -0
  52. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/completed/0035_model_residency_provider_truth_for_local_http_clients.md +0 -0
  53. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/completed/0037_visualflow_generate_music_node_compiler_parity.md +0 -0
  54. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/completed/0039_runtime_music_structure_prompt_bool_contract.md +0 -0
  55. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/completed/003_wait_primitives.md +0 -0
  56. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/completed/0040_task_agnostic_local_residency_listing.md +0 -0
  57. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/completed/0041_runtime_hardware_extras_avoid_nonpermissive_document_stacks.md +0 -0
  58. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/completed/0042_core_vision_upscale_and_parameter_surface.md +0 -0
  59. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/completed/0043_runtime_vision_adapter_and_batch_surface.md +0 -0
  60. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/completed/004_scheduler_driver.md +0 -0
  61. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
  62. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
  63. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
  64. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/completed/009_artifact_store.md +0 -0
  65. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/completed/010_examples_and_composition.md +0 -0
  66. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/completed/011_subworkflow_support.md +0 -0
  67. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
  68. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
  69. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
  70. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/completed/019_runtime_host_facade_for_core_operator_surfaces.md +0 -0
  71. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/completed/020_runtime_gateway_install_boundary.md +0 -0
  72. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/completed/021_runtime_gateway_env_namespace_cleanup.md +0 -0
  73. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/completed/022_model_residency_control_plane.md +0 -0
  74. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/completed/023_truthful_local_media_residency_boundaries.md +0 -0
  75. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/completed/024_runtime_owned_run_scoped_media_execution.md +0 -0
  76. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md +0 -0
  77. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md +0 -0
  78. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/completed/028_runtime_bloc_kv_lifecycle_and_pruning.md +0 -0
  79. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/completed/029_runtime_music_generation_and_discovery_via_abstractcore.md +0 -0
  80. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/completed/0846_mlx_instance_scheduling_and_execution_controls.md +0 -0
  81. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/completed/0847_automations_v1_controller_contracts_occurrences_triggers.md +0 -0
  82. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/completed/0851_per_account_voice_stores.md +0 -0
  83. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/completed/0852_capability_refusals_are_not_retried.md +0 -0
  84. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/completed/0855_prefix_stability_contract_of_consecutive_llm_calls.md +0 -0
  85. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/completed/0856_memory_facade_and_ledger_provenance.md +0 -0
  86. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
  87. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
  88. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
  89. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
  90. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/deprecated/0034_agent_runtime_convenience_constructor.md +0 -0
  91. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
  92. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
  93. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
  94. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/deprecated/004_tests.md +0 -0
  95. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/deprecated/005_docs_updates.md +0 -0
  96. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
  97. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
  98. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
  99. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/deprecated/README.md +0 -0
  100. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
  101. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/planned/0070_standalone_wui_browser_session_security_contract.md +0 -0
  102. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
  103. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
  104. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
  105. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
  106. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/planned/0233_real_run_cancellation.md +0 -0
  107. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/planned/025_runtime_retention_and_purge_contract.md +0 -0
  108. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/planned/026_context_checkpoint_self_compression.md +0 -0
  109. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/planned/027_quote_provenance_discipline.md +0 -0
  110. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/planned/028_selective_artifact_rehydration.md +0 -0
  111. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/planned/0845_session_prompt_cache_resume_and_purge_contract.md +0 -0
  112. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/planned/0848_automations_v2_external_event_inbox_and_run_triggers.md +0 -0
  113. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/planned/0853_session_tool_policy_before_the_approval_wait.md +0 -0
  114. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/planned/0854_replay_view.md +0 -0
  115. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/planned/0857_entity_direct_memory_writes_provenance.md +0 -0
  116. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/planned/runtime_portability/0065_portable_process_and_lock_layer.md +0 -0
  117. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/planned/runtime_portability/0066_portable_io_and_media_reader.md +0 -0
  118. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/planned/runtime_portability/README.md +0 -0
  119. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/planned/runtime_systemic_reliability/0044_meta_analysis_record.md +0 -0
  120. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/planned/runtime_systemic_reliability/0045_crash_replay_harness_and_ordering_invariant.md +0 -0
  121. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/planned/runtime_systemic_reliability/0046_per_run_driver_exclusion.md +0 -0
  122. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/planned/runtime_systemic_reliability/0047_indexed_idempotency_lookup.md +0 -0
  123. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/planned/runtime_systemic_reliability/0048_durable_io_unification.md +0 -0
  124. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/planned/runtime_systemic_reliability/0049_llm_client_mechanical_split.md +0 -0
  125. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/planned/runtime_systemic_reliability/0050_control_sidecar_all_writers.md +0 -0
  126. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/planned/runtime_systemic_reliability/0051_runtime_owned_durable_event_mailbox.md +0 -0
  127. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/planned/runtime_systemic_reliability/0052_sync_store_event_loop_tripwire.md +0 -0
  128. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/planned/runtime_systemic_reliability/0053_bounded_run_vars_growth.md +0 -0
  129. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/planned/runtime_systemic_reliability/0054_runtime_health_counters.md +0 -0
  130. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/planned/runtime_systemic_reliability/0055_jsonl_store_honesty.md +0 -0
  131. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/planned/runtime_systemic_reliability/0064_prompt_cache_fingerprint_stability.md +0 -0
  132. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/planned/runtime_systemic_reliability/0067_durable_write_discipline.md +0 -0
  133. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/planned/runtime_systemic_reliability/0068_hot_path_store_reads.md +0 -0
  134. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/planned/runtime_systemic_reliability/README.md +0 -0
  135. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/proposed/0031_runtime_tool_spec_adapters_for_gateway_and_mcp.md +0 -0
  136. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/proposed/0036_local_media_residency_bridge_to_core_residency.md +0 -0
  137. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/proposed/0038_core_server_pool_residency_affinity.md +0 -0
  138. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/proposed/0069_document_renderer_professional_figures.md +0 -0
  139. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/proposed/0849_conversation_search_tool_usage_outputs_and_thinking.md +0 -0
  140. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/proposed/0850_growing_automation_history_out_of_the_controller_ledger.md +0 -0
  141. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/proposed/runtime_systemic_reliability/0056_schema_version_and_quarantine_loading.md +0 -0
  142. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/proposed/runtime_systemic_reliability/0057_trust_boundary_stamp_registry.md +0 -0
  143. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/proposed/runtime_systemic_reliability/0058_terminal_run_archival_helper.md +0 -0
  144. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/proposed/runtime_systemic_reliability/0059_memory_span_handler_extraction.md +0 -0
  145. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/proposed/runtime_systemic_reliability/0060_visualflow_compiler_decomposition.md +0 -0
  146. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/proposed/runtime_systemic_reliability/0061_root_api_deprecation_machinery.md +0 -0
  147. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/proposed/runtime_systemic_reliability/0062_dependency_honesty_extras.md +0 -0
  148. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/proposed/runtime_systemic_reliability/0063_b3_envelope_lane_unification.md +0 -0
  149. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/backlog/proposed/runtime_systemic_reliability/README.md +0 -0
  150. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/email.md +0 -0
  151. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/entity-runtime.md +0 -0
  152. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/evidence.md +0 -0
  153. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/faq.md +0 -0
  154. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/getting-started.md +0 -0
  155. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/integrations/abstractcore.md +0 -0
  156. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/integrations/abstractmemory.md +0 -0
  157. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/limits.md +0 -0
  158. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/manual_testing.md +0 -0
  159. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/mcp-worker.md +0 -0
  160. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/proposal.md +0 -0
  161. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/provenance.md +0 -0
  162. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/replay.md +0 -0
  163. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/snapshots.md +0 -0
  164. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/tool-approval.md +0 -0
  165. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/tools-comms.md +0 -0
  166. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/troubleshooting.md +0 -0
  167. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/docs/workflow-bundles.md +0 -0
  168. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/examples/01_hello_world.py +0 -0
  169. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/examples/02_ask_user.py +0 -0
  170. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/examples/03_wait_until.py +0 -0
  171. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/examples/04_multi_step.py +0 -0
  172. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/examples/05_persistence.py +0 -0
  173. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/examples/06_llm_integration.py +0 -0
  174. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/examples/07_react_agent.py +0 -0
  175. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/examples/README.md +0 -0
  176. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/mkdocs.yml +0 -0
  177. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/pytest.ini +0 -0
  178. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/scripts/backfill_diary_edges.py +0 -0
  179. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/scripts/generate_llms_full.py +0 -0
  180. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/scripts/regen_replay_conformance.py +0 -0
  181. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/__init__.py +0 -0
  182. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/automation_queries.py +0 -0
  183. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/automations/__init__.py +0 -0
  184. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/automations/adapters.py +0 -0
  185. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/automations/attention.py +0 -0
  186. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/automations/bundle.py +0 -0
  187. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/automations/bundles/automation-controller/flows/controller.json +0 -0
  188. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/automations/bundles/automation-controller/manifest.json +0 -0
  189. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/automations/commands.py +0 -0
  190. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/automations/consumers.py +0 -0
  191. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/automations/controller.py +0 -0
  192. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/automations/ledger.py +0 -0
  193. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/automations/models.py +0 -0
  194. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/automations/samples.py +0 -0
  195. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/automations/service.py +0 -0
  196. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/automations/wakes.py +0 -0
  197. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/conversation_search.py +0 -0
  198. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/core/__init__.py +0 -0
  199. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/core/config.py +0 -0
  200. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/core/effect_cancellation.py +0 -0
  201. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/core/event_keys.py +0 -0
  202. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/core/health.py +0 -0
  203. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/core/live_deltas.py +0 -0
  204. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/core/models.py +0 -0
  205. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/core/policy.py +0 -0
  206. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/core/progress_channel.py +0 -0
  207. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/core/publish.py +0 -0
  208. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/core/run_attribution.py +0 -0
  209. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/core/run_identity.py +0 -0
  210. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/core/run_lifecycle.py +0 -0
  211. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/core/run_origin.py +0 -0
  212. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/core/runtime.py +0 -0
  213. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/core/spec.py +0 -0
  214. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/core/step_context.py +0 -0
  215. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/core/tool_scope.py +0 -0
  216. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/core/vars.py +0 -0
  217. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/documents/__init__.py +0 -0
  218. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/documents/charts.py +0 -0
  219. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/documents/docx.py +0 -0
  220. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/documents/pdf.py +0 -0
  221. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/email/__init__.py +0 -0
  222. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/email/actions.py +0 -0
  223. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/email/automations.py +0 -0
  224. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/email/binding.py +0 -0
  225. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/email/feeder.py +0 -0
  226. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/email/frame.py +0 -0
  227. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/email/inbox.py +0 -0
  228. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/evidence/__init__.py +0 -0
  229. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/evidence/recorder.py +0 -0
  230. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/history_bundle.py +0 -0
  231. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/identity/__init__.py +0 -0
  232. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/identity/act_only.py +0 -0
  233. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/identity/chat.py +0 -0
  234. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/identity/communities.py +0 -0
  235. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/identity/diary.py +0 -0
  236. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/identity/digest.py +0 -0
  237. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/identity/entity_runtime.py +0 -0
  238. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/identity/fingerprint.py +0 -0
  239. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/identity/lease.py +0 -0
  240. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/identity/life.py +0 -0
  241. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/identity/memory_reader.py +0 -0
  242. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/identity/night_voice.py +0 -0
  243. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/identity/phase_graph.py +0 -0
  244. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/identity/phase_spec.py +0 -0
  245. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/identity/prelude.py +0 -0
  246. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/identity/prompt_overlay.py +0 -0
  247. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/identity/reflection.py +0 -0
  248. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/identity/spec/entity_phases.vendored.json +0 -0
  249. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/identity/substrate.py +0 -0
  250. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/identity/tool_effects.py +0 -0
  251. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/identity/tool_policy.py +0 -0
  252. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/identity/tools.py +0 -0
  253. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/identity/visit_workflow.py +0 -0
  254. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/integrations/__init__.py +0 -0
  255. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/__init__.py +0 -0
  256. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/agora_tools.py +0 -0
  257. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/command_sandbox_host.py +0 -0
  258. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/comms_facade.py +0 -0
  259. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/config_facade.py +0 -0
  260. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
  261. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/data_registry_facade.py +0 -0
  262. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
  263. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/discovery_facade.py +0 -0
  264. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/discovery_queries.py +0 -0
  265. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +0 -0
  266. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/email_facade.py +0 -0
  267. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
  268. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/factory.py +0 -0
  269. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/host_facade.py +0 -0
  270. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/llm_client.py +0 -0
  271. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/local_helper_tools.py +0 -0
  272. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
  273. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/mcp_facade.py +0 -0
  274. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
  275. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/media_subprocess.py +0 -0
  276. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
  277. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/output_specs.py +0 -0
  278. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/run_facade.py +0 -0
  279. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/server_facade.py +0 -0
  280. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
  281. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/structured_facade.py +0 -0
  282. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
  283. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/telegram_facade.py +0 -0
  284. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/tool_effects.py +0 -0
  285. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -0
  286. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/tool_inventory_facade.py +0 -0
  287. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/voice_facade.py +0 -0
  288. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/voice_library.py +0 -0
  289. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +0 -0
  290. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
  291. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractmemory/brain_handlers.py +0 -0
  292. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
  293. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractmemory/identity_support.py +0 -0
  294. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractmemory/memory_facade.py +0 -0
  295. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractmemory/seam_handlers.py +0 -0
  296. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/mail_verbs.py +0 -0
  297. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/memory/__init__.py +0 -0
  298. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/memory/active_context.py +0 -0
  299. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/memory/active_memory.py +0 -0
  300. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/memory/compaction.py +0 -0
  301. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/memory/kg_packets.py +0 -0
  302. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/memory/memact_composer.py +0 -0
  303. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/memory/recall_levels.py +0 -0
  304. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/memory/token_budget.py +0 -0
  305. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/rendering/__init__.py +0 -0
  306. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
  307. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/rendering/json_stringify.py +0 -0
  308. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/__init__.py +0 -0
  309. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/__init__.py +0 -0
  310. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/a2_delegated_approval_completed/expected_view.json +0 -0
  311. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/a2_delegated_approval_completed/manifest.json +0 -0
  312. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/a2_delegated_approval_completed/records.json +0 -0
  313. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/a2_delegated_approval_completed/runs.json +0 -0
  314. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/a_delegated_child_approval/expected_view.json +0 -0
  315. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/a_delegated_child_approval/manifest.json +0 -0
  316. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/a_delegated_child_approval/records.json +0 -0
  317. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/a_delegated_child_approval/runs.json +0 -0
  318. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/b_timer_without_resume/expected_view.json +0 -0
  319. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/b_timer_without_resume/manifest.json +0 -0
  320. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/b_timer_without_resume/records.json +0 -0
  321. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/b_timer_without_resume/runs.json +0 -0
  322. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/c_parallel_tool_batch/expected_view.json +0 -0
  323. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/c_parallel_tool_batch/manifest.json +0 -0
  324. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/c_parallel_tool_batch/records.json +0 -0
  325. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/c_parallel_tool_batch/runs.json +0 -0
  326. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/d_cancellation/expected_view.json +0 -0
  327. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/d_cancellation/manifest.json +0 -0
  328. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/d_cancellation/records.json +0 -0
  329. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/d_cancellation/runs.json +0 -0
  330. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/e2_structured_repeated_node/expected_view.json +0 -0
  331. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/e2_structured_repeated_node/manifest.json +0 -0
  332. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/e2_structured_repeated_node/records.json +0 -0
  333. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/e2_structured_repeated_node/runs.json +0 -0
  334. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/e_structured_output_agents/expected_view.json +0 -0
  335. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/e_structured_output_agents/manifest.json +0 -0
  336. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/e_structured_output_agents/records.json +0 -0
  337. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/e_structured_output_agents/runs.json +0 -0
  338. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/f_windowed_slim/expected_view.json +0 -0
  339. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/f_windowed_slim/manifest.json +0 -0
  340. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/f_windowed_slim/records.json +0 -0
  341. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/f_windowed_slim/runs.json +0 -0
  342. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/g_ask_user/expected_view.json +0 -0
  343. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/g_ask_user/manifest.json +0 -0
  344. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/g_ask_user/records.json +0 -0
  345. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/g_ask_user/runs.json +0 -0
  346. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/h_denied_approval/expected_view.json +0 -0
  347. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/h_denied_approval/manifest.json +0 -0
  348. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/h_denied_approval/records.json +0 -0
  349. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/h_denied_approval/runs.json +0 -0
  350. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/i_wait_kinds/expected_view.json +0 -0
  351. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/i_wait_kinds/manifest.json +0 -0
  352. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/i_wait_kinds/records.json +0 -0
  353. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/i_wait_kinds/runs.json +0 -0
  354. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/j_event_answered_then_pause/expected_view.json +0 -0
  355. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/j_event_answered_then_pause/manifest.json +0 -0
  356. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/j_event_answered_then_pause/records.json +0 -0
  357. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/j_event_answered_then_pause/runs.json +0 -0
  358. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/k_nested_delegation/expected_view.json +0 -0
  359. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/k_nested_delegation/manifest.json +0 -0
  360. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/k_nested_delegation/records.json +0 -0
  361. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/k_nested_delegation/runs.json +0 -0
  362. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/l_answer_then_completion/expected_view.json +0 -0
  363. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/l_answer_then_completion/manifest.json +0 -0
  364. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/l_answer_then_completion/records.json +0 -0
  365. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/l_answer_then_completion/runs.json +0 -0
  366. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/m_session_tool_policy/expected_view.json +0 -0
  367. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/m_session_tool_policy/manifest.json +0 -0
  368. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/m_session_tool_policy/records.json +0 -0
  369. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/m_session_tool_policy/runs.json +0 -0
  370. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/delta.py +0 -0
  371. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/executions.py +0 -0
  372. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/replay/view.py +0 -0
  373. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/scheduler/__init__.py +0 -0
  374. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/scheduler/convenience.py +0 -0
  375. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/scheduler/multi_store.py +0 -0
  376. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/scheduler/registry.py +0 -0
  377. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/scheduler/scheduler.py +0 -0
  378. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/session_history.py +0 -0
  379. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/session_turns.py +0 -0
  380. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/storage/__init__.py +0 -0
  381. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/storage/artifacts.py +0 -0
  382. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/storage/base.py +0 -0
  383. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/storage/change_ring.py +0 -0
  384. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/storage/commands.py +0 -0
  385. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/storage/in_memory.py +0 -0
  386. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/storage/lease.py +0 -0
  387. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/storage/ledger_chain.py +0 -0
  388. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/storage/ledger_slim.py +0 -0
  389. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/storage/observable.py +0 -0
  390. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/storage/offloading.py +0 -0
  391. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/storage/serialize.py +0 -0
  392. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/storage/session_tool_policy.py +0 -0
  393. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/storage/snapshots.py +0 -0
  394. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/storage/sqlite.py +0 -0
  395. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/storage/steer_sidecar.py +0 -0
  396. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/triggers/__init__.py +0 -0
  397. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/triggers/cloudevents.py +0 -0
  398. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/triggers/connection_events.py +0 -0
  399. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/triggers/connections.py +0 -0
  400. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/triggers/email_received.py +0 -0
  401. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/triggers/event_frame.py +0 -0
  402. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/triggers/feed.py +0 -0
  403. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/triggers/manual.py +0 -0
  404. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/triggers/protocol.py +0 -0
  405. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/triggers/registry.py +0 -0
  406. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/triggers/schedule.py +0 -0
  407. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/triggers/webhook.py +0 -0
  408. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/turn_grounding.py +0 -0
  409. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/utils/__init__.py +0 -0
  410. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/utils/atomic_files.py +0 -0
  411. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/utils/file_filters.py +0 -0
  412. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/utils/workspace_paths.py +0 -0
  413. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
  414. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
  415. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
  416. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
  417. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
  418. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
  419. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
  420. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
  421. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
  422. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
  423. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
  424. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/compiler.py +0 -0
  425. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
  426. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
  427. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
  428. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
  429. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/visual/execution_metrics.py +0 -0
  430. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/visual/executor.py +0 -0
  431. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/visual/function_library.py +0 -0
  432. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/visual/loop_back_check.py +0 -0
  433. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/visual/loop_limit_lowering.py +0 -0
  434. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
  435. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
  436. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/visual/pin_expressions.py +0 -0
  437. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/visual/reroute_lowering.py +0 -0
  438. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
  439. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/workflow_bundle/models.py +0 -0
  440. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/workflow_bundle/packer.py +0 -0
  441. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/workflow_bundle/reader.py +0 -0
  442. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/src/abstractruntime/workflow_bundle/registry.py +0 -0
  443. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/README.md +0 -0
  444. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/automation_harness.py +0 -0
  445. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/conftest.py +0 -0
  446. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/email_wp2_support.py +0 -0
  447. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/fixtures/feeds/atom.xml +0 -0
  448. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/fixtures/feeds/rdf-not-a-feed.xml +0 -0
  449. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/fixtures/feeds/rss1-malformed.xml +0 -0
  450. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/fixtures/feeds/rss1.xml +0 -0
  451. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/fixtures/feeds/rss2.xml +0 -0
  452. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/fixtures/schedule_v1_corpus.json +0 -0
  453. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/live_email/conftest.py +0 -0
  454. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/live_email/live_email_support.py +0 -0
  455. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/live_email/test_email_live_runtime.py +0 -0
  456. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/media_endpoint_profile_probe.py +0 -0
  457. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_abstractcore_comms_facade.py +0 -0
  458. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_abstractcore_discovery_facade.py +0 -0
  459. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_abstractcore_host_facade.py +0 -0
  460. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_abstractcore_run_facade.py +0 -0
  461. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_abstractcore_server_facade.py +0 -0
  462. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_abstractcore_structured_facade.py +0 -0
  463. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_abstractcore_telegram_facade.py +0 -0
  464. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_active_consumers_index.py +0 -0
  465. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_active_context_policy.py +0 -0
  466. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_active_index.py +0 -0
  467. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_active_memory.py +0 -0
  468. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_agora_agent_alias_identity.py +0 -0
  469. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_agora_tools_http.py +0 -0
  470. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_analyze_media_addressing_and_walling.py +0 -0
  471. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_answer_user_effect.py +0 -0
  472. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_artifact_session_candidates.py +0 -0
  473. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_artifacts.py +0 -0
  474. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_automation_calendar_schedule.py +0 -0
  475. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_automation_commands.py +0 -0
  476. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_automation_controller.py +0 -0
  477. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_automation_controller_recovery.py +0 -0
  478. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_automation_definition.py +0 -0
  479. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_automation_discussion_isolation.py +0 -0
  480. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_automation_email_results.py +0 -0
  481. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_automation_growing_context.py +0 -0
  482. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_automation_index.py +0 -0
  483. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_automation_list_reads.py +0 -0
  484. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_automation_named_policy_compiler.py +0 -0
  485. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_automation_next_fire.py +0 -0
  486. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_automation_occurrence_input_resolver.py +0 -0
  487. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_automation_occurrence_recovery.py +0 -0
  488. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_automation_replay_read_only.py +0 -0
  489. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_automation_retry.py +0 -0
  490. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_automation_session_turns.py +0 -0
  491. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_automation_status.py +0 -0
  492. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_automation_tool_approval.py +0 -0
  493. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_browser_probe_target_walling.py +0 -0
  494. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_budget_law_no_unrequested_caps.py +0 -0
  495. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_capability_default_reasoning.py +0 -0
  496. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_chat_summarizer_integration.py +0 -0
  497. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_code_node_imports.py +0 -0
  498. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_code_node_restricted_python.py +0 -0
  499. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_command_sandbox_host_facade.py +0 -0
  500. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_command_store.py +0 -0
  501. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_compaction_helpers.py +0 -0
  502. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_compaction_summarizer_route.py +0 -0
  503. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_config_facade_models_engines.py +0 -0
  504. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_config_facade_voice_input_hint.py +0 -0
  505. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_control_adapter_while.py +0 -0
  506. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_controller_bundle_packaged.py +0 -0
  507. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_conversation_search.py +0 -0
  508. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_crash_ordering_inversions.py +0 -0
  509. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_create_if_absent.py +0 -0
  510. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_data_registry_facade.py +0 -0
  511. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_default_model_warmup_switch.py +0 -0
  512. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_default_tools_camera_gating.py +0 -0
  513. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_default_tools_comms_gating.py +0 -0
  514. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_default_tools_include_skim_files.py +0 -0
  515. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_default_tools_include_skim_folders.py +0 -0
  516. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_default_tools_include_skim_web.py +0 -0
  517. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_default_tools_search_files_executor.py +0 -0
  518. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_diary_capture.py +0 -0
  519. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_diary_write_rescue.py +0 -0
  520. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_directory_lease.py +0 -0
  521. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_disabled_toolsets_seam.py +0 -0
  522. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_discovery_survives_unbuildable_default.py +0 -0
  523. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_discovery_tts_unavailable_reason.py +0 -0
  524. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_discovery_voice_openai_api_key.py +0 -0
  525. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_discussion_session_anchor.py +0 -0
  526. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_document_markdown_tables.py +0 -0
  527. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_document_renderers_hr_quote.py +0 -0
  528. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_durable_toolsets.py +0 -0
  529. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_durable_write_discipline.py +0 -0
  530. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
  531. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_effect_cancellation.py +0 -0
  532. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_effect_issuance_idempotency.py +0 -0
  533. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_effect_payload_stays_json_serializable.py +0 -0
  534. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_election_consequence_teaching.py +0 -0
  535. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_email_binding_and_refiner.py +0 -0
  536. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_email_feeder_batched.py +0 -0
  537. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_email_feeder_flags.py +0 -0
  538. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_email_gate_fixes.py +0 -0
  539. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_email_inbox_and_trigger.py +0 -0
  540. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_email_received_mailbox_id.py +0 -0
  541. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_email_regate_fixes.py +0 -0
  542. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_email_review_fixes.py +0 -0
  543. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_email_self_trigger_loop.py +0 -0
  544. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_email_stream_consumers.py +0 -0
  545. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_email_toolset_and_walls.py +0 -0
  546. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_emergence_experiment.py +0 -0
  547. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_emit_event_uses_wait_index.py +0 -0
  548. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_emit_event_without_workflow_registry.py +0 -0
  549. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_endpoint_profile_media_end_to_end.py +0 -0
  550. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_endpoint_profile_media_in_process.py +0 -0
  551. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_endpoint_profile_media_specs_keep_provider.py +0 -0
  552. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_endpoint_profile_route_context.py +0 -0
  553. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_entity_awake_memory_fixes.py +0 -0
  554. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_entity_brain_effects.py +0 -0
  555. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_entity_chat_driver.py +0 -0
  556. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_entity_chat_tools_reflection.py +0 -0
  557. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_entity_diary.py +0 -0
  558. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_entity_execute_tool.py +0 -0
  559. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_entity_fetch_url_tool.py +0 -0
  560. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_entity_history_window.py +0 -0
  561. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_entity_life_loop.py +0 -0
  562. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_entity_memory_richness.py +0 -0
  563. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_entity_phase_graph_conformance.py +0 -0
  564. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_entity_react_visit_window.py +0 -0
  565. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_entity_recent_memories.py +0 -0
  566. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_entity_runtime.py +0 -0
  567. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_entity_search_memory.py +0 -0
  568. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_entity_sleep_bound_and_yield_attribution.py +0 -0
  569. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_entity_substrate_resolution.py +0 -0
  570. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_entity_visit_honesty.py +0 -0
  571. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_entity_workspace_cap.py +0 -0
  572. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_entity_workspace_tools.py +0 -0
  573. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_event_index_cross_process.py +0 -0
  574. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_event_wait_index.py +0 -0
  575. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_every_path_bearing_tool_is_walled.py +0 -0
  576. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_evidence_recorder.py +0 -0
  577. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_evidence_recorder_post_policy_envelope.py +0 -0
  578. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_execute_command_output_offload.py +0 -0
  579. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_execution_capability_discovery.py +0 -0
  580. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_explicit_eject_other_clients.py +0 -0
  581. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_factory_default_retry_policy.py +0 -0
  582. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
  583. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_format_repair_nudge.py +0 -0
  584. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_fresh_install_no_provider.py +0 -0
  585. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_gateway_facades_c4899.py +0 -0
  586. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_git_read_only_refiner.py +0 -0
  587. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_hf_process_residency_merge.py +0 -0
  588. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_history_window_multimodal.py +0 -0
  589. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_hot_path_store_reads.py +0 -0
  590. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_indexed_idempotency_lookup.py +0 -0
  591. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_integration_abstractcore.py +0 -0
  592. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_integrations_abstractcore.py +0 -0
  593. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_json_file_run_store_children_index.py +0 -0
  594. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_json_run_cache_bound.py +0 -0
  595. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_json_store_scan_memo.py +0 -0
  596. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_jsonl_ledger_recovery.py +0 -0
  597. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_jsonl_ledger_seq_cross_process.py +0 -0
  598. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_jsonl_row_index.py +0 -0
  599. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_kg_learn_and_recall_contract.py +0 -0
  600. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_ledger_chain.py +0 -0
  601. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_ledger_cursor_invariants.py +0 -0
  602. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_ledger_get_record.py +0 -0
  603. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_ledger_record_slimming.py +0 -0
  604. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_ledger_subscription.py +0 -0
  605. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_live_token_deltas.py +0 -0
  606. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_llm_call_media_artifact_refs.py +0 -0
  607. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
  608. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
  609. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_llm_call_payload_shape_refusal.py +0 -0
  610. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_llm_call_prefix_stability_contract.py +0 -0
  611. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_llm_call_requires_prompt.py +0 -0
  612. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_llm_call_response_schema_normalization.py +0 -0
  613. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_llm_call_structured_output_fallback.py +0 -0
  614. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_llm_call_text_phase_progress.py +0 -0
  615. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_llm_call_truncation_retry_contract.py +0 -0
  616. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_llm_call_use_context_appends_turn.py +0 -0
  617. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
  618. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_llm_client_grounding_tail.py +0 -0
  619. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_llm_client_media_artifacts.py +0 -0
  620. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_llm_client_system_context.py +0 -0
  621. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_llm_client_tool_call_parsing.py +0 -0
  622. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_llm_retry_classification.py +0 -0
  623. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_llm_streaming_on_token.py +0 -0
  624. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_local_helper_tool_exposure.py +0 -0
  625. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_local_residency_host_sweep.py +0 -0
  626. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
  627. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_mail_verbs.py +0 -0
  628. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_mailbox_index.py +0 -0
  629. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_max_iterations_ceiling.py +0 -0
  630. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_mcp_remote_tool_executor.py +0 -0
  631. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_mcp_runs_untrusted_and_facade.py +0 -0
  632. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_mcp_worker_logging.py +0 -0
  633. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_mcp_worker_security.py +0 -0
  634. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_mcp_worker_stdio.py +0 -0
  635. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_media_artifact_resolution.py +0 -0
  636. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_media_capability_default_routing.py +0 -0
  637. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_media_host_endpoint_resolver.py +0 -0
  638. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_media_only_requests_skip_text_client.py +0 -0
  639. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_media_subprocess.py +0 -0
  640. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_memact_composer_from_kg_result.py +0 -0
  641. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_memory_appraise_handler.py +0 -0
  642. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_memory_communities.py +0 -0
  643. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_memory_facade.py +0 -0
  644. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
  645. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_memory_kg_packets.py +0 -0
  646. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_memory_kg_predicate_aliasing.py +0 -0
  647. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_memory_kg_query_packetization_restart.py +0 -0
  648. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
  649. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
  650. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_memory_note_effect.py +0 -0
  651. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_memory_query_effect.py +0 -0
  652. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_memory_query_rich_filters.py +0 -0
  653. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_memory_revise.py +0 -0
  654. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
  655. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_memory_seam_handlers.py +0 -0
  656. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_memory_seam_sqlite_durability.py +0 -0
  657. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_memory_step_provenance.py +0 -0
  658. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_memory_tag_effect.py +0 -0
  659. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_mlx_generation_serialization.py +0 -0
  660. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_mlx_process_residency_merge.py +0 -0
  661. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_model_eject_cancel.py +0 -0
  662. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_model_residency_clean_switch.py +0 -0
  663. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_model_residency_control_plane.py +0 -0
  664. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_model_residency_lock_and_context_estimate.py +0 -0
  665. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_multi_store_scheduler.py +0 -0
  666. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_multimodal_abstractcore_integration.py +0 -0
  667. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_native_mlx_application_wiring.py +0 -0
  668. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_native_mlx_execution_controls_live.py +0 -0
  669. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_native_tool_channel.py +0 -0
  670. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_night_voice.py +0 -0
  671. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_no_default_provider_refusal_ux.py +0 -0
  672. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_occurrence_named_inputs.py +0 -0
  673. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_occurrence_samples.py +0 -0
  674. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_offload_answer_chain_c4978.py +0 -0
  675. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_offloaded_node_traces_report_unknown_not_zero.py +0 -0
  676. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_offloading.py +0 -0
  677. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_packaging_extras.py +0 -0
  678. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_parallel_readonly_tool_execution.py +0 -0
  679. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_pause_resume.py +0 -0
  680. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_pdf_unicode_rendering.py +0 -0
  681. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_personal_cycle.py +0 -0
  682. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_phantom_attachment_index.py +0 -0
  683. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_phase_graph_artifact_control.py +0 -0
  684. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_phase_graph_obedience.py +0 -0
  685. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_phase_vocabulary_migration.py +0 -0
  686. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_pooled_client_strips_construction_cache_key.py +0 -0
  687. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_prompt_cache_export_import.py +0 -0
  688. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_prompt_cache_fingerprint_stability.py +0 -0
  689. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_prompt_cache_modules.py +0 -0
  690. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_prompt_cache_posture_inheritance.py +0 -0
  691. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_prompt_cache_thinking_and_prompt_only.py +0 -0
  692. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_prompt_overlay.py +0 -0
  693. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_provider_endpoint_profile_resolution.py +0 -0
  694. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_provider_pin_routing_isolation.py +0 -0
  695. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_publish_event.py +0 -0
  696. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_queryable_run_store.py +0 -0
  697. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_r12_workspace_sandbox.py +0 -0
  698. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
  699. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_read_idle_threading.py +0 -0
  700. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_readoption_experiment.py +0 -0
  701. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_real_integration.py +0 -0
  702. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_realize_election.py +0 -0
  703. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_recall_levels_policy.py +0 -0
  704. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_remote_client_cancel.py +0 -0
  705. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_remote_llm_client.py +0 -0
  706. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_remote_speculation_defaults.py +0 -0
  707. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_rendering_agent_trace_report.py +0 -0
  708. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_rendering_json_stringify.py +0 -0
  709. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_replay_conformance.py +0 -0
  710. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_replay_conformance_package.py +0 -0
  711. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_replay_cursor_token.py +0 -0
  712. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_replay_delta_cost.py +0 -0
  713. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_replay_invariants.py +0 -0
  714. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_replay_review_findings.py +0 -0
  715. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_replay_tool_policy.py +0 -0
  716. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_report_branding.py +0 -0
  717. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_resident_media_generation.py +0 -0
  718. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_resume_concurrent_same_wait.py +0 -0
  719. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_retry_idempotency.py +0 -0
  720. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_run_history_bundle.py +0 -0
  721. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_run_index_workspace_root.py +0 -0
  722. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_run_mutation_lock.py +0 -0
  723. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_run_origin.py +0 -0
  724. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_run_scoped_tool_policy.py +0 -0
  725. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_run_store_change_token.py +0 -0
  726. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_run_tool_scope_ceiling.py +0 -0
  727. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_runtime_browser_session_boundary.py +0 -0
  728. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
  729. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_runtime_default_provider_model_refresh.py +0 -0
  730. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_runtime_effect_invocation_trace.py +0 -0
  731. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_runtime_health_and_bounded_vars.py +0 -0
  732. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_runtime_install_boundary.py +0 -0
  733. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
  734. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_runtime_node_traces.py +0 -0
  735. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_runtime_start_seeds_tool_support.py +0 -0
  736. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_runtime_tick_step_gate.py +0 -0
  737. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_schedule_run.py +0 -0
  738. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_schedule_v1_corpus.py +0 -0
  739. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_schedule_v2_calendar.py +0 -0
  740. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_scheduler.py +0 -0
  741. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_send_email_refiner.py +0 -0
  742. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_send_email_self_default_policy.py +0 -0
  743. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
  744. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_session_history.py +0 -0
  745. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_session_prompt_cache_attribution.py +0 -0
  746. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_session_prompt_cache_visibility.py +0 -0
  747. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_session_route_stamp.py +0 -0
  748. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_session_start_cost.py +0 -0
  749. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_session_tool_policy.py +0 -0
  750. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_shell_tool_exposure.py +0 -0
  751. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_snapshots.py +0 -0
  752. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_speculation_inheritance.py +0 -0
  753. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_speculation_reaches_provider_construction.py +0 -0
  754. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_sqlite_ledger_store.py +0 -0
  755. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_start_subworkflow_async_wait.py +0 -0
  756. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
  757. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
  758. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_steer_sidecar.py +0 -0
  759. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_step_context.py +0 -0
  760. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_storage_deletion.py +0 -0
  761. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_streamed_voice_namespace.py +0 -0
  762. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_structured_output_schema_enum.py +0 -0
  763. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_subworkflow.py +0 -0
  764. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_terminal_effect_completion.py +0 -0
  765. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
  766. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_thinking_inheritance.py +0 -0
  767. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
  768. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_tool_approval_executor.py +0 -0
  769. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_tool_approval_resume_executes.py +0 -0
  770. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_tool_approval_wait_key_identity.py +0 -0
  771. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_tool_calls_idempotency_keys.py +0 -0
  772. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_tool_catalog.py +0 -0
  773. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_tool_descriptor_registry.py +0 -0
  774. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_tool_executor_argument_sanitization.py +0 -0
  775. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_tool_executor_error_output_detection.py +0 -0
  776. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_tool_executor_filename_alias.py +0 -0
  777. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
  778. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_tool_executor_read_file_aliases.py +0 -0
  779. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_tool_executor_timeout.py +0 -0
  780. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_tool_inventory_facade.py +0 -0
  781. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_tool_invoke_effect.py +0 -0
  782. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_tool_policy_and_mounts.py +0 -0
  783. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_tool_wait_allowlist_safety.py +0 -0
  784. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_topic_election_world_model.py +0 -0
  785. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_trace_context_propagation.py +0 -0
  786. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_trigger_cloudevents.py +0 -0
  787. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_trigger_connection_listening.py +0 -0
  788. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_trigger_connections.py +0 -0
  789. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_trigger_feed.py +0 -0
  790. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_trigger_registry.py +0 -0
  791. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_trigger_schedule_math.py +0 -0
  792. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_trigger_webhook.py +0 -0
  793. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_trusted_run_index.py +0 -0
  794. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_turn_grounding_byte_stability.py +0 -0
  795. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_turn_grounding_carriers_a3.py +0 -0
  796. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_vars_query_effect.py +0 -0
  797. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visit_ab_fixture.py +0 -0
  798. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visit_midturn_elections.py +0 -0
  799. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visit_midturn_resume.py +0 -0
  800. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visit_workflow.py +0 -0
  801. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
  802. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visual_agent_skills_block_passthrough.py +0 -0
  803. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
  804. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
  805. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
  806. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
  807. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visual_entity_memory_nodes.py +0 -0
  808. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visual_flow_end_effect_only_persistence.py +0 -0
  809. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visual_llm_call_partial_override.py +0 -0
  810. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
  811. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visual_loop_back_out_of_body.py +0 -0
  812. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visual_loop_limit_and_list_nodes.py +0 -0
  813. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visual_loop_limit_on_wire.py +0 -0
  814. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visual_memact_compose_node.py +0 -0
  815. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
  816. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
  817. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
  818. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visual_reroute_lowering.py +0 -0
  819. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visual_set_vars_pins.py +0 -0
  820. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visual_unknown_node_type_refuses.py +0 -0
  821. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visual_wait_event_deadline_passthrough.py +0 -0
  822. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visualflow_add_message_builtin.py +0 -0
  823. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
  824. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visualflow_agora_react_agent.py +0 -0
  825. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visualflow_call_tool_node.py +0 -0
  826. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visualflow_capability_routes_and_thinking.py +0 -0
  827. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visualflow_compiler_basic.py +0 -0
  828. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
  829. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visualflow_continue_on_error.py +0 -0
  830. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visualflow_edit_json_schema_node.py +0 -0
  831. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visualflow_event_inbox_react_agent.py +0 -0
  832. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visualflow_file_nodes_workspace.py +0 -0
  833. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visualflow_function_library.py +0 -0
  834. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visualflow_get_element_node.py +0 -0
  835. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visualflow_get_random_element_node.py +0 -0
  836. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visualflow_get_var_node.py +0 -0
  837. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visualflow_has_tools_builtin.py +0 -0
  838. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
  839. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
  840. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visualflow_make_object_node.py +0 -0
  841. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visualflow_media_nodes.py +0 -0
  842. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visualflow_memory_effect_nodes.py +0 -0
  843. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visualflow_memory_source_pins.py +0 -0
  844. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visualflow_pin_expressions.py +0 -0
  845. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visualflow_prompt_only.py +0 -0
  846. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visualflow_random_nodes.py +0 -0
  847. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visualflow_schema_enum_switch.py +0 -0
  848. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_visualflow_tool_parameters_node.py +0 -0
  849. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_voice_library_facade.py +0 -0
  850. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_voice_openai_api_key_path.py +0 -0
  851. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_voice_stream_is_not_a_wait.py +0 -0
  852. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_w4_feelings_lens.py +0 -0
  853. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_wait_event_deadline.py +0 -0
  854. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_wait_event_prompt_metadata.py +0 -0
  855. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_wait_until_streak.py +0 -0
  856. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_wait_until_utc_normalization.py +0 -0
  857. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_workflow_bundle_registry.py +0 -0
  858. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_workspace_builtin_deny.py +0 -0
  859. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_workspace_context_allowed_workspaces.py +0 -0
  860. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_workspace_policy_absolute_reanchor.py +0 -0
  861. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_workspace_policy_allowlist_mode.py +0 -0
  862. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
  863. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
  864. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_workspace_prompt_context.py +0 -0
  865. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_workspace_read_only.py +0 -0
  866. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_workspace_writable_paths.py +0 -0
  867. {abstractruntime-0.15.0 → abstractruntime-0.15.2}/tests/test_write_chart.py +0 -0
@@ -7,6 +7,26 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.15.2] - 2026-10-28
11
+
12
+ ### Fixed
13
+
14
+ - **An index build no longer loses a run another store object creates during it** (`JsonFileRunStore`, backlog 0863).
15
+ A new run's `+` journal line is written before its file is published; a session/children/active index build that
16
+ marked the journal between the two and scanned the folder before the file landed missed the run: the listing until
17
+ the next reconciliation, the session and children indexes for the life of the store object (the reconciliation
18
+ repaired only the listing). Seen as a gateway that answered 404 `session_not_found` when archiving a session written
19
+ while it booted (AbstractGateway backlog 0963); a split-mode runner creating a run during the API process's boot
20
+ hit the same window. The first sync after a build now re-applies the journal's last 16 KiB before the build's mark
21
+ (`JOURNAL_REPLAY_TAIL_BYTES`; idempotent, once per build), and the reconciliation re-files a run it repairs into
22
+ the session and children indexes too (and drops a vanished one from them).
23
+
24
+ ## [0.15.1] - 2026-10-28
25
+
26
+ ### Changed
27
+
28
+ - **Is Empty (`is_empty_string`) accepts lists.** Nothing (unset / `None`), an empty text, and a list, tuple, set or object with no elements are empty; whitespace, `0`, `False` and a list with any element are not. Before, a list was turned into text (`"[]"`) and was never empty, so a flow checking a list variable needed Array Length + Compare (operator QA 2026-10-28, the email-triage flow). Backlog 0862 (numbered 0857 in the 0.15.1 package). AbstractFlow lets the node take a list once this is released.
29
+
10
30
  ## [0.15.0] - 2026-10-28
11
31
 
12
32
  Requires AbstractMemory 0.4.0 or newer (`abstractmemory.graph`). ADR 0011, backlog 0856.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: AbstractRuntime
3
- Version: 0.15.0
3
+ Version: 0.15.2
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
@@ -55,10 +55,21 @@ 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.15.0 • **Python:** 3.10+
58
+ **Version:** 0.15.2 • **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.2
63
+
64
+ - **Run index builds never lose a run created during them**: a run another process (or store object) wrote while
65
+ this store built its indexes is in the session and children indexes and the listing at once (before, the session
66
+ index could miss it for the life of the store object; backlog 0863).
67
+
68
+ ## What's new in 0.15.1
69
+
70
+ - **Is Empty accepts lists**: nothing, an empty text, or a list or object with no elements is empty (visual-flow
71
+ node `is_empty_string`; backlog 0862).
72
+
62
73
  ## What's new in 0.15.0
63
74
 
64
75
  - **Memory facade** (`abstractruntime.integrations.abstractmemory.memory_facade.MemoryFacade`): the one
@@ -4,10 +4,21 @@
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.15.0 • **Python:** 3.10+
7
+ **Version:** 0.15.2 • **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.2
12
+
13
+ - **Run index builds never lose a run created during them**: a run another process (or store object) wrote while
14
+ this store built its indexes is in the session and children indexes and the listing at once (before, the session
15
+ index could miss it for the life of the store object; backlog 0863).
16
+
17
+ ## What's new in 0.15.1
18
+
19
+ - **Is Empty accepts lists**: nothing, an empty text, or a list or object with no elements is empty (visual-flow
20
+ node `is_empty_string`; backlog 0862).
21
+
11
22
  ## What's new in 0.15.0
12
23
 
13
24
  - **Memory facade** (`abstractruntime.integrations.abstractmemory.memory_facade.MemoryFacade`): the one
@@ -12,10 +12,16 @@ If you are new to the project, start with `../README.md` and `../architecture.md
12
12
 
13
13
  ## Counts
14
14
 
15
- - Planned: 32
16
- - Proposed: 14
15
+ 2026-10-28: +1 proposed, 0862 (a message's artifacts list the run's offloaded bookkeeping; one listed ref is missing from `view.artifacts`), found by the desktop Assistant QA (AbstractAssistant 1067).
16
+
17
+ 2026-10-28: +2 proposed, 0860 (the view does not say how a run was stopped; the gateway does not advertise the view) and 0861 (tool sandbox and per-call model timings missing from view activities), found by AbstractUIC 0040 (panel-chat renders the replay view).
18
+
19
+ 2026-10-28: recounted from disk (deprecated was 13 in this block, 14 on disk); +1 planned for 0858 (root 1063, typed runs); +1 planned for 0859 (ephemeral live-text deltas on the view stream, gateway 0954).
20
+
21
+ - Planned: 34
22
+ - Proposed: 17
17
23
  - Completed: 39
18
- - Deprecated: 13
24
+ - Deprecated: 14
19
25
  - Recurrent: 0
20
26
 
21
27
  2026-09-20: counts reconciled to disk (28 planned and 12 proposed before this
@@ -93,6 +99,8 @@ mtime). The anticipated ADR ("an automation is its controller root run") is not
93
99
 
94
100
  | ID | Item |
95
101
  |----|------|
102
+ | 0863 | [An index build never loses a run created during it](completed/0863_index_build_never_loses_a_run_created_during_it.md): completed 2026-10-28, released in abstractruntime 0.15.2; the first sync after an index build re-applies the journal's last 16 KiB (gateway backlog 0963, the flaky archive test). |
103
+ | 0862 | [Is Empty accepts lists](completed/0862_is_empty_accepts_lists.md): completed 2026-10-28, released in abstractruntime 0.15.1 (PR #15); `is_empty_string` treats nothing, "" and a list/tuple/set/object with no elements as empty (operator QA 2026-10-28, AbstractFlow backlog 0160). |
96
104
  | 0856 | [Memory facade and ledger provenance](completed/0856_memory_facade_and_ledger_provenance.md): completed 2026-10-27, released in abstractruntime 0.15.0 (2026-10-28, PR #6 merge `88a584b`; floor AbstractMemory>=0.4.0); ADR 0011: `MemoryFacade` (open a mind, stamp, reconstruct a source), `LedgerStore.get_record(run_id, seq)` (JSON-file line-offset index), the step context, a `step` ref on every memory write the runtime performs, `MEMORY_REVISE` / node `memory_revise`. Follow-up 0857. |
97
105
  | 0851 | [Per-account voice stores](completed/0851_per_account_voice_stores.md): completed 2026-10-27 (0.13.0); the runtime's voice catalog and voice library use its `voice_store_dir` / `voice_library_dirs`; real-weights E2E 9/9. |
98
106
  | 0852 | [Capability refusals are not retried](completed/0852_capability_refusals_are_not_retried.md): completed 2026-10-27 (0.13.0); one engine call for a refused request. |
@@ -149,6 +157,8 @@ mtime). The anticipated ADR ("an automation is its controller root run") is not
149
157
  | 0853 | `planned/0853_session_tool_policy_before_the_approval_wait.md` (P1; abstractruntime 0.14.0: a conversation's approve/deny stored per session and applied before any approval wait, with an `abstract.tool_policy_decision` ledger record; gateway routes and client wiring remain) |
150
158
  | 0854 | `planned/0854_replay_view.md` (P0; abstractruntime 0.14.0 carries the reducer, the durable per-run `seq` cursor and the conformance cases; gateway routes and client migration remain; ADR 0010) |
151
159
  | 0857 | `planned/0857_entity_direct_memory_writes_provenance.md` (P2; entity memory written outside any effect: world models, tending, night passes; follows 0856) |
160
+ | 0858 | `planned/0858_typed_runs_run_type_stamped_at_start.md` (P1; one `run_type` + `origin.surface` stamped at start, indexed, in `replay_view_v1`; root 1063, gateway 0951) |
161
+ | 0859 | `planned/0859_replay_view_ephemeral_text_deltas.md` (P1; live token text on `/view/stream` as ephemeral `text` deltas the reducer ignores; gateway 0954; regression found by the Assistant desktop migration) |
152
162
  | 0044 | `planned/runtime_systemic_reliability/0044_meta_analysis_record.md` (track source record) |
153
163
  | 0045 | `planned/runtime_systemic_reliability/0045_crash_replay_harness_and_ordering_invariant.md` |
154
164
  | 0046 | `planned/runtime_systemic_reliability/0046_per_run_driver_exclusion.md` |
@@ -0,0 +1,29 @@
1
+ # 0862 — Is Empty accepts lists (nothing or no elements = empty)
2
+
3
+ **Status**: completed 2026-10-28, released in abstractruntime 0.15.1 (PR #15; released on the release lead's decision;
4
+ the gateway floor stays >=0.15.0, the root pins 0.15.1) · **Priority**: P2 · **Created**: 2026-10-28 · Numbered 0857 at release (a clash with planned 0857, renumbered 2026-10-28)
5
+ **Cross-package**: AbstractFlow backlog 0160 (operator QA 2026-10-28 item (e)); the Flow editor lets Is Empty take a
6
+ list only after this is released (branch `fix/is-empty-lists` there).
7
+
8
+ ## Why
9
+ Operator QA 2026-10-28 (e): "Is Empty must also accept arrays (undefined or 0 elements = empty)". The email-triage
10
+ flow checked its `triage` list variable with Array Length + Compare, and a Compare left on its default `==` inverted
11
+ the check. One node that says "the list is empty" is the readable way.
12
+
13
+ ## Current code reality (before)
14
+ `visualflow_compiler/visual/builtins.py` `string_is_empty`: `"" if text is None else str(text)` then `== ""`, so
15
+ `[]` became `"[]"` and was never empty.
16
+
17
+ ## Change
18
+ `string_is_empty`: `None` → true; `list`, `tuple`, `set`, `frozenset`, `dict` → `len == 0`; anything else → `str(value)
19
+ == ""` (unchanged for text; whitespace, `0`, `False` stay not empty). The node type and pin id (`text`) are unchanged,
20
+ so every saved flow compiles as before and a text input behaves as before.
21
+
22
+ ## Evidence
23
+ - `tests/test_visualflow_string_contains_replace.py::test_is_empty_accepts_lists_and_objects` and `::test_is_empty_on_a_list_variable_in_a_compiled_flow` (Get Variable → Is Empty → If; RED before: `[]`
24
+ returned False).
25
+ - The operator's email-triage flow with Array Length + Compare replaced by Is Empty(Get triage) → If false → Notify
26
+ me, run through the executor with 5 emails / 2 important: reaches Notify me and publishes the alert
27
+ (`untracked/release-closing/w6-flow/repro_email_triage.py` at the workspace root).
28
+ - Full suite: 3863 passed; the only failures are environment ones present on `main` (a real abstractvision plugin
29
+ test, three modules importing the old Python `abstractflow.FlowRunner`).
@@ -0,0 +1,48 @@
1
+ # 0863 — An index build never loses a run another store object creates during it
2
+
3
+ **Status**: completed 2026-10-28, released in abstractruntime 0.15.2 · **Priority**: P1 · **Created**: 2026-10-28
4
+ **Cross-package**: AbstractGateway backlog 0963 (the flaky `test_runs_reads_archive_and_kinds_once_and_sees_its_own_writes`,
5
+ 404 `session_not_found` on one CI job per run; it blocked the gateway 0.17.2 PR and release runs).
6
+
7
+ ## Why
8
+ `JsonFileRunStore._save` appends a new run's `+id` journal line BEFORE it publishes the run file (J53-1: a crash after
9
+ publication can never hide a run). An index build (`_ensure_session_index`, `_ensure_children_index`, the active
10
+ index; `warm_session_index` at a host's boot) marks the journal offset (`_mark_journal_start`) and then scans the
11
+ folder. A run created by ANOTHER store object (another process: a split-mode runner during the API process's boot;
12
+ or another object in the same process) whose `+` line landed before the mark and whose file landed after the scan
13
+ was in neither: the trusted listing memo missed it until the next reconciliation, and the session and children
14
+ indexes for the life of the store object (the reconciliation repaired only the memo and the active set). In the gateway, `POST /sessions/{id}/archive` answered 404
15
+ `session_not_found` for a session just written (`session_exists` -> `list_run_index(session_id=...)`).
16
+
17
+ ## Change
18
+ `_mark_journal_start` sets the first sync's offset to `_journal_replay_start(size)`: the first record boundary within
19
+ `JOURNAL_REPLAY_TAIL_BYTES` (16 KiB, ~400 records) before the journal's size at the mark, instead of the size itself.
20
+ The build syncs right after its scan, so those records are re-applied at once; applying is idempotent (a `+` whose
21
+ file exists is filed again; one whose file is still absent stays pending, as for any `+`, until the file appears).
22
+ The reconciliation (`_scan_active_ids`) now re-files every run it repairs into the session and children indexes
23
+ and drops a vanished run from them (review finding: it repaired only the memo and the active set).
24
+
25
+ Chosen over "a `+` whose file was absent at scan time stays pending": that needs the build to know which `+` lines
26
+ precede the mark, i.e. to read the journal before the mark anyway; the tail replay reuses the existing, tested
27
+ pending path unchanged. Cost: one read of at most 16 KiB and one stat per record in it, once per index build (a
28
+ build happens at boot or after a journal rewrite). Failure mode: a run whose `+` is more than ~400 records before
29
+ the mark and still unpublished after the scan (a publication takes milliseconds) is caught by the periodic
30
+ reconciliation, which logs what it repairs and now re-files it in every index; an unreadable tail logs a warning and replays nothing (the previous
31
+ behaviour).
32
+
33
+ ## Evidence
34
+ - `tests/test_json_file_run_store_index_build_race.py`: another store object's new run, with this store's index
35
+ build run between its `+` line and its publication, is listed by `list_run_index(session_id=...)` and by the
36
+ root listing; with a 50 KB journal the replay is bounded to the tail and starts on a record boundary. These 2:
37
+ 2 failed with the previous `json_files.py`. The file (3 tests): 20/20 plain runs and 20/20 beside 12 CPU-busy processes passed.
38
+ - `test_the_reconciliation_refiles_a_run_the_session_and_children_indexes_missed`: a miss beyond the tail is
39
+ repaired by `rescan_active_index()` into the session index; red with the re-file removed.
40
+ - Adversarial review (Opus, read-only): all index kinds covered (session, children, active, the memo; event-wait
41
+ and mailbox indexes refresh from the active set); record boundaries never parse a bogus record; the rewind
42
+ happens once per store object; re-application of `-`, `~`, `=` and this store's own records is safe. Fixed: the
43
+ claim that the reconciliation caught a miss (it did not repair the session/children indexes; now it does).
44
+ Recorded: a build's replay bumps the change counter once for the replayed runs (one incremental pass of the
45
+ gateway's notifications collector over ~400 runs per build).
46
+ - The gateway's previous test order (runs written while the boot warm-up builds the index), with the window between
47
+ `+` and publication widened to 0.3 s: 3/3 failed with AbstractRuntime 0.15.1 (the CI's exact 404), 5/5 passed with
48
+ this change.
@@ -0,0 +1,41 @@
1
+ # 0858 — Typed runs: one `run_type` stamped at start, indexed, carried in the replay view
2
+
3
+ **Status**: planned · **Priority**: P1 (high) · **Created**: 2026-10-28
4
+ **Package**: abstractruntime (enum, stamp, index column, replay view field, backfill helper) · **Slices**: abstractgateway 0951 (start paths, `/runs` filters, migration), clients (framework root 1065)
5
+ **Master item**: framework root backlog 1063, `abstractframework/docs/backlog/planned/1063_typed_runs_and_sessions.md`; links root 0993, 1059
6
+
7
+ ## Summary
8
+
9
+ The runtime owns the vocabulary of what a run is. Today it has two partial ones: `core/run_attribution.py`
10
+ derives `session_kind` (`chat|automation|occurrence|discussion`) and `role` at index time from automation
11
+ metadata, so every non-automation run is `chat`; `core/run_origin.py` stamps `_meta.origin`
12
+ (`person|trigger|agent|system`, `actor`, `client`, `ref`) once at start but nothing indexes it and the
13
+ replay view does not carry it. Add one `_meta.run_type` (enum in root 1063: `conversation`, `docs`,
14
+ `automation_controller`, `occurrence`, `discussion`, `scheduled`, `entity_visit`, `entity_life`, `import`,
15
+ `correction`, `bridge`, `flow`, `subrun`) and `origin.surface` (`desktop|iphone|watch|web|terminal|console|api|none`),
16
+ written once like `stamp_origin`, indexed as columns, and exposed in `replay_view_v1` as `run.type` and `run.origin`.
17
+
18
+ ## Current code reality (origin/main, abstractruntime 0.15.0)
19
+
20
+ - `core/run_attribution.py`: `SESSION_KINDS`, `ROLES`, `INDEX_FIELD_NAMES`, `automation_index_fields(vars)`; first-match derivation from `_meta.automation` / `_meta.occurrence` / `_meta.discussion` / `_meta.schedule`; columns in `storage/sqlite.py` and `storage/json_files.py`.
21
+ - `core/run_origin.py`: `ORIGIN_KINDS`, `origin_for`, `origin_of`, `stamp_origin` (written once; an existing origin is kept); the automation controller stamps occurrences (`automations/controller.py`).
22
+ - `replay/view.py`: no type or origin on the view.
23
+ - Entity homes (`identity/chat.py`, life loop) write runs under synthetic ids for the in-process chat path (memory report decision 3), so `entity_visit`/`entity_life` need the gateway hosts and decision 3 to stamp them.
24
+
25
+ ## Chosen route
26
+
27
+ 1. `core/run_type.py`: `RUN_TYPES`, `stamp_run_type(vars, type)` (once; refuses an unknown value), `run_type_of(vars)` with the backfill derivation for runs that predate the stamp (returns `(type, "stamped"|"derived")`).
28
+ 2. `Runtime.start` refuses a root run with no `run_type` after one release of warnings (descendants default to `subrun`).
29
+ 3. Index columns `run_type`, `origin_kind`, `origin_surface` (SQLite migration + JSON index); `list_runs(run_types=..., surfaces=...)`.
30
+ 4. `run_attribution` derives `session_kind`/`role` from `run_type` for one release (compatibility), then is reduced to the automation fields.
31
+ 5. `replay_view_v1`: `run.type`, `run.origin` (additive); conformance fixture updated.
32
+
33
+ ## Open decisions
34
+
35
+ See root 1063 (enum names, `surface` placement, retirement of `session_kind`, interaction with root 1024).
36
+
37
+ ## Acceptance criteria
38
+
39
+ - [ ] Every start path in the runtime stamps `run_type`; tests per path red when the stamp is removed.
40
+ - [ ] Index columns filled for new runs; the backfill helper derives the same type the old fields implied on a fixture of legacy runs.
41
+ - [ ] View fixture carries `run.type` and `run.origin`.
@@ -0,0 +1,27 @@
1
+ # 0859 — Replay view: ephemeral live-text deltas, ignored by the reducer
2
+
3
+ **Status**: planned · **Priority**: P1 (high) · **Created**: 2026-10-28
4
+ **Package**: abstractruntime (`replay/view.py` `apply`, conformance fixtures, ADR 0010 note) · **Slices**: abstractgateway 0954 (`/view/stream` `text` frames)
5
+ **Master item**: framework root backlog 0993; follows 0854 (its "Out" list put live token text on the ledger stream)
6
+
7
+ ## Summary
8
+
9
+ Finding from the AbstractAssistant desktop migration (draft PR #11, `feat/replay-view-desktop`, its backlog 1063): the `/view/stream` deltas carry committed ledger records only, so a client that renders from the view loses the live token text while an answer is being generated, a regression against the old path (`GET /runs/{id}/ledger/stream`), which interleaves `llm.delta` frames from `LiveDeltaHub` (`live_deltas.py`) and shows tokens as they arrive. Runtime 0854 put live token text out of scope ("`llm.delta` frames stay on the ledger stream"); the migration shows the view stream needs it.
10
+
11
+ ## Chosen route
12
+
13
+ - The view model stays a fold of committed ledger records only. Live text travels as an ephemeral `text` delta kind
14
+ (`{run_id, node_id, call_id, channel, seq, text}` appended, `text_end`) produced by the gateway from
15
+ `abstractruntime.core.live_deltas` sinks (gateway 0954), never persisted, superseded by the committed message record.
16
+ - `ReplayView.apply` / `apply(view, new_records)` ignore ephemeral deltas explicitly (a record of kind `llm.delta`,
17
+ `llm.delta_end`, `text` or `text_end` leaves the view and `last_delta` unchanged), so a client that feeds the whole
18
+ stream into a port of the reducer cannot corrupt its view; ADR 0010 states the rule (the cursor is `seq`; ephemeral
19
+ frames carry none).
20
+ - Conformance fixture: a stream with interleaved ephemeral frames folds to the same view as without them; a fixture of
21
+ the client rule "drop a call's live text when its committed message arrives".
22
+ - Interim (option B in gateway 0954): clients keep `/ledger/stream` open for live deltas alongside `/view/stream`.
23
+
24
+ ## Acceptance criteria
25
+
26
+ - [ ] `apply` ignores ephemeral kinds; a test red when the guard is removed.
27
+ - [ ] Conformance fixtures shipped as package data; ADR 0010 amended.
@@ -0,0 +1,34 @@
1
+ # 0860 — Replay view: a forced stop reads "Stopped" (the stop's wording is not in the view)
2
+
3
+ **Status**: proposed · **Priority**: P2 · **Created**: 2026-10-28
4
+ **Package**: abstractruntime (`replay/view.py`) · **Slice**: abstractgateway (`discovery/capabilities`)
5
+ **Parent**: 0854 (replay view), framework root backlog 0993 · **Found by**: AbstractUIC backlog 0040 (panel-chat 0.6.0 renders the view)
6
+
7
+ ## Problem
8
+
9
+ A client that renders the replay view cannot tell a Stop the person asked for from one the gateway
10
+ forced. The ledger knows: the gateway's kill switch writes an `abstract.status` record with
11
+ `killed_by: "kill_switch"` and its text ("Stop forced at 10 s: inference killed", conformance case
12
+ `d_cancellation`). The reducer keeps only the text, as `display_status` of the run
13
+ (`view.py` `_fold_event`, the `abstract.status` branch), and drops `killed_by`. panel-chat's ledger
14
+ fold showed "Stop forced: inference killed" from that record; in view mode it can only say
15
+ "Stopped", and a client that clears `display_status` on a terminal status (panel-chat does, as its
16
+ ledger fold did) loses the text too.
17
+
18
+ A second, related gap: AbstractGateway 0.17.0 does not list the view in `GET discovery/capabilities`,
19
+ so every client must probe `GET /view` once and treat FastAPI's route-missing 404 as "no view".
20
+
21
+ ## Proposal
22
+
23
+ - The view carries how the run was stopped: on the root (and each `runs[]` row) a `stop` object
24
+ `{by: "person"|"kill_switch"|"timeout"|…, text, seq}` folded from the attribution record
25
+ (`killed_by`, `cancelled_by` on the cancelled `llm_call`), and a `stop` change in `changes`.
26
+ - The gateway advertises `capabilities.replay_view: {supported: true, version: "replay_view_v1",
27
+ endpoints: {view, stream}}`.
28
+
29
+ ## Acceptance
30
+
31
+ - `d_cancellation`'s expected view names the kill switch and its text; a person's cancel
32
+ (`cancelled_by`) reads as such; a new conformance case for a person's Stop.
33
+ - `GET discovery/capabilities` lists `replay_view`; panel-chat passes it as `advertised` and stops
34
+ probing.
@@ -0,0 +1,34 @@
1
+ # 0861 — Replay view activities: the tool sandbox and per-call model timings
2
+
3
+ **Status**: proposed · **Priority**: P2 · **Created**: 2026-10-28
4
+ **Package**: abstractruntime (`replay/view.py` `_fill_activity`)
5
+ **Parent**: 0854 (replay view), framework root backlog 0993 · **Found by**: AbstractUIC backlog 0040 (panel-chat 0.6.0 renders the view)
6
+
7
+ ## Problem
8
+
9
+ Two things clients showed from raw records are not in `replay_view_v1.activities[]`:
10
+
11
+ 1. **The command sandbox of a tool call.** A process-spawning tool's result carries
12
+ `output.sandbox` (macOS sandbox-exec, Linux bubblewrap/Landlock, "none — refused", the enforced
13
+ workspaces). panel-chat's `ToolSandboxLine` renders it from the ledger; a view tool call has
14
+ `output` only when the output is the tool's value, and the sandbox block is not kept as a field.
15
+ 2. **Per-call model timings.** An `llm` activity carries `usage` (tokens) but not the call's
16
+ `gen_time`, the provider's prompt rate (prefill time), cache reuse or the model load. panel-chat's
17
+ turn statistics (`genTimeMs`, `prefillMs`, `decodeMs`, `timedCalls`, the slowest tool batch)
18
+ came from these record fields; in view mode only tokens, call counts, changed files and the
19
+ turn's span remain.
20
+
21
+ ## Proposal
22
+
23
+ - `tool_calls[].sandbox`: the call's sandbox block as the tool reported it (`label`, `enforced`,
24
+ `workspaces`, `refused`), absent when the tool spawned nothing.
25
+ - `activities[kind=llm].timing`: `{gen_time_ms, prompt_tokens_per_s, completion_tokens_per_s,
26
+ cached_tokens, load_ms}` exactly as the record reported them (a field absent when not reported:
27
+ zero is a claim).
28
+ - `usage` on the view keeps its meaning (sums); timings are not summed by the reducer.
29
+
30
+ ## Acceptance
31
+
32
+ - A conformance case with a sandboxed `execute_command` and an MLX call that reports
33
+ `gen_time` / rates; expected views carry both.
34
+ - panel-chat's `replayStatistics` and tool rows read them (AbstractUIC follow-up of 0040).
@@ -0,0 +1,48 @@
1
+ # 0862 — Replay view: a message's artifacts are what the run produced, not its offloaded bookkeeping
2
+
3
+ **Status**: proposed · **Priority**: P2 · **Created**: 2026-10-28
4
+ **Package**: abstractruntime (`replay/view.py` `_final_message` / `_note_artifacts` / `_artifact_refs`; the run-output and node-trace offload)
5
+ **Parent**: 0854 (replay view) · **Found by**: operator QA 2026-10-28 (b) on the desktop Assistant (AbstractAssistant backlog 1067)
6
+
7
+ ## Problem
8
+
9
+ An automation answer in the desktop Assistant showed two chips named by raw ids (`7c8efef…`, `f738932…`); opening
10
+ one failed with "artifact not found". Evidence (operator data dir, run `68c30dd3…`, session
11
+ `automation:7f7613b4…`, AbstractRuntime 0.15.0, AbstractGateway 0.17.0):
12
+
13
+ 1. **The final message lists bookkeeping as its artifacts.** `_final_message(..., refs=_artifact_refs(output))`
14
+ takes EVERY `$artifact` under the completion output. An agent's output carries `scratchpad`; the runtime
15
+ offloads its large values into the artifact store, so the message's `artifact_ids` were the agent's system
16
+ prompt (`text/plain`, 4,340 B, tag `source=node_trace_offload`, path
17
+ `output.scratchpad.node_traces.reason.steps[0].result.metadata._provider_request.payload.messages[0].content`)
18
+ and its step list (`application/json`, 145,460 B, `source=run_output_offload`, path `output.scratchpad.steps`).
19
+ Neither is something the person asked for.
20
+ 2. **`view.artifacts` misses a ref the message lists.** `_note_artifacts` walks the completion RESULT, one level
21
+ above the output `_final_message` walks; the system-prompt ref sits at depth 12 from the result, and
22
+ `_artifact_refs` stops at `_MAX_WALK_DEPTH = 12`. The message names an artifact the view does not describe
23
+ (no path, no owning run): a client cannot label it or know which run serves it.
24
+ 3. **The offload belongs to a child run.** The system-prompt artifact's `run_id` is the agent's child run
25
+ (`d072afe8…`, parent chain under the root), with no `session_id` tag; the gateway's content route serves an
26
+ artifact only through its own run or the session's memory run (`_assert_artifact_visible_to_run`), so a client
27
+ asking through the root run gets 404 "artifact not found" although the blob exists.
28
+
29
+ 4. **The snapshot-built final has the same problem, unlisted.** When no completion record was folded,
30
+ `_finalize` builds `:final` from `snapshot.output_artifacts` (every ref under the output, bookkeeping included)
31
+ and lists none of them in `view.artifacts`, so a client cannot tell an image from a scratchpad offload.
32
+
33
+ ## Proposal
34
+
35
+ - A message's `artifact_ids` exclude refs under the run's bookkeeping (`scratchpad`, node traces, `_`-prefixed
36
+ metadata such as `_provider_request`, `_runtime_observability`), or carry a `role` per artifact
37
+ (`output` / `bookkeeping`) so every client applies one rule. Conformance case: an agent completion whose output
38
+ holds offloaded scratchpad values and one real `image_artifact`.
39
+ - `_note_artifacts` and the message walk use the same root and depth bound, so every id a message lists is in
40
+ `view.artifacts` (invariant: `message.artifact_ids ⊆ {a.id for a in view.artifacts}`).
41
+ - Offloads made for a run in a session carry the session (tag or descriptor), so the gateway can serve a child
42
+ run's artifact through the root run of the same session; or the view's artifact entry names its owning run (it
43
+ does: `run_id`) and clients are told to use it (AbstractAssistant 0.16.3 does).
44
+
45
+ ## Client status
46
+
47
+ AbstractAssistant 0.16.3 drops listed bookkeeping refs, and unlisted refs of a ledger-folded final, on its side (a snapshot-built final keeps its unlisted refs) and opens each artifact through its
48
+ owning run; AbstractUIC panel-chat and the iPhone/watch clients should apply the same rule until this lands.
@@ -55,10 +55,21 @@ See llms.txt for the linked index.
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.15.0 • **Python:** 3.10+
58
+ **Version:** 0.15.2 • **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.2
63
+
64
+ - **Run index builds never lose a run created during them**: a run another process (or store object) wrote while
65
+ this store built its indexes is in the session and children indexes and the listing at once (before, the session
66
+ index could miss it for the life of the store object; backlog 0863).
67
+
68
+ ## What's new in 0.15.1
69
+
70
+ - **Is Empty accepts lists**: nothing, an empty text, or a list or object with no elements is empty (visual-flow
71
+ node `is_empty_string`; backlog 0862).
72
+
62
73
  ## What's new in 0.15.0
63
74
 
64
75
  - **Memory facade** (`abstractruntime.integrations.abstractmemory.memory_facade.MemoryFacade`): the one
@@ -3,7 +3,7 @@
3
3
  > Durable workflow runtime (interrupt → checkpoint → resume) with an append-only execution ledger.
4
4
 
5
5
  - Python: 3.10+ (see `pyproject.toml`)
6
- - Version: 0.15.0
6
+ - Version: 0.15.2
7
7
  - Ecosystem: [AbstractFramework](https://github.com/lpalbou/AbstractFramework) umbrella, integrates with [AbstractCore](https://github.com/lpalbou/abstractcore)
8
8
  - Hard invariant: `RunState.vars` must be JSON-serializable (`src/abstractruntime/core/models.py`)
9
9
  - Current AbstractCore baseline: base `abstractruntime` requires AbstractCore 2.30.0 or newer with its light install (remote providers, tools and the MCP worker, media routing); `abstractruntime[apple]` and `abstractruntime[gpu]` require AbstractCore's `apple` and `gpu` settings (`pyproject.toml`)
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "AbstractRuntime"
7
- version = "0.15.0"
7
+ version = "0.15.2"
8
8
  description = "AbstractRuntime: a durable graph runner designed to pair with AbstractCore."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -0,0 +1,11 @@
1
+ ### Fixed
2
+
3
+ - **An index build no longer loses a run another store object creates during it** (`JsonFileRunStore`, backlog 0863).
4
+ A new run's `+` journal line is written before its file is published; a session/children/active index build that
5
+ marked the journal between the two and scanned the folder before the file landed missed the run: the listing until
6
+ the next reconciliation, the session and children indexes for the life of the store object (the reconciliation
7
+ repaired only the listing). Seen as a gateway that answered 404 `session_not_found` when archiving a session written
8
+ while it booted (AbstractGateway backlog 0963); a split-mode runner creating a run during the API process's boot
9
+ hit the same window. The first sync after a build now re-applies the journal's last 16 KiB before the build's mark
10
+ (`JOURNAL_REPLAY_TAIL_BYTES`; idempotent, once per build), and the reconciliation re-files a run it repairs into
11
+ the session and children indexes too (and drops a vanished one from them).
@@ -130,6 +130,10 @@ class JsonFileRunStore(RunStore):
130
130
  # A run temp file older than this is an orphan of a crashed writer (a
131
131
  # save()/create_if_absent() publishes its temp within milliseconds).
132
132
  STALE_TEMP_AGE_S = 600.0
133
+ # An index build re-applies the journal records written in this many bytes BEFORE its mark
134
+ # (`_mark_journal_start`; ~400 records): a run whose `+` line landed before the mark while its
135
+ # file was published after the folder scan is otherwise in neither (gateway backlog 0963).
136
+ JOURNAL_REPLAY_TAIL_BYTES = 16 * 1024
133
137
  # Background reconciliation of the active index (foreign writers that bypass the journal).
134
138
  ACTIVE_INDEX_RESCAN_S = 60.0
135
139
  # Trusted run index: with the folder and the creation log unchanged since the last
@@ -701,6 +705,7 @@ class JsonFileRunStore(RunStore):
701
705
  self._children_index = children
702
706
  self._run_parent_index = run_parent
703
707
  self._maybe_persist_scan_memo()
708
+ self._sync_indexes() # the journal tail before the mark (`_journal_replay_start`), at once
704
709
 
705
710
  # --- creation journal ------------------------------------------------
706
711
 
@@ -745,7 +750,32 @@ class JsonFileRunStore(RunStore):
745
750
  with self._journal_lock:
746
751
  if self._journal_offset is None:
747
752
  size = self._journal_size()
748
- self._journal_offset = size if size is not None else 0
753
+ self._journal_offset = self._journal_replay_start(size) if size is not None else 0
754
+
755
+ def _journal_replay_start(self, size: int) -> int:
756
+ """Where the first sync after an index build starts reading: the first record boundary
757
+ within JOURNAL_REPLAY_TAIL_BYTES before `size` (the journal's size at the mark).
758
+
759
+ `_save` appends a new run's `+id` BEFORE publishing its file (J53-1). A build that marks
760
+ the journal at `size` and then scans the folder misses a run whose line is before the
761
+ mark and whose file lands after the scan; re-applying the tail (idempotent: a `+` whose
762
+ file exists is filed, one whose file is still absent stays pending until it appears)
763
+ closes that window. Cost: one read of at most JOURNAL_REPLAY_TAIL_BYTES and one stat per
764
+ record in it, once per build. A record older than the tail is still caught by the
765
+ periodic reconciliation, which re-files what it repairs in every index and logs it."""
766
+ start = max(0, int(size) - int(self.JOURNAL_REPLAY_TAIL_BYTES))
767
+ if start == 0:
768
+ return 0
769
+ try:
770
+ with open(self._journal_path, "rb") as f:
771
+ f.seek(start)
772
+ chunk = f.read(int(size) - start)
773
+ except OSError:
774
+ logger.warning("JsonFileRunStore: creation journal tail unreadable; index build replays nothing before its mark",
775
+ exc_info=True)
776
+ return int(size)
777
+ boundary = chunk.find(b"\n") # records are framed `\n<op><run_id>\n`: start after a newline
778
+ return start + boundary + 1 if boundary >= 0 else int(size)
749
779
 
750
780
  def _sync_indexes(self) -> None:
751
781
  """Apply journal lines appended since the last sync (one stat when
@@ -880,6 +910,7 @@ class JsonFileRunStore(RunStore):
880
910
  self._session_index = index
881
911
  self._run_session = by_run
882
912
  self._maybe_persist_scan_memo()
913
+ self._sync_indexes() # the journal tail before the mark (`_journal_replay_start`), at once
883
914
 
884
915
  def _update_session_index_on_save(self, run: RunState) -> None:
885
916
  rid = str(run.run_id)
@@ -1324,6 +1355,7 @@ class JsonFileRunStore(RunStore):
1324
1355
  t0 = time.monotonic()
1325
1356
  settled_ns = time.time_ns() - int(float(self.RUN_INDEX_IN_FLIGHT_S) * 1e9)
1326
1357
  repaired: List[str] = []
1358
+ refile: Dict[str, Dict[str, Any]] = {}
1327
1359
  found: set[str] = set()
1328
1360
  seen: set[str] = set()
1329
1361
  for p in self._base.glob("run_*.json"):
@@ -1341,6 +1373,8 @@ class JsonFileRunStore(RunStore):
1341
1373
  cur_tok = tuple(cur[0]) if cur is not None else None
1342
1374
  if cur_tok is not None and cur_tok != prev_tok and cur_tok[0] < settled_ns:
1343
1375
  repaired.append(rid)
1376
+ if fields is not None and rid:
1377
+ refile[rid] = fields
1344
1378
  if fields is None:
1345
1379
  continue
1346
1380
  if self._is_active_status(fields.get("status")):
@@ -1349,6 +1383,13 @@ class JsonFileRunStore(RunStore):
1349
1383
  self._sync_indexes()
1350
1384
  dropped = self._scan_memo_prune(seen)
1351
1385
  if complete:
1386
+ # A run the session/children indexes missed (gateway backlog 0963) is re-filed there
1387
+ # too, not only in the memo and the active set; a vanished one leaves them.
1388
+ for rid, fields in refile.items():
1389
+ self._index_fields_into_indexes(rid, fields)
1390
+ for rid in dropped:
1391
+ self._drop_from_children_index(rid)
1392
+ self._drop_from_session_index(rid)
1352
1393
  repaired.extend(dropped)
1353
1394
  self._note_reconcile(repaired, files=len(seen), seconds=time.monotonic() - t0)
1354
1395
  return found
@@ -283,10 +283,15 @@ def string_length(inputs: Dict[str, Any]) -> int:
283
283
 
284
284
 
285
285
  def string_is_empty(inputs: Dict[str, Any]) -> bool:
286
- """Return True if `text` is exactly empty."""
287
- text_raw = inputs.get("text")
288
- text = "" if text_raw is None else str(text_raw)
289
- return text == ""
286
+ """Is Empty: True when `text` is nothing (unset / None), an empty string, or a list,
287
+ tuple, set or object with no elements (operator QA 2026-10-28: a list variable filled
288
+ by a loop is checked with one node). Whitespace is not empty; any other value is not."""
289
+ value = inputs.get("text")
290
+ if value is None:
291
+ return True
292
+ if isinstance(value, (list, tuple, set, frozenset, dict)):
293
+ return len(value) == 0
294
+ return str(value) == ""
290
295
 
291
296
 
292
297
  def string_contains(inputs: Dict[str, Any]) -> bool: