AbstractRuntime 0.15.1__tar.gz → 0.15.3__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.1 → abstractruntime-0.15.3}/CHANGELOG.md +32 -1
  2. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/PKG-INFO +16 -3
  3. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/README.md +15 -2
  4. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/README.md +5 -2
  5. abstractruntime-0.15.1/docs/backlog/completed/0857_is_empty_accepts_lists.md → abstractruntime-0.15.3/docs/backlog/completed/0862_is_empty_accepts_lists.md +2 -2
  6. abstractruntime-0.15.3/docs/backlog/completed/0863_index_build_never_loses_a_run_created_during_it.md +48 -0
  7. abstractruntime-0.15.3/docs/backlog/proposed/0862_replay_view_message_artifacts_exclude_bookkeeping.md +48 -0
  8. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/llms-full.txt +15 -2
  9. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/llms.txt +1 -1
  10. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/pyproject.toml +1 -1
  11. abstractruntime-0.15.3/release-notes.md +14 -0
  12. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/storage/json_files.py +117 -13
  13. abstractruntime-0.15.3/tests/test_json_file_run_store_change_token_after_build.py +131 -0
  14. abstractruntime-0.15.3/tests/test_json_file_run_store_index_build_race.py +93 -0
  15. abstractruntime-0.15.1/release-notes.md +0 -3
  16. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/.github/workflows/ci.yml +0 -0
  17. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/.github/workflows/release.yml +0 -0
  18. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/.gitignore +0 -0
  19. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/ACKNOWLEDGMENTS.md +0 -0
  20. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/CODE_OF_CONDUCT.md +0 -0
  21. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/CONTRIBUTING.md +0 -0
  22. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/LICENSE +0 -0
  23. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/ROADMAP.md +0 -0
  24. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/SECURITY.md +0 -0
  25. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/README.md +0 -0
  26. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
  27. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
  28. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
  29. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/adr/0004_runtime_owns_run_scoped_media_execution_truth.md +0 -0
  30. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/adr/0005_runtime_owns_abstractcore_host_discovery_queries.md +0 -0
  31. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/adr/0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md +0 -0
  32. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/adr/0007_runtime_relays_core_owned_model_residency_truth.md +0 -0
  33. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/adr/0008_integration_facades_are_the_complete_host_surface.md +0 -0
  34. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/adr/0010_one_replay_many_views.md +0 -0
  35. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/adr/0011_memory_facade_is_the_complete_host_surface_for_abstractmemory.md +0 -0
  36. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/adr/README.md +0 -0
  37. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/api.md +0 -0
  38. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/architecture.md +0 -0
  39. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/artifacts.md +0 -0
  40. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/automations.md +0 -0
  41. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/completed/001_runtime_kernel.md +0 -0
  42. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
  43. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/completed/0030_runtime_host_facades_for_comms_telegram_and_tool_specs.md +0 -0
  44. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/completed/0032_runtime_durable_outbound_comms_truth.md +0 -0
  45. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/completed/0033_runtime_host_local_prompt_cache_export_import_surface.md +0 -0
  46. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/completed/0035_model_residency_provider_truth_for_local_http_clients.md +0 -0
  47. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/completed/0037_visualflow_generate_music_node_compiler_parity.md +0 -0
  48. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/completed/0039_runtime_music_structure_prompt_bool_contract.md +0 -0
  49. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/completed/003_wait_primitives.md +0 -0
  50. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/completed/0040_task_agnostic_local_residency_listing.md +0 -0
  51. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/completed/0041_runtime_hardware_extras_avoid_nonpermissive_document_stacks.md +0 -0
  52. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/completed/0042_core_vision_upscale_and_parameter_surface.md +0 -0
  53. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/completed/0043_runtime_vision_adapter_and_batch_surface.md +0 -0
  54. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/completed/004_scheduler_driver.md +0 -0
  55. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
  56. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
  57. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
  58. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/completed/009_artifact_store.md +0 -0
  59. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/completed/010_examples_and_composition.md +0 -0
  60. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/completed/011_subworkflow_support.md +0 -0
  61. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
  62. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
  63. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
  64. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/completed/019_runtime_host_facade_for_core_operator_surfaces.md +0 -0
  65. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/completed/020_runtime_gateway_install_boundary.md +0 -0
  66. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/completed/021_runtime_gateway_env_namespace_cleanup.md +0 -0
  67. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/completed/022_model_residency_control_plane.md +0 -0
  68. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/completed/023_truthful_local_media_residency_boundaries.md +0 -0
  69. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/completed/024_runtime_owned_run_scoped_media_execution.md +0 -0
  70. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md +0 -0
  71. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md +0 -0
  72. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/completed/028_runtime_bloc_kv_lifecycle_and_pruning.md +0 -0
  73. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/completed/029_runtime_music_generation_and_discovery_via_abstractcore.md +0 -0
  74. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/completed/0846_mlx_instance_scheduling_and_execution_controls.md +0 -0
  75. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/completed/0847_automations_v1_controller_contracts_occurrences_triggers.md +0 -0
  76. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/completed/0851_per_account_voice_stores.md +0 -0
  77. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/completed/0852_capability_refusals_are_not_retried.md +0 -0
  78. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/completed/0855_prefix_stability_contract_of_consecutive_llm_calls.md +0 -0
  79. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/completed/0856_memory_facade_and_ledger_provenance.md +0 -0
  80. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
  81. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
  82. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
  83. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
  84. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/deprecated/0034_agent_runtime_convenience_constructor.md +0 -0
  85. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
  86. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
  87. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
  88. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/deprecated/004_tests.md +0 -0
  89. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/deprecated/005_docs_updates.md +0 -0
  90. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
  91. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
  92. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
  93. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/deprecated/README.md +0 -0
  94. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
  95. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/planned/0070_standalone_wui_browser_session_security_contract.md +0 -0
  96. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
  97. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
  98. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
  99. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
  100. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/planned/0233_real_run_cancellation.md +0 -0
  101. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/planned/025_runtime_retention_and_purge_contract.md +0 -0
  102. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/planned/026_context_checkpoint_self_compression.md +0 -0
  103. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/planned/027_quote_provenance_discipline.md +0 -0
  104. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/planned/028_selective_artifact_rehydration.md +0 -0
  105. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/planned/0845_session_prompt_cache_resume_and_purge_contract.md +0 -0
  106. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/planned/0848_automations_v2_external_event_inbox_and_run_triggers.md +0 -0
  107. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/planned/0853_session_tool_policy_before_the_approval_wait.md +0 -0
  108. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/planned/0854_replay_view.md +0 -0
  109. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/planned/0857_entity_direct_memory_writes_provenance.md +0 -0
  110. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/planned/0858_typed_runs_run_type_stamped_at_start.md +0 -0
  111. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/planned/0859_replay_view_ephemeral_text_deltas.md +0 -0
  112. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/planned/runtime_portability/0065_portable_process_and_lock_layer.md +0 -0
  113. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/planned/runtime_portability/0066_portable_io_and_media_reader.md +0 -0
  114. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/planned/runtime_portability/README.md +0 -0
  115. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/planned/runtime_systemic_reliability/0044_meta_analysis_record.md +0 -0
  116. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/planned/runtime_systemic_reliability/0045_crash_replay_harness_and_ordering_invariant.md +0 -0
  117. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/planned/runtime_systemic_reliability/0046_per_run_driver_exclusion.md +0 -0
  118. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/planned/runtime_systemic_reliability/0047_indexed_idempotency_lookup.md +0 -0
  119. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/planned/runtime_systemic_reliability/0048_durable_io_unification.md +0 -0
  120. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/planned/runtime_systemic_reliability/0049_llm_client_mechanical_split.md +0 -0
  121. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/planned/runtime_systemic_reliability/0050_control_sidecar_all_writers.md +0 -0
  122. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/planned/runtime_systemic_reliability/0051_runtime_owned_durable_event_mailbox.md +0 -0
  123. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/planned/runtime_systemic_reliability/0052_sync_store_event_loop_tripwire.md +0 -0
  124. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/planned/runtime_systemic_reliability/0053_bounded_run_vars_growth.md +0 -0
  125. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/planned/runtime_systemic_reliability/0054_runtime_health_counters.md +0 -0
  126. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/planned/runtime_systemic_reliability/0055_jsonl_store_honesty.md +0 -0
  127. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/planned/runtime_systemic_reliability/0064_prompt_cache_fingerprint_stability.md +0 -0
  128. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/planned/runtime_systemic_reliability/0067_durable_write_discipline.md +0 -0
  129. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/planned/runtime_systemic_reliability/0068_hot_path_store_reads.md +0 -0
  130. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/planned/runtime_systemic_reliability/README.md +0 -0
  131. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/proposed/0031_runtime_tool_spec_adapters_for_gateway_and_mcp.md +0 -0
  132. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/proposed/0036_local_media_residency_bridge_to_core_residency.md +0 -0
  133. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/proposed/0038_core_server_pool_residency_affinity.md +0 -0
  134. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/proposed/0069_document_renderer_professional_figures.md +0 -0
  135. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/proposed/0849_conversation_search_tool_usage_outputs_and_thinking.md +0 -0
  136. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/proposed/0850_growing_automation_history_out_of_the_controller_ledger.md +0 -0
  137. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/proposed/0860_replay_view_stop_wording_from_the_ledger.md +0 -0
  138. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/proposed/0861_replay_view_activity_tool_sandbox_and_call_timings.md +0 -0
  139. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/proposed/runtime_systemic_reliability/0056_schema_version_and_quarantine_loading.md +0 -0
  140. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/proposed/runtime_systemic_reliability/0057_trust_boundary_stamp_registry.md +0 -0
  141. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/proposed/runtime_systemic_reliability/0058_terminal_run_archival_helper.md +0 -0
  142. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/proposed/runtime_systemic_reliability/0059_memory_span_handler_extraction.md +0 -0
  143. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/proposed/runtime_systemic_reliability/0060_visualflow_compiler_decomposition.md +0 -0
  144. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/proposed/runtime_systemic_reliability/0061_root_api_deprecation_machinery.md +0 -0
  145. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/proposed/runtime_systemic_reliability/0062_dependency_honesty_extras.md +0 -0
  146. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/proposed/runtime_systemic_reliability/0063_b3_envelope_lane_unification.md +0 -0
  147. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/backlog/proposed/runtime_systemic_reliability/README.md +0 -0
  148. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/email.md +0 -0
  149. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/entity-runtime.md +0 -0
  150. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/evidence.md +0 -0
  151. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/faq.md +0 -0
  152. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/getting-started.md +0 -0
  153. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/integrations/abstractcore.md +0 -0
  154. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/integrations/abstractmemory.md +0 -0
  155. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/limits.md +0 -0
  156. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/manual_testing.md +0 -0
  157. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/mcp-worker.md +0 -0
  158. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/proposal.md +0 -0
  159. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/provenance.md +0 -0
  160. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/replay.md +0 -0
  161. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/snapshots.md +0 -0
  162. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/tool-approval.md +0 -0
  163. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/tools-comms.md +0 -0
  164. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/troubleshooting.md +0 -0
  165. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/docs/workflow-bundles.md +0 -0
  166. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/examples/01_hello_world.py +0 -0
  167. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/examples/02_ask_user.py +0 -0
  168. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/examples/03_wait_until.py +0 -0
  169. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/examples/04_multi_step.py +0 -0
  170. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/examples/05_persistence.py +0 -0
  171. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/examples/06_llm_integration.py +0 -0
  172. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/examples/07_react_agent.py +0 -0
  173. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/examples/README.md +0 -0
  174. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/mkdocs.yml +0 -0
  175. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/pytest.ini +0 -0
  176. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/scripts/backfill_diary_edges.py +0 -0
  177. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/scripts/generate_llms_full.py +0 -0
  178. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/scripts/regen_replay_conformance.py +0 -0
  179. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/__init__.py +0 -0
  180. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/automation_queries.py +0 -0
  181. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/automations/__init__.py +0 -0
  182. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/automations/adapters.py +0 -0
  183. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/automations/attention.py +0 -0
  184. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/automations/bundle.py +0 -0
  185. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/automations/bundles/automation-controller/flows/controller.json +0 -0
  186. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/automations/bundles/automation-controller/manifest.json +0 -0
  187. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/automations/commands.py +0 -0
  188. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/automations/consumers.py +0 -0
  189. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/automations/controller.py +0 -0
  190. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/automations/ledger.py +0 -0
  191. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/automations/models.py +0 -0
  192. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/automations/samples.py +0 -0
  193. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/automations/service.py +0 -0
  194. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/automations/wakes.py +0 -0
  195. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/conversation_search.py +0 -0
  196. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/core/__init__.py +0 -0
  197. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/core/config.py +0 -0
  198. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/core/effect_cancellation.py +0 -0
  199. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/core/event_keys.py +0 -0
  200. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/core/health.py +0 -0
  201. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/core/live_deltas.py +0 -0
  202. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/core/models.py +0 -0
  203. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/core/policy.py +0 -0
  204. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/core/progress_channel.py +0 -0
  205. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/core/publish.py +0 -0
  206. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/core/run_attribution.py +0 -0
  207. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/core/run_identity.py +0 -0
  208. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/core/run_lifecycle.py +0 -0
  209. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/core/run_origin.py +0 -0
  210. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/core/runtime.py +0 -0
  211. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/core/spec.py +0 -0
  212. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/core/step_context.py +0 -0
  213. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/core/tool_scope.py +0 -0
  214. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/core/vars.py +0 -0
  215. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/documents/__init__.py +0 -0
  216. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/documents/charts.py +0 -0
  217. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/documents/docx.py +0 -0
  218. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/documents/pdf.py +0 -0
  219. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/email/__init__.py +0 -0
  220. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/email/actions.py +0 -0
  221. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/email/automations.py +0 -0
  222. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/email/binding.py +0 -0
  223. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/email/feeder.py +0 -0
  224. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/email/frame.py +0 -0
  225. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/email/inbox.py +0 -0
  226. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/evidence/__init__.py +0 -0
  227. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/evidence/recorder.py +0 -0
  228. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/history_bundle.py +0 -0
  229. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/identity/__init__.py +0 -0
  230. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/identity/act_only.py +0 -0
  231. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/identity/chat.py +0 -0
  232. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/identity/communities.py +0 -0
  233. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/identity/diary.py +0 -0
  234. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/identity/digest.py +0 -0
  235. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/identity/entity_runtime.py +0 -0
  236. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/identity/fingerprint.py +0 -0
  237. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/identity/lease.py +0 -0
  238. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/identity/life.py +0 -0
  239. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/identity/memory_reader.py +0 -0
  240. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/identity/night_voice.py +0 -0
  241. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/identity/phase_graph.py +0 -0
  242. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/identity/phase_spec.py +0 -0
  243. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/identity/prelude.py +0 -0
  244. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/identity/prompt_overlay.py +0 -0
  245. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/identity/reflection.py +0 -0
  246. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/identity/spec/entity_phases.vendored.json +0 -0
  247. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/identity/substrate.py +0 -0
  248. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/identity/tool_effects.py +0 -0
  249. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/identity/tool_policy.py +0 -0
  250. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/identity/tools.py +0 -0
  251. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/identity/visit_workflow.py +0 -0
  252. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/integrations/__init__.py +0 -0
  253. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/integrations/abstractcore/__init__.py +0 -0
  254. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/integrations/abstractcore/agora_tools.py +0 -0
  255. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/integrations/abstractcore/command_sandbox_host.py +0 -0
  256. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/integrations/abstractcore/comms_facade.py +0 -0
  257. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/integrations/abstractcore/config_facade.py +0 -0
  258. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
  259. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/integrations/abstractcore/data_registry_facade.py +0 -0
  260. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
  261. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/integrations/abstractcore/discovery_facade.py +0 -0
  262. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/integrations/abstractcore/discovery_queries.py +0 -0
  263. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +0 -0
  264. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/integrations/abstractcore/email_facade.py +0 -0
  265. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
  266. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/integrations/abstractcore/factory.py +0 -0
  267. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/integrations/abstractcore/host_facade.py +0 -0
  268. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/integrations/abstractcore/llm_client.py +0 -0
  269. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/integrations/abstractcore/local_helper_tools.py +0 -0
  270. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
  271. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/integrations/abstractcore/mcp_facade.py +0 -0
  272. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
  273. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/integrations/abstractcore/media_subprocess.py +0 -0
  274. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
  275. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/integrations/abstractcore/output_specs.py +0 -0
  276. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/integrations/abstractcore/run_facade.py +0 -0
  277. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/integrations/abstractcore/server_facade.py +0 -0
  278. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
  279. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/integrations/abstractcore/structured_facade.py +0 -0
  280. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
  281. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/integrations/abstractcore/telegram_facade.py +0 -0
  282. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/integrations/abstractcore/tool_effects.py +0 -0
  283. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -0
  284. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/integrations/abstractcore/tool_inventory_facade.py +0 -0
  285. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/integrations/abstractcore/voice_facade.py +0 -0
  286. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/integrations/abstractcore/voice_library.py +0 -0
  287. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +0 -0
  288. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
  289. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/integrations/abstractmemory/brain_handlers.py +0 -0
  290. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
  291. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/integrations/abstractmemory/identity_support.py +0 -0
  292. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/integrations/abstractmemory/memory_facade.py +0 -0
  293. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/integrations/abstractmemory/seam_handlers.py +0 -0
  294. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/mail_verbs.py +0 -0
  295. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/memory/__init__.py +0 -0
  296. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/memory/active_context.py +0 -0
  297. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/memory/active_memory.py +0 -0
  298. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/memory/compaction.py +0 -0
  299. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/memory/kg_packets.py +0 -0
  300. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/memory/memact_composer.py +0 -0
  301. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/memory/recall_levels.py +0 -0
  302. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/memory/token_budget.py +0 -0
  303. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/rendering/__init__.py +0 -0
  304. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
  305. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/rendering/json_stringify.py +0 -0
  306. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/__init__.py +0 -0
  307. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/__init__.py +0 -0
  308. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/a2_delegated_approval_completed/expected_view.json +0 -0
  309. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/a2_delegated_approval_completed/manifest.json +0 -0
  310. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/a2_delegated_approval_completed/records.json +0 -0
  311. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/a2_delegated_approval_completed/runs.json +0 -0
  312. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/a_delegated_child_approval/expected_view.json +0 -0
  313. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/a_delegated_child_approval/manifest.json +0 -0
  314. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/a_delegated_child_approval/records.json +0 -0
  315. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/a_delegated_child_approval/runs.json +0 -0
  316. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/b_timer_without_resume/expected_view.json +0 -0
  317. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/b_timer_without_resume/manifest.json +0 -0
  318. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/b_timer_without_resume/records.json +0 -0
  319. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/b_timer_without_resume/runs.json +0 -0
  320. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/c_parallel_tool_batch/expected_view.json +0 -0
  321. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/c_parallel_tool_batch/manifest.json +0 -0
  322. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/c_parallel_tool_batch/records.json +0 -0
  323. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/c_parallel_tool_batch/runs.json +0 -0
  324. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/d_cancellation/expected_view.json +0 -0
  325. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/d_cancellation/manifest.json +0 -0
  326. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/d_cancellation/records.json +0 -0
  327. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/d_cancellation/runs.json +0 -0
  328. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/e2_structured_repeated_node/expected_view.json +0 -0
  329. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/e2_structured_repeated_node/manifest.json +0 -0
  330. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/e2_structured_repeated_node/records.json +0 -0
  331. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/e2_structured_repeated_node/runs.json +0 -0
  332. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/e_structured_output_agents/expected_view.json +0 -0
  333. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/e_structured_output_agents/manifest.json +0 -0
  334. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/e_structured_output_agents/records.json +0 -0
  335. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/e_structured_output_agents/runs.json +0 -0
  336. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/f_windowed_slim/expected_view.json +0 -0
  337. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/f_windowed_slim/manifest.json +0 -0
  338. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/f_windowed_slim/records.json +0 -0
  339. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/f_windowed_slim/runs.json +0 -0
  340. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/g_ask_user/expected_view.json +0 -0
  341. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/g_ask_user/manifest.json +0 -0
  342. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/g_ask_user/records.json +0 -0
  343. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/g_ask_user/runs.json +0 -0
  344. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/h_denied_approval/expected_view.json +0 -0
  345. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/h_denied_approval/manifest.json +0 -0
  346. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/h_denied_approval/records.json +0 -0
  347. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/h_denied_approval/runs.json +0 -0
  348. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/i_wait_kinds/expected_view.json +0 -0
  349. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/i_wait_kinds/manifest.json +0 -0
  350. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/i_wait_kinds/records.json +0 -0
  351. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/i_wait_kinds/runs.json +0 -0
  352. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/j_event_answered_then_pause/expected_view.json +0 -0
  353. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/j_event_answered_then_pause/manifest.json +0 -0
  354. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/j_event_answered_then_pause/records.json +0 -0
  355. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/j_event_answered_then_pause/runs.json +0 -0
  356. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/k_nested_delegation/expected_view.json +0 -0
  357. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/k_nested_delegation/manifest.json +0 -0
  358. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/k_nested_delegation/records.json +0 -0
  359. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/k_nested_delegation/runs.json +0 -0
  360. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/l_answer_then_completion/expected_view.json +0 -0
  361. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/l_answer_then_completion/manifest.json +0 -0
  362. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/l_answer_then_completion/records.json +0 -0
  363. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/l_answer_then_completion/runs.json +0 -0
  364. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/m_session_tool_policy/expected_view.json +0 -0
  365. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/m_session_tool_policy/manifest.json +0 -0
  366. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/m_session_tool_policy/records.json +0 -0
  367. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/conformance/m_session_tool_policy/runs.json +0 -0
  368. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/delta.py +0 -0
  369. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/executions.py +0 -0
  370. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/replay/view.py +0 -0
  371. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/scheduler/__init__.py +0 -0
  372. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/scheduler/convenience.py +0 -0
  373. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/scheduler/multi_store.py +0 -0
  374. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/scheduler/registry.py +0 -0
  375. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/scheduler/scheduler.py +0 -0
  376. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/session_history.py +0 -0
  377. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/session_turns.py +0 -0
  378. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/storage/__init__.py +0 -0
  379. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/storage/artifacts.py +0 -0
  380. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/storage/base.py +0 -0
  381. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/storage/change_ring.py +0 -0
  382. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/storage/commands.py +0 -0
  383. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/storage/in_memory.py +0 -0
  384. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/storage/lease.py +0 -0
  385. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/storage/ledger_chain.py +0 -0
  386. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/storage/ledger_slim.py +0 -0
  387. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/storage/observable.py +0 -0
  388. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/storage/offloading.py +0 -0
  389. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/storage/serialize.py +0 -0
  390. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/storage/session_tool_policy.py +0 -0
  391. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/storage/snapshots.py +0 -0
  392. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/storage/sqlite.py +0 -0
  393. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/storage/steer_sidecar.py +0 -0
  394. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/triggers/__init__.py +0 -0
  395. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/triggers/cloudevents.py +0 -0
  396. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/triggers/connection_events.py +0 -0
  397. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/triggers/connections.py +0 -0
  398. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/triggers/email_received.py +0 -0
  399. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/triggers/event_frame.py +0 -0
  400. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/triggers/feed.py +0 -0
  401. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/triggers/manual.py +0 -0
  402. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/triggers/protocol.py +0 -0
  403. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/triggers/registry.py +0 -0
  404. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/triggers/schedule.py +0 -0
  405. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/triggers/webhook.py +0 -0
  406. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/turn_grounding.py +0 -0
  407. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/utils/__init__.py +0 -0
  408. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/utils/atomic_files.py +0 -0
  409. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/utils/file_filters.py +0 -0
  410. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/utils/workspace_paths.py +0 -0
  411. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
  412. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
  413. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
  414. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
  415. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
  416. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
  417. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
  418. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
  419. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
  420. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
  421. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
  422. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/visualflow_compiler/compiler.py +0 -0
  423. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
  424. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
  425. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
  426. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
  427. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
  428. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/visualflow_compiler/visual/execution_metrics.py +0 -0
  429. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/visualflow_compiler/visual/executor.py +0 -0
  430. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/visualflow_compiler/visual/function_library.py +0 -0
  431. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/visualflow_compiler/visual/loop_back_check.py +0 -0
  432. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/visualflow_compiler/visual/loop_limit_lowering.py +0 -0
  433. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
  434. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
  435. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/visualflow_compiler/visual/pin_expressions.py +0 -0
  436. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/visualflow_compiler/visual/reroute_lowering.py +0 -0
  437. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
  438. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/workflow_bundle/models.py +0 -0
  439. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/workflow_bundle/packer.py +0 -0
  440. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/workflow_bundle/reader.py +0 -0
  441. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/src/abstractruntime/workflow_bundle/registry.py +0 -0
  442. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/README.md +0 -0
  443. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/automation_harness.py +0 -0
  444. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/conftest.py +0 -0
  445. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/email_wp2_support.py +0 -0
  446. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/fixtures/feeds/atom.xml +0 -0
  447. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/fixtures/feeds/rdf-not-a-feed.xml +0 -0
  448. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/fixtures/feeds/rss1-malformed.xml +0 -0
  449. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/fixtures/feeds/rss1.xml +0 -0
  450. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/fixtures/feeds/rss2.xml +0 -0
  451. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/fixtures/schedule_v1_corpus.json +0 -0
  452. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/live_email/conftest.py +0 -0
  453. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/live_email/live_email_support.py +0 -0
  454. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/live_email/test_email_live_runtime.py +0 -0
  455. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/media_endpoint_profile_probe.py +0 -0
  456. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_abstractcore_comms_facade.py +0 -0
  457. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_abstractcore_discovery_facade.py +0 -0
  458. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_abstractcore_host_facade.py +0 -0
  459. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_abstractcore_run_facade.py +0 -0
  460. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_abstractcore_server_facade.py +0 -0
  461. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_abstractcore_structured_facade.py +0 -0
  462. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_abstractcore_telegram_facade.py +0 -0
  463. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_active_consumers_index.py +0 -0
  464. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_active_context_policy.py +0 -0
  465. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_active_index.py +0 -0
  466. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_active_memory.py +0 -0
  467. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_agora_agent_alias_identity.py +0 -0
  468. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_agora_tools_http.py +0 -0
  469. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_analyze_media_addressing_and_walling.py +0 -0
  470. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_answer_user_effect.py +0 -0
  471. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_artifact_session_candidates.py +0 -0
  472. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_artifacts.py +0 -0
  473. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_automation_calendar_schedule.py +0 -0
  474. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_automation_commands.py +0 -0
  475. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_automation_controller.py +0 -0
  476. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_automation_controller_recovery.py +0 -0
  477. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_automation_definition.py +0 -0
  478. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_automation_discussion_isolation.py +0 -0
  479. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_automation_email_results.py +0 -0
  480. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_automation_growing_context.py +0 -0
  481. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_automation_index.py +0 -0
  482. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_automation_list_reads.py +0 -0
  483. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_automation_named_policy_compiler.py +0 -0
  484. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_automation_next_fire.py +0 -0
  485. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_automation_occurrence_input_resolver.py +0 -0
  486. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_automation_occurrence_recovery.py +0 -0
  487. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_automation_replay_read_only.py +0 -0
  488. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_automation_retry.py +0 -0
  489. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_automation_session_turns.py +0 -0
  490. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_automation_status.py +0 -0
  491. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_automation_tool_approval.py +0 -0
  492. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_browser_probe_target_walling.py +0 -0
  493. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_budget_law_no_unrequested_caps.py +0 -0
  494. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_capability_default_reasoning.py +0 -0
  495. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_chat_summarizer_integration.py +0 -0
  496. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_code_node_imports.py +0 -0
  497. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_code_node_restricted_python.py +0 -0
  498. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_command_sandbox_host_facade.py +0 -0
  499. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_command_store.py +0 -0
  500. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_compaction_helpers.py +0 -0
  501. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_compaction_summarizer_route.py +0 -0
  502. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_config_facade_models_engines.py +0 -0
  503. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_config_facade_voice_input_hint.py +0 -0
  504. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_control_adapter_while.py +0 -0
  505. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_controller_bundle_packaged.py +0 -0
  506. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_conversation_search.py +0 -0
  507. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_crash_ordering_inversions.py +0 -0
  508. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_create_if_absent.py +0 -0
  509. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_data_registry_facade.py +0 -0
  510. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_default_model_warmup_switch.py +0 -0
  511. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_default_tools_camera_gating.py +0 -0
  512. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_default_tools_comms_gating.py +0 -0
  513. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_default_tools_include_skim_files.py +0 -0
  514. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_default_tools_include_skim_folders.py +0 -0
  515. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_default_tools_include_skim_web.py +0 -0
  516. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_default_tools_search_files_executor.py +0 -0
  517. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_diary_capture.py +0 -0
  518. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_diary_write_rescue.py +0 -0
  519. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_directory_lease.py +0 -0
  520. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_disabled_toolsets_seam.py +0 -0
  521. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_discovery_survives_unbuildable_default.py +0 -0
  522. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_discovery_tts_unavailable_reason.py +0 -0
  523. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_discovery_voice_openai_api_key.py +0 -0
  524. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_discussion_session_anchor.py +0 -0
  525. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_document_markdown_tables.py +0 -0
  526. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_document_renderers_hr_quote.py +0 -0
  527. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_durable_toolsets.py +0 -0
  528. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_durable_write_discipline.py +0 -0
  529. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
  530. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_effect_cancellation.py +0 -0
  531. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_effect_issuance_idempotency.py +0 -0
  532. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_effect_payload_stays_json_serializable.py +0 -0
  533. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_election_consequence_teaching.py +0 -0
  534. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_email_binding_and_refiner.py +0 -0
  535. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_email_feeder_batched.py +0 -0
  536. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_email_feeder_flags.py +0 -0
  537. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_email_gate_fixes.py +0 -0
  538. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_email_inbox_and_trigger.py +0 -0
  539. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_email_received_mailbox_id.py +0 -0
  540. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_email_regate_fixes.py +0 -0
  541. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_email_review_fixes.py +0 -0
  542. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_email_self_trigger_loop.py +0 -0
  543. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_email_stream_consumers.py +0 -0
  544. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_email_toolset_and_walls.py +0 -0
  545. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_emergence_experiment.py +0 -0
  546. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_emit_event_uses_wait_index.py +0 -0
  547. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_emit_event_without_workflow_registry.py +0 -0
  548. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_endpoint_profile_media_end_to_end.py +0 -0
  549. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_endpoint_profile_media_in_process.py +0 -0
  550. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_endpoint_profile_media_specs_keep_provider.py +0 -0
  551. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_endpoint_profile_route_context.py +0 -0
  552. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_entity_awake_memory_fixes.py +0 -0
  553. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_entity_brain_effects.py +0 -0
  554. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_entity_chat_driver.py +0 -0
  555. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_entity_chat_tools_reflection.py +0 -0
  556. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_entity_diary.py +0 -0
  557. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_entity_execute_tool.py +0 -0
  558. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_entity_fetch_url_tool.py +0 -0
  559. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_entity_history_window.py +0 -0
  560. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_entity_life_loop.py +0 -0
  561. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_entity_memory_richness.py +0 -0
  562. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_entity_phase_graph_conformance.py +0 -0
  563. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_entity_react_visit_window.py +0 -0
  564. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_entity_recent_memories.py +0 -0
  565. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_entity_runtime.py +0 -0
  566. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_entity_search_memory.py +0 -0
  567. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_entity_sleep_bound_and_yield_attribution.py +0 -0
  568. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_entity_substrate_resolution.py +0 -0
  569. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_entity_visit_honesty.py +0 -0
  570. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_entity_workspace_cap.py +0 -0
  571. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_entity_workspace_tools.py +0 -0
  572. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_event_index_cross_process.py +0 -0
  573. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_event_wait_index.py +0 -0
  574. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_every_path_bearing_tool_is_walled.py +0 -0
  575. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_evidence_recorder.py +0 -0
  576. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_evidence_recorder_post_policy_envelope.py +0 -0
  577. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_execute_command_output_offload.py +0 -0
  578. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_execution_capability_discovery.py +0 -0
  579. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_explicit_eject_other_clients.py +0 -0
  580. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_factory_default_retry_policy.py +0 -0
  581. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
  582. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_format_repair_nudge.py +0 -0
  583. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_fresh_install_no_provider.py +0 -0
  584. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_gateway_facades_c4899.py +0 -0
  585. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_git_read_only_refiner.py +0 -0
  586. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_hf_process_residency_merge.py +0 -0
  587. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_history_window_multimodal.py +0 -0
  588. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_hot_path_store_reads.py +0 -0
  589. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_indexed_idempotency_lookup.py +0 -0
  590. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_integration_abstractcore.py +0 -0
  591. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_integrations_abstractcore.py +0 -0
  592. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_json_file_run_store_children_index.py +0 -0
  593. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_json_run_cache_bound.py +0 -0
  594. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_json_store_scan_memo.py +0 -0
  595. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_jsonl_ledger_recovery.py +0 -0
  596. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_jsonl_ledger_seq_cross_process.py +0 -0
  597. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_jsonl_row_index.py +0 -0
  598. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_kg_learn_and_recall_contract.py +0 -0
  599. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_ledger_chain.py +0 -0
  600. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_ledger_cursor_invariants.py +0 -0
  601. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_ledger_get_record.py +0 -0
  602. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_ledger_record_slimming.py +0 -0
  603. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_ledger_subscription.py +0 -0
  604. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_live_token_deltas.py +0 -0
  605. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_llm_call_media_artifact_refs.py +0 -0
  606. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
  607. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
  608. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_llm_call_payload_shape_refusal.py +0 -0
  609. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_llm_call_prefix_stability_contract.py +0 -0
  610. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_llm_call_requires_prompt.py +0 -0
  611. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_llm_call_response_schema_normalization.py +0 -0
  612. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_llm_call_structured_output_fallback.py +0 -0
  613. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_llm_call_text_phase_progress.py +0 -0
  614. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_llm_call_truncation_retry_contract.py +0 -0
  615. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_llm_call_use_context_appends_turn.py +0 -0
  616. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
  617. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_llm_client_grounding_tail.py +0 -0
  618. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_llm_client_media_artifacts.py +0 -0
  619. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_llm_client_system_context.py +0 -0
  620. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_llm_client_tool_call_parsing.py +0 -0
  621. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_llm_retry_classification.py +0 -0
  622. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_llm_streaming_on_token.py +0 -0
  623. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_local_helper_tool_exposure.py +0 -0
  624. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_local_residency_host_sweep.py +0 -0
  625. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
  626. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_mail_verbs.py +0 -0
  627. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_mailbox_index.py +0 -0
  628. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_max_iterations_ceiling.py +0 -0
  629. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_mcp_remote_tool_executor.py +0 -0
  630. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_mcp_runs_untrusted_and_facade.py +0 -0
  631. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_mcp_worker_logging.py +0 -0
  632. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_mcp_worker_security.py +0 -0
  633. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_mcp_worker_stdio.py +0 -0
  634. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_media_artifact_resolution.py +0 -0
  635. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_media_capability_default_routing.py +0 -0
  636. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_media_host_endpoint_resolver.py +0 -0
  637. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_media_only_requests_skip_text_client.py +0 -0
  638. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_media_subprocess.py +0 -0
  639. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_memact_composer_from_kg_result.py +0 -0
  640. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_memory_appraise_handler.py +0 -0
  641. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_memory_communities.py +0 -0
  642. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_memory_facade.py +0 -0
  643. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
  644. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_memory_kg_packets.py +0 -0
  645. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_memory_kg_predicate_aliasing.py +0 -0
  646. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_memory_kg_query_packetization_restart.py +0 -0
  647. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
  648. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
  649. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_memory_note_effect.py +0 -0
  650. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_memory_query_effect.py +0 -0
  651. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_memory_query_rich_filters.py +0 -0
  652. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_memory_revise.py +0 -0
  653. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
  654. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_memory_seam_handlers.py +0 -0
  655. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_memory_seam_sqlite_durability.py +0 -0
  656. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_memory_step_provenance.py +0 -0
  657. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_memory_tag_effect.py +0 -0
  658. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_mlx_generation_serialization.py +0 -0
  659. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_mlx_process_residency_merge.py +0 -0
  660. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_model_eject_cancel.py +0 -0
  661. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_model_residency_clean_switch.py +0 -0
  662. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_model_residency_control_plane.py +0 -0
  663. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_model_residency_lock_and_context_estimate.py +0 -0
  664. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_multi_store_scheduler.py +0 -0
  665. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_multimodal_abstractcore_integration.py +0 -0
  666. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_native_mlx_application_wiring.py +0 -0
  667. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_native_mlx_execution_controls_live.py +0 -0
  668. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_native_tool_channel.py +0 -0
  669. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_night_voice.py +0 -0
  670. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_no_default_provider_refusal_ux.py +0 -0
  671. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_occurrence_named_inputs.py +0 -0
  672. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_occurrence_samples.py +0 -0
  673. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_offload_answer_chain_c4978.py +0 -0
  674. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_offloaded_node_traces_report_unknown_not_zero.py +0 -0
  675. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_offloading.py +0 -0
  676. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_packaging_extras.py +0 -0
  677. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_parallel_readonly_tool_execution.py +0 -0
  678. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_pause_resume.py +0 -0
  679. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_pdf_unicode_rendering.py +0 -0
  680. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_personal_cycle.py +0 -0
  681. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_phantom_attachment_index.py +0 -0
  682. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_phase_graph_artifact_control.py +0 -0
  683. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_phase_graph_obedience.py +0 -0
  684. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_phase_vocabulary_migration.py +0 -0
  685. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_pooled_client_strips_construction_cache_key.py +0 -0
  686. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_prompt_cache_export_import.py +0 -0
  687. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_prompt_cache_fingerprint_stability.py +0 -0
  688. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_prompt_cache_modules.py +0 -0
  689. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_prompt_cache_posture_inheritance.py +0 -0
  690. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_prompt_cache_thinking_and_prompt_only.py +0 -0
  691. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_prompt_overlay.py +0 -0
  692. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_provider_endpoint_profile_resolution.py +0 -0
  693. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_provider_pin_routing_isolation.py +0 -0
  694. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_publish_event.py +0 -0
  695. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_queryable_run_store.py +0 -0
  696. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_r12_workspace_sandbox.py +0 -0
  697. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
  698. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_read_idle_threading.py +0 -0
  699. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_readoption_experiment.py +0 -0
  700. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_real_integration.py +0 -0
  701. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_realize_election.py +0 -0
  702. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_recall_levels_policy.py +0 -0
  703. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_remote_client_cancel.py +0 -0
  704. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_remote_llm_client.py +0 -0
  705. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_remote_speculation_defaults.py +0 -0
  706. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_rendering_agent_trace_report.py +0 -0
  707. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_rendering_json_stringify.py +0 -0
  708. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_replay_conformance.py +0 -0
  709. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_replay_conformance_package.py +0 -0
  710. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_replay_cursor_token.py +0 -0
  711. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_replay_delta_cost.py +0 -0
  712. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_replay_invariants.py +0 -0
  713. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_replay_review_findings.py +0 -0
  714. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_replay_tool_policy.py +0 -0
  715. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_report_branding.py +0 -0
  716. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_resident_media_generation.py +0 -0
  717. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_resume_concurrent_same_wait.py +0 -0
  718. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_retry_idempotency.py +0 -0
  719. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_run_history_bundle.py +0 -0
  720. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_run_index_workspace_root.py +0 -0
  721. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_run_mutation_lock.py +0 -0
  722. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_run_origin.py +0 -0
  723. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_run_scoped_tool_policy.py +0 -0
  724. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_run_store_change_token.py +0 -0
  725. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_run_tool_scope_ceiling.py +0 -0
  726. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_runtime_browser_session_boundary.py +0 -0
  727. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
  728. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_runtime_default_provider_model_refresh.py +0 -0
  729. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_runtime_effect_invocation_trace.py +0 -0
  730. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_runtime_health_and_bounded_vars.py +0 -0
  731. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_runtime_install_boundary.py +0 -0
  732. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
  733. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_runtime_node_traces.py +0 -0
  734. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_runtime_start_seeds_tool_support.py +0 -0
  735. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_runtime_tick_step_gate.py +0 -0
  736. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_schedule_run.py +0 -0
  737. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_schedule_v1_corpus.py +0 -0
  738. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_schedule_v2_calendar.py +0 -0
  739. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_scheduler.py +0 -0
  740. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_send_email_refiner.py +0 -0
  741. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_send_email_self_default_policy.py +0 -0
  742. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
  743. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_session_history.py +0 -0
  744. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_session_prompt_cache_attribution.py +0 -0
  745. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_session_prompt_cache_visibility.py +0 -0
  746. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_session_route_stamp.py +0 -0
  747. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_session_start_cost.py +0 -0
  748. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_session_tool_policy.py +0 -0
  749. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_shell_tool_exposure.py +0 -0
  750. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_snapshots.py +0 -0
  751. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_speculation_inheritance.py +0 -0
  752. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_speculation_reaches_provider_construction.py +0 -0
  753. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_sqlite_ledger_store.py +0 -0
  754. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_start_subworkflow_async_wait.py +0 -0
  755. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
  756. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
  757. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_steer_sidecar.py +0 -0
  758. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_step_context.py +0 -0
  759. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_storage_deletion.py +0 -0
  760. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_streamed_voice_namespace.py +0 -0
  761. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_structured_output_schema_enum.py +0 -0
  762. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_subworkflow.py +0 -0
  763. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_terminal_effect_completion.py +0 -0
  764. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
  765. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_thinking_inheritance.py +0 -0
  766. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
  767. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_tool_approval_executor.py +0 -0
  768. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_tool_approval_resume_executes.py +0 -0
  769. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_tool_approval_wait_key_identity.py +0 -0
  770. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_tool_calls_idempotency_keys.py +0 -0
  771. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_tool_catalog.py +0 -0
  772. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_tool_descriptor_registry.py +0 -0
  773. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_tool_executor_argument_sanitization.py +0 -0
  774. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_tool_executor_error_output_detection.py +0 -0
  775. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_tool_executor_filename_alias.py +0 -0
  776. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
  777. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_tool_executor_read_file_aliases.py +0 -0
  778. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_tool_executor_timeout.py +0 -0
  779. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_tool_inventory_facade.py +0 -0
  780. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_tool_invoke_effect.py +0 -0
  781. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_tool_policy_and_mounts.py +0 -0
  782. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_tool_wait_allowlist_safety.py +0 -0
  783. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_topic_election_world_model.py +0 -0
  784. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_trace_context_propagation.py +0 -0
  785. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_trigger_cloudevents.py +0 -0
  786. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_trigger_connection_listening.py +0 -0
  787. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_trigger_connections.py +0 -0
  788. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_trigger_feed.py +0 -0
  789. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_trigger_registry.py +0 -0
  790. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_trigger_schedule_math.py +0 -0
  791. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_trigger_webhook.py +0 -0
  792. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_trusted_run_index.py +0 -0
  793. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_turn_grounding_byte_stability.py +0 -0
  794. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_turn_grounding_carriers_a3.py +0 -0
  795. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_vars_query_effect.py +0 -0
  796. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visit_ab_fixture.py +0 -0
  797. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visit_midturn_elections.py +0 -0
  798. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visit_midturn_resume.py +0 -0
  799. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visit_workflow.py +0 -0
  800. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
  801. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visual_agent_skills_block_passthrough.py +0 -0
  802. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
  803. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
  804. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
  805. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
  806. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visual_entity_memory_nodes.py +0 -0
  807. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visual_flow_end_effect_only_persistence.py +0 -0
  808. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visual_llm_call_partial_override.py +0 -0
  809. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
  810. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visual_loop_back_out_of_body.py +0 -0
  811. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visual_loop_limit_and_list_nodes.py +0 -0
  812. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visual_loop_limit_on_wire.py +0 -0
  813. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visual_memact_compose_node.py +0 -0
  814. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
  815. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
  816. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
  817. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visual_reroute_lowering.py +0 -0
  818. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visual_set_vars_pins.py +0 -0
  819. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visual_unknown_node_type_refuses.py +0 -0
  820. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visual_wait_event_deadline_passthrough.py +0 -0
  821. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visualflow_add_message_builtin.py +0 -0
  822. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
  823. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visualflow_agora_react_agent.py +0 -0
  824. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visualflow_call_tool_node.py +0 -0
  825. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visualflow_capability_routes_and_thinking.py +0 -0
  826. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visualflow_compiler_basic.py +0 -0
  827. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
  828. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visualflow_continue_on_error.py +0 -0
  829. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visualflow_edit_json_schema_node.py +0 -0
  830. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visualflow_event_inbox_react_agent.py +0 -0
  831. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visualflow_file_nodes_workspace.py +0 -0
  832. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visualflow_function_library.py +0 -0
  833. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visualflow_get_element_node.py +0 -0
  834. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visualflow_get_random_element_node.py +0 -0
  835. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visualflow_get_var_node.py +0 -0
  836. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visualflow_has_tools_builtin.py +0 -0
  837. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
  838. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
  839. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visualflow_make_object_node.py +0 -0
  840. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visualflow_media_nodes.py +0 -0
  841. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visualflow_memory_effect_nodes.py +0 -0
  842. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visualflow_memory_source_pins.py +0 -0
  843. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visualflow_pin_expressions.py +0 -0
  844. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visualflow_prompt_only.py +0 -0
  845. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visualflow_random_nodes.py +0 -0
  846. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visualflow_schema_enum_switch.py +0 -0
  847. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visualflow_string_contains_replace.py +0 -0
  848. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_visualflow_tool_parameters_node.py +0 -0
  849. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_voice_library_facade.py +0 -0
  850. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_voice_openai_api_key_path.py +0 -0
  851. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_voice_stream_is_not_a_wait.py +0 -0
  852. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_w4_feelings_lens.py +0 -0
  853. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_wait_event_deadline.py +0 -0
  854. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_wait_event_prompt_metadata.py +0 -0
  855. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_wait_until_streak.py +0 -0
  856. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_wait_until_utc_normalization.py +0 -0
  857. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_workflow_bundle_registry.py +0 -0
  858. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_workspace_builtin_deny.py +0 -0
  859. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_workspace_context_allowed_workspaces.py +0 -0
  860. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_workspace_policy_absolute_reanchor.py +0 -0
  861. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_workspace_policy_allowlist_mode.py +0 -0
  862. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
  863. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
  864. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_workspace_prompt_context.py +0 -0
  865. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_workspace_read_only.py +0 -0
  866. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_workspace_writable_paths.py +0 -0
  867. {abstractruntime-0.15.1 → abstractruntime-0.15.3}/tests/test_write_chart.py +0 -0
@@ -7,11 +7,42 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.15.3] - 2026-10-29
11
+
12
+ ### Fixed
13
+
14
+ - **An index build no longer announces its journal replay as changes** (`JsonFileRunStore`; a 0.15.2 regression).
15
+ 0.15.2's first sync after a build re-applies the journal tail before the build's mark (backlog 0863) and noted every
16
+ replayed record on the change ring: a plain read (`list_run_index`, `warm_session_index`) moved `change_token` and
17
+ `changed_run_ids` then named every run in the tail as changed, so a change-driven consumer re-read every run after
18
+ each build (the gateway's mail notification check loaded all 400 finished runs of its index test on every full
19
+ pass: AbstractGateway backlog 0965, red CI since 0.15.2). Replayed records are still filed into the session,
20
+ children and active indexes (the 0863 guarantee stands). A replay is quiet only when it says nothing new: its file
21
+ was known to the store at the build's mark (the scan memo, the sidecar included) and is unchanged since; a file
22
+ that landed or changed during the build (the record precedes the file, J53-1), a known run now gone, and every
23
+ record after the mark are announced as before, so a consumer whose token already covers the record still learns
24
+ of it; a store with no sidecar announces its first replay (a bounded one-off). Tests:
25
+ `tests/test_json_file_run_store_change_token_after_build.py` (red on 0.15.2).
26
+
27
+ ## [0.15.2] - 2026-10-28
28
+
29
+ ### Fixed
30
+
31
+ - **An index build no longer loses a run another store object creates during it** (`JsonFileRunStore`, backlog 0863).
32
+ A new run's `+` journal line is written before its file is published; a session/children/active index build that
33
+ marked the journal between the two and scanned the folder before the file landed missed the run: the listing until
34
+ the next reconciliation, the session and children indexes for the life of the store object (the reconciliation
35
+ repaired only the listing). Seen as a gateway that answered 404 `session_not_found` when archiving a session written
36
+ while it booted (AbstractGateway backlog 0963); a split-mode runner creating a run during the API process's boot
37
+ hit the same window. The first sync after a build now re-applies the journal's last 16 KiB before the build's mark
38
+ (`JOURNAL_REPLAY_TAIL_BYTES`; idempotent, once per build), and the reconciliation re-files a run it repairs into
39
+ the session and children indexes too (and drops a vanished one from them).
40
+
10
41
  ## [0.15.1] - 2026-10-28
11
42
 
12
43
  ### Changed
13
44
 
14
- - **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 0857. AbstractFlow lets the node take a list once this is released.
45
+ - **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.
15
46
 
16
47
  ## [0.15.0] - 2026-10-28
17
48
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: AbstractRuntime
3
- Version: 0.15.1
3
+ Version: 0.15.3
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,14 +55,27 @@ 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.1 • **Python:** 3.10+
58
+ **Version:** 0.15.3 • **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.3
63
+
64
+ - **A run-store index build no longer announces its journal replay as changes**: a plain read (`list_run_index`,
65
+ `warm_session_index`) leaves `change_token` and `changed_run_ids` untouched, so a change-driven consumer (the
66
+ gateway's mail notification check) no longer re-reads every finished run after each build (a 0.15.2 regression;
67
+ AbstractGateway backlog 0965). A file that landed during the build and a known run that vanished are still announced.
68
+
69
+ ## What's new in 0.15.2
70
+
71
+ - **Run index builds never lose a run created during them**: a run another process (or store object) wrote while
72
+ this store built its indexes is in the session and children indexes and the listing at once (before, the session
73
+ index could miss it for the life of the store object; backlog 0863).
74
+
62
75
  ## What's new in 0.15.1
63
76
 
64
77
  - **Is Empty accepts lists**: nothing, an empty text, or a list or object with no elements is empty (visual-flow
65
- node `is_empty_string`; backlog 0857).
78
+ node `is_empty_string`; backlog 0862).
66
79
 
67
80
  ## What's new in 0.15.0
68
81
 
@@ -4,14 +4,27 @@
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.1 • **Python:** 3.10+
7
+ **Version:** 0.15.3 • **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.3
12
+
13
+ - **A run-store index build no longer announces its journal replay as changes**: a plain read (`list_run_index`,
14
+ `warm_session_index`) leaves `change_token` and `changed_run_ids` untouched, so a change-driven consumer (the
15
+ gateway's mail notification check) no longer re-reads every finished run after each build (a 0.15.2 regression;
16
+ AbstractGateway backlog 0965). A file that landed during the build and a known run that vanished are still announced.
17
+
18
+ ## What's new in 0.15.2
19
+
20
+ - **Run index builds never lose a run created during them**: a run another process (or store object) wrote while
21
+ this store built its indexes is in the session and children indexes and the listing at once (before, the session
22
+ index could miss it for the life of the store object; backlog 0863).
23
+
11
24
  ## What's new in 0.15.1
12
25
 
13
26
  - **Is Empty accepts lists**: nothing, an empty text, or a list or object with no elements is empty (visual-flow
14
- node `is_empty_string`; backlog 0857).
27
+ node `is_empty_string`; backlog 0862).
15
28
 
16
29
  ## What's new in 0.15.0
17
30
 
@@ -12,12 +12,14 @@ If you are new to the project, start with `../README.md` and `../architecture.md
12
12
 
13
13
  ## Counts
14
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
+
15
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).
16
18
 
17
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).
18
20
 
19
21
  - Planned: 34
20
- - Proposed: 16
22
+ - Proposed: 17
21
23
  - Completed: 39
22
24
  - Deprecated: 14
23
25
  - Recurrent: 0
@@ -97,7 +99,8 @@ mtime). The anticipated ADR ("an automation is its controller root run") is not
97
99
 
98
100
  | ID | Item |
99
101
  |----|------|
100
- | 0857 | [Is Empty accepts lists](completed/0857_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). |
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). |
101
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. |
102
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. |
103
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. |
@@ -1,7 +1,7 @@
1
- # 0857 — Is Empty accepts lists (nothing or no elements = empty)
1
+ # 0862 — Is Empty accepts lists (nothing or no elements = empty)
2
2
 
3
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
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
5
  **Cross-package**: AbstractFlow backlog 0160 (operator QA 2026-10-28 item (e)); the Flow editor lets Is Empty take a
6
6
  list only after this is released (branch `fix/is-empty-lists` there).
7
7
 
@@ -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,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,14 +55,27 @@ 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.1 • **Python:** 3.10+
58
+ **Version:** 0.15.3 • **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.3
63
+
64
+ - **A run-store index build no longer announces its journal replay as changes**: a plain read (`list_run_index`,
65
+ `warm_session_index`) leaves `change_token` and `changed_run_ids` untouched, so a change-driven consumer (the
66
+ gateway's mail notification check) no longer re-reads every finished run after each build (a 0.15.2 regression;
67
+ AbstractGateway backlog 0965). A file that landed during the build and a known run that vanished are still announced.
68
+
69
+ ## What's new in 0.15.2
70
+
71
+ - **Run index builds never lose a run created during them**: a run another process (or store object) wrote while
72
+ this store built its indexes is in the session and children indexes and the listing at once (before, the session
73
+ index could miss it for the life of the store object; backlog 0863).
74
+
62
75
  ## What's new in 0.15.1
63
76
 
64
77
  - **Is Empty accepts lists**: nothing, an empty text, or a list or object with no elements is empty (visual-flow
65
- node `is_empty_string`; backlog 0857).
78
+ node `is_empty_string`; backlog 0862).
66
79
 
67
80
  ## What's new in 0.15.0
68
81
 
@@ -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.1
6
+ - Version: 0.15.3
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.1"
7
+ version = "0.15.3"
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,14 @@
1
+ ### Fixed
2
+
3
+ - **An index build no longer announces its journal replay as changes** (`JsonFileRunStore`; a 0.15.2 regression).
4
+ 0.15.2's first sync after a build re-applies the journal tail before the build's mark (backlog 0863) and noted every
5
+ replayed record on the change ring: a plain read (`list_run_index`, `warm_session_index`) moved `change_token` and
6
+ `changed_run_ids` then named every run in the tail as changed, so a change-driven consumer re-read every run after
7
+ each build (the gateway's mail notification check loaded all 400 finished runs of its index test on every full
8
+ pass: AbstractGateway backlog 0965, red CI since 0.15.2). Replayed records are still filed into the session,
9
+ children and active indexes (the 0863 guarantee stands). A replay is quiet only when it says nothing new: its file
10
+ was known to the store at the build's mark (the scan memo, the sidecar included) and is unchanged since; a file
11
+ that landed or changed during the build (the record precedes the file, J53-1), a known run now gone, and every
12
+ record after the mark are announced as before, so a consumer whose token already covers the record still learns
13
+ of it; a store with no sidecar announces its first replay (a bounded one-off). Tests:
14
+ `tests/test_json_file_run_store_change_token_after_build.py` (red on 0.15.2).
@@ -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
@@ -184,6 +188,16 @@ class JsonFileRunStore(RunStore):
184
188
  self._journal_path = self._base / ".runs_created.log"
185
189
  self._journal_lock = threading.Lock()
186
190
  self._journal_offset: Optional[int] = None
191
+ # The journal's size when an index build marked it (`_mark_journal_start`): records
192
+ # before it are REPLAYED by the first sync (filed into the indexes, nothing announced:
193
+ # they predate the build's scan, which already read their files, or are this store's own
194
+ # saves, announced when they happened). Only records after it are changes.
195
+ self._journal_replay_mark: int = 0
196
+ # What this store knew when it marked: {run id: file identity token} from the scan memo
197
+ # (the sidecar included). A replayed record is quiet only for a file known then and
198
+ # unchanged since; anything else (a file that landed or changed during the build, a known
199
+ # run now gone) is announced like any change.
200
+ self._journal_replay_known: Dict[str, tuple] = {}
187
201
  from collections import deque as _deque
188
202
 
189
203
  self._journal_own_appends: Any = _deque(maxlen=8192)
@@ -701,6 +715,7 @@ class JsonFileRunStore(RunStore):
701
715
  self._children_index = children
702
716
  self._run_parent_index = run_parent
703
717
  self._maybe_persist_scan_memo()
718
+ self._sync_indexes() # the journal tail before the mark (`_journal_replay_start`), at once
704
719
 
705
720
  # --- creation journal ------------------------------------------------
706
721
 
@@ -742,10 +757,42 @@ class JsonFileRunStore(RunStore):
742
757
  """Called BEFORE an index's full scan: entries appended from here on
743
758
  are re-applied by `_sync_indexes` (idempotent), so nothing created
744
759
  during the scan is lost."""
760
+ if self._journal_offset is not None:
761
+ return
762
+ self._load_scan_sidecar_once() # the memo as a restarted store knows it, before the snapshot
763
+ with self._scan_memo_lock:
764
+ known = {rid: tuple(v[0]) for rid, v in self._scan_memo.items()}
745
765
  with self._journal_lock:
746
766
  if self._journal_offset is None:
747
767
  size = self._journal_size()
748
- self._journal_offset = size if size is not None else 0
768
+ self._journal_offset = self._journal_replay_start(size) if size is not None else 0
769
+ self._journal_replay_mark = int(size) if size is not None else 0
770
+ self._journal_replay_known = known
771
+
772
+ def _journal_replay_start(self, size: int) -> int:
773
+ """Where the first sync after an index build starts reading: the first record boundary
774
+ within JOURNAL_REPLAY_TAIL_BYTES before `size` (the journal's size at the mark).
775
+
776
+ `_save` appends a new run's `+id` BEFORE publishing its file (J53-1). A build that marks
777
+ the journal at `size` and then scans the folder misses a run whose line is before the
778
+ mark and whose file lands after the scan; re-applying the tail (idempotent: a `+` whose
779
+ file exists is filed, one whose file is still absent stays pending until it appears)
780
+ closes that window. Cost: one read of at most JOURNAL_REPLAY_TAIL_BYTES and one stat per
781
+ record in it, once per build. A record older than the tail is still caught by the
782
+ periodic reconciliation, which re-files what it repairs in every index and logs it."""
783
+ start = max(0, int(size) - int(self.JOURNAL_REPLAY_TAIL_BYTES))
784
+ if start == 0:
785
+ return 0
786
+ try:
787
+ with open(self._journal_path, "rb") as f:
788
+ f.seek(start)
789
+ chunk = f.read(int(size) - start)
790
+ except OSError:
791
+ logger.warning("JsonFileRunStore: creation journal tail unreadable; index build replays nothing before its mark",
792
+ exc_info=True)
793
+ return int(size)
794
+ boundary = chunk.find(b"\n") # records are framed `\n<op><run_id>\n`: start after a newline
795
+ return start + boundary + 1 if boundary >= 0 else int(size)
749
796
 
750
797
  def _sync_indexes(self) -> None:
751
798
  """Apply journal lines appended since the last sync (one stat when
@@ -794,24 +841,57 @@ class JsonFileRunStore(RunStore):
794
841
  return
795
842
  complete = chunk.rfind(b"\n") + 1 # a line still being written waits for the next sync
796
843
  self._journal_offset = offset + complete
844
+ mark = self._journal_replay_mark
797
845
  pending = dict(self._journal_pending)
798
846
  entries = list(pending.items())
799
847
  now = time.time()
800
- for raw in chunk[:complete].decode("utf-8", "replace").splitlines():
848
+ # A record wholly before the build's mark is a replay (0.15.2): it is filed, never
849
+ # announced as a change (`change_token` / `changed_run_ids` stay put: a read that moved
850
+ # them made every change-driven consumer re-read every run after each build, 0.15.3).
851
+ replayed: set = set()
852
+ announced: set = set()
853
+ pos = offset
854
+ for raw_line in chunk[:complete].split(b"\n"):
855
+ line_end = pos + len(raw_line) + 1
856
+ raw = raw_line.decode("utf-8", "replace")
801
857
  op, rid = raw[:1], raw[1:].strip()
802
858
  if op in ("+", "-", "~", "=") and rid:
803
859
  entries.append((rid, (op, now)))
804
- self._apply_journal_entries(entries)
805
-
806
- def _apply_journal_entries(self, entries: Any) -> None:
860
+ (replayed if line_end <= mark else announced).add(rid)
861
+ pos = line_end
862
+ self._apply_journal_entries(entries, quiet=replayed - announced)
863
+ if offset + complete >= mark:
864
+ self._journal_replay_known = {} # the replay is over: later records are all new
865
+
866
+ def _apply_journal_entries(self, entries: Any, *, quiet: Any = frozenset()) -> None:
867
+ """`quiet`: run ids whose records are replays (an index build's tail). A replay is filed
868
+ without a change-ring note only when it says nothing new: its file was known at the mark
869
+ (`_journal_replay_known`) and is unchanged since; a known run now gone IS announced. A file
870
+ that landed or changed during the build (J53-1: the record precedes the file) is announced
871
+ like any change, so a consumer whose token already covers the record still learns of it."""
807
872
  cutoff = time.time() - float(self.STALE_TEMP_AGE_S)
808
873
  for rid, (op, since) in entries:
874
+ note = rid not in quiet
809
875
  p = self._path(rid)
810
876
  exists = p.exists()
877
+ if not note:
878
+ known = self._journal_replay_known.get(rid)
879
+ if exists:
880
+ try:
881
+ unchanged = known is not None and tuple(known) == tuple(self._stat_token(p.stat()))
882
+ except OSError:
883
+ unchanged = False
884
+ note = not unchanged
885
+ else:
886
+ with self._scan_memo_lock:
887
+ in_memo = rid in self._scan_memo
888
+ with self._active_lock:
889
+ in_active = rid in self._active
890
+ note = known is not None or in_memo or in_active
811
891
  if op in ("+", "~", "=") and exists:
812
892
  fields = self._scan_fields(p)
813
893
  if fields is not None:
814
- self._index_fields_into_indexes(rid, fields)
894
+ self._index_fields_into_indexes(rid, fields, note=note)
815
895
  # `~` announces a flip TO active: until the file says so it is
816
896
  # not resolved (the writer's replace may land after its line).
817
897
  # `=` is written AFTER its file was published: one read resolves it.
@@ -819,7 +899,7 @@ class JsonFileRunStore(RunStore):
819
899
  elif op == "-" and not exists:
820
900
  self._drop_from_children_index(rid)
821
901
  self._drop_from_session_index(rid)
822
- self._forget_active(rid)
902
+ self._forget_active(rid, note=note)
823
903
  self._memo_pop(rid)
824
904
  resolved = True
825
905
  elif op == "=":
@@ -832,7 +912,7 @@ class JsonFileRunStore(RunStore):
832
912
  else:
833
913
  self._journal_pending[rid] = (op, since)
834
914
 
835
- def _index_fields_into_indexes(self, rid: str, fields: Dict[str, Any]) -> None:
915
+ def _index_fields_into_indexes(self, rid: str, fields: Dict[str, Any], *, note: bool = True) -> None:
836
916
  parent = fields.get("parent_run_id")
837
917
  parent = str(parent) if parent else None
838
918
  with self._index_lock:
@@ -845,7 +925,7 @@ class JsonFileRunStore(RunStore):
845
925
  if self._session_index is not None and sid:
846
926
  self._session_index.setdefault(sid, {})[rid] = fields.get("session_kind")
847
927
  self._run_session[rid] = sid
848
- self._note_active_status(rid, fields.get("status"))
928
+ self._note_active_status(rid, fields.get("status"), note=note)
849
929
 
850
930
  def warm_session_index(self) -> None:
851
931
  """Build the session and children indexes now (host boot), so the
@@ -880,6 +960,7 @@ class JsonFileRunStore(RunStore):
880
960
  self._session_index = index
881
961
  self._run_session = by_run
882
962
  self._maybe_persist_scan_memo()
963
+ self._sync_indexes() # the journal tail before the mark (`_journal_replay_start`), at once
883
964
 
884
965
  def _update_session_index_on_save(self, run: RunState) -> None:
885
966
  rid = str(run.run_id)
@@ -1236,24 +1317,37 @@ class JsonFileRunStore(RunStore):
1236
1317
  e = self._active[rid] = _ActiveEntry()
1237
1318
  return e
1238
1319
 
1239
- def _note_active_status(self, rid: str, status: Any) -> None:
1320
+ def _note_active_status(self, rid: str, status: Any, *, note: bool = True) -> None:
1240
1321
  """Record what a save, a journal line or a verified read says about a
1241
1322
  run. Always recorded (before the first build too): a scan in progress
1242
1323
  merges by generation, a build not yet started reads disk truth and
1243
- reconciles these notes with it."""
1324
+ reconciles these notes with it.
1325
+
1326
+ `note=False` (a replayed journal record, `_apply_journal_entries`): the
1327
+ membership is kept right, but nothing is announced: no sequence bump,
1328
+ no change-ring entry, so `change_token` does not move for a read."""
1244
1329
  if not rid:
1245
1330
  return
1246
1331
  with self._active_lock:
1332
+ existed = rid in self._active
1247
1333
  e = self._active_entry(rid)
1334
+ active = self._is_active_status(status)
1335
+ if not note and (not existed or e.active == active):
1336
+ # A replay of a file known at the mark and unchanged since: filed, not announced
1337
+ # (an existing entry whose active flag FLIPS is a change, announced below).
1338
+ e.active = active
1339
+ return
1340
+ e.active = active
1248
1341
  self._active_seq += 1
1249
1342
  e.gen = self._active_seq
1250
- e.active = self._is_active_status(status)
1251
1343
  self._change_ring.note(self._active_seq, rid)
1252
1344
 
1253
- def _forget_active(self, rid: str) -> None:
1345
+ def _forget_active(self, rid: str, *, note: bool = True) -> None:
1254
1346
  """The run is gone (deleted here, or a `-id` line): drop its record."""
1255
1347
  with self._active_lock:
1256
1348
  self._active.pop(rid, None)
1349
+ if not note:
1350
+ return
1257
1351
  self._active_seq += 1
1258
1352
  self._change_ring.note(self._active_seq, rid)
1259
1353
 
@@ -1324,6 +1418,7 @@ class JsonFileRunStore(RunStore):
1324
1418
  t0 = time.monotonic()
1325
1419
  settled_ns = time.time_ns() - int(float(self.RUN_INDEX_IN_FLIGHT_S) * 1e9)
1326
1420
  repaired: List[str] = []
1421
+ refile: Dict[str, Dict[str, Any]] = {}
1327
1422
  found: set[str] = set()
1328
1423
  seen: set[str] = set()
1329
1424
  for p in self._base.glob("run_*.json"):
@@ -1341,6 +1436,8 @@ class JsonFileRunStore(RunStore):
1341
1436
  cur_tok = tuple(cur[0]) if cur is not None else None
1342
1437
  if cur_tok is not None and cur_tok != prev_tok and cur_tok[0] < settled_ns:
1343
1438
  repaired.append(rid)
1439
+ if fields is not None and rid:
1440
+ refile[rid] = fields
1344
1441
  if fields is None:
1345
1442
  continue
1346
1443
  if self._is_active_status(fields.get("status")):
@@ -1349,6 +1446,13 @@ class JsonFileRunStore(RunStore):
1349
1446
  self._sync_indexes()
1350
1447
  dropped = self._scan_memo_prune(seen)
1351
1448
  if complete:
1449
+ # A run the session/children indexes missed (gateway backlog 0963) is re-filed there
1450
+ # too, not only in the memo and the active set; a vanished one leaves them.
1451
+ for rid, fields in refile.items():
1452
+ self._index_fields_into_indexes(rid, fields)
1453
+ for rid in dropped:
1454
+ self._drop_from_children_index(rid)
1455
+ self._drop_from_session_index(rid)
1352
1456
  repaired.extend(dropped)
1353
1457
  self._note_reconcile(repaired, files=len(seen), seconds=time.monotonic() - t0)
1354
1458
  return found